FPGA读写SDRAM实验

本文详述了使用FPGA进行SDRAM读写实验的过程,包括实验环境、硬件和软件配置。实验中,通过PLL生成时钟,使用数据地址发生器和FIFO作为缓冲区进行读写操作。数据从FPGA写入SDRAM后,通过串口控制器传回PC。SignalTap逻辑分析仪用于观察时序。实验结果显示,由于Read Latency设置,数据在读命令后两个时钟周期内被正确读取。最后,提供了工程文件和串口助手的使用步骤。
摘要由CSDN通过智能技术生成

FPGA读写SDRAM实验



众所周知,片上RAM是FPGA的宝贵资源。对于一些低端的FPGA芯片,其片上RAM实在是少的可怜,甚至不能存下一张图片。若要用FPGA实现图像处理,显然需要外部存储器。

而在外部存储器中,SDRAM的特点是速度快,价格低,但时序复杂。今天,主要介绍的就是使用FPGA读写SDRAM的实验。

文章最后,将会给出所有代码,代码均经过详细注释。羡慕


我之前的BLOG写过SDRAM的写过程仿真,如果对SDRAM的原理以及时序,命令等不熟悉的朋友,请参考我之前的BlogSDRAM仿真



---------------------------------------------华丽分割-----------------------------------------------


实验环境:

  • 硬件环境:
  • FPGA:Cyclone II 系列
  • FPGA片上RAM: 160000+bit
  • SDRAM: 4 Banks x 1M x 16Bit , 100Mhz

Cyclone10 FPGA读写MP25P16 spiflash实验Verilog源码Quartus17.1工程文件+文档资料,, FPGACYCLONE10LP系列中的10CL025YU256C8. 完整的Quartus工程文件,可以做为你的学习设计参考。 module spi_flash_top( input sys_clk, input rst, output nCS, output DCLK, output MOSI, input MISO, input[15:0] clk_div, input[3:0] cmd, input cmd_valid, output cmd_ack, input[23:0] addr, input[7:0] data_in, input[8:0] size, output data_req, output reg[7:0] data_out, output reg data_valid ); localparam S_IDLE = 0; localparam S_SE = 1; localparam S_BE = 2; localparam S_READ = 3; localparam S_WRITE = 4; localparam S_ACK = 5; localparam S_CK_STATE = 6; //present state monitor localparam S_WREN = 7; wire spi_flash_cmd_ack; reg[3:0] sub_cmd; reg sub_cmd_valid; reg[8:0] sub_size; reg[4:0] state,next_state; reg[7:0] state_reg; wire sub_data_valid; wire[7:0] sub_data_in; wire[7:0] sub_data_out; assign sub_data_in = data_in; assign cmd_ack = (state == S_ACK); always@(posedge sys_clk or posedge rst) begin if(rst==1) state <= S_IDLE; else state <= next_state; end always@(*) begin case(state) S_IDLE: if(cmd_valid && cmd == `CMD_BE) next_state <= S_WREN; else if(cmd_valid && cmd == `CMD_SE) next_state <= S_WREN; else if(cmd_valid && cmd == `CMD_READ) next_state <= S_READ; else if(cmd_valid && cmd == `CMD_PP) next_state <= S_WREN; else next_state <= S_IDLE; S_WREN: if(spi_flash_cmd_ack && cmd == `CMD_BE) next_state <= S_BE; else if(spi_flash_cmd_ack && cmd == `CMD_SE) next_state <= S_SE; else if(spi_flash_cmd_ack && cmd == `CMD_PP) next_state <= S_WRITE; else next_state <= S_WREN; S_BE: if(spi_flash_cmd_ack) next_state <= S_CK_STATE;//读取状态寄存器 else next_state <= S_BE; S_SE: if(spi_flash_cmd_ack) next_state <= S_CK_STATE;
评论 34
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值