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

  • 软件环境:
  • Win7-64bit
  • QutartusII 11.0版本(支持中文,故所有代码都是中文注释,9.0版本看可能会乱码
  • 串口调试助手
  • Signaltap逻辑分析仪

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

实验框图:





  • PLL产生三路时钟,分别为100MHZ100MHZ(72度相角)20MHZ
  • 数据地址发生器用于产生写入SDRAM的数据以及对应的地址
  • 写入FIFO作为写SDRAM时的数据缓冲区
  • 读出FIFO作为读SDRAM时的数据缓冲区
  • 最终数据通过“读出FIFO”进入串口控制器然后传回PC机上的串口调试助手


实验过程:

  • 为了方便看读写的结果,且考虑到CycloneII芯片上RAM资源较少,我只写入4次数据然后读出。

  • 由于写入数据时选择的突发长度为8,SDRAM位宽为16bit,也就是说一共写入了64字节的数据。即0x0000,0x0001,0x0002......0x001F

  • 还是由于RAM较少,我观察逻辑分析仪时只看数据总线的低8位,即0x00,0x01,...0x1F

  • 由于整个过程在程序烧写后立刻执行,而且几乎是瞬间结束,所以请将SignalTap工作于Power-Up Trigger模式


下面是逻辑分析仪看到的波形:



可以看到写入了4次,读取了7次。这里我没控制读的次数。不过可以验证SDRAM已经正确的读写了。



下面是第一次写入时的波形 注意看“写入命令”时对应的地址值为0x400,表面向地址0中写入数据0x0000,由于突发长度为8,将连续写8次




第二次写入时的波形, 可见地址变成了0x408,为什么是408而不是008呢?请参考我以前的博客。





最后贴一张读取的波形:
  • 第一次读的时候是从地址0开始读的。读出来后放到读出FIFO中,然后经过串口发出。
  • 由于Read Latency设置为2,可以看到在读命令后(cas_n为0)两个时钟周期,数据总线的低8位由1FH变成了00H
  • 然后 rdf_use信号增加,说明数据被写入了“读出FIFO"中。
  • tx_start信号为1表示串口启动啦!
  • 最后一行work-state是SDRAM的状态机,具体可以参考源码中的定义。
  • 由于串口的波特率设置为9600,很慢的说,所以无法从SignalTap中看到串口读出数据的全过程。不过我们有串口小助手。


通过查看串口调试小助手,发现数据真的被读了出来:
(我没有控制好读出的次数。。不过可以看到,数据确实是对的。)


若您无串口调试助手,也不影响观察实验结果,直接看逻辑分析仪即可。 因为本实验最主要的目的是数据总线sdram_data[15:0]在读命令后出现正确的数据。

----------------------------------------------------------
本实验的源码下载:
源码使用:
  • 1.直接打开工程文件:sdr_test.qpf
  • 2.根据您的目标板配置引脚,若您使用的是黑金开发平台CycloneII版本则无需配置(本实验使用SDRAM工作频率为100MHZ,位宽16位,使用时请校对您的SDRAM芯片,必要时需要对代码进行修改
  • 3.编译工程
  • 4.打开串口调试助手(串口号查设备管理器),设置波特率9600,设置观察16进制数据
  • 5.打开SignalTap文件:stp1.stp(已经设置为上电运行模式)
  • 6.烧写程序到FPGA(JTAG模式)
  • 7.运行SignalTap看波形
  • 8.从串口调试助手看数据



感谢您的阅读,如有错误,请指出,不胜感激。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FPGA读写SDRAM read_write_a_worde实验完整Verilog逻辑源码Quartus工程文件, Quartus软件版本11.0, FPGA型号为CYCLONE4E系列中的EP4CE6E22C8,可以做为你的学习设计参考。 `timescale 1 ns/ 1 ps // synopsys translate_on module sdram_top( clk, reset_n, sdram_bank_addr, write_data, read_data, read_req, write_req, rw_ack, bus_signal, init_done, sdram_clk, sdram_data, sdram_command, sdram_address, sdram_dqm ); // 系统信号 input clk; //20M系统时钟 input reset_n; //复位信号,低电平有效 // 内部信号 input [21:0] sdram_bank_addr; //读写SDRAM的地址 input [15:0] write_data; //写如sdram的数据 output [15:0] read_data; //从sdram读出的数据 input read_req; //读数据请求信号 input write_req; //写数据请求信号 output rw_ack; //读写应答信号 output bus_signal; //忙信号 output init_done; //初始化完成信号,输出,高电平有效 // SDRAM接口信号 output sdram_clk; //sdram时钟信号 inout [15:0] sdram_data; //sdram读写数据 output [4:0] sdram_command; //cke、cs_n、ras、cas_n、we_n,SDRAM指令信号 output [13:0] sdram_address; //[13:12]BA , [11:0]Addr,SDRAM地址信号 output [1:0] sdram_dqm; //SDRAM数据掩码 //连接线 wire init_start; //初始化开始信号,高电平有效 wire [4:0] sdram_init_command; //cke、cs_n、ras、cas_n、we_n,SDRAM指令信号 wire [4:0] sdram_rw_command; //cke、cs_n、ras、cas_n、we_n,SDRAM指令信号 wire [13:0] sdram_init_address; //[13:12]BA , [11:0]Addr,SDRAM地址信号 wire [13:0] sdram_rw

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值