FPGA读写SDRAM实验
2012-05-09 14:04
429 查看
FPGA读写SDRAM实验
众所周知,片上RAM是FPGA的宝贵资源。对于一些低端的FPGA芯片,其片上RAM实在是少的可怜,甚至不能存下一张图片。若要用FPGA实现图像处理,显然需要外部存储器。
而在外部存储器中,SDRAM的特点是速度快,价格低,但时序复杂。今天,主要介绍的就是使用FPGA读写SDRAM的实验。
文章最后,将会给出所有代码,代码均经过详细注释。
我之前的BLOG写过SDRAM的写过程仿真,如果对SDRAM的原理以及时序,命令等不熟悉的朋友,请参考我之前的Blog:SDRAM仿真
---------------------------------------------华丽分割-----------------------------------------------
实验环境:
硬件环境:
FPGA:Cyclone II 系列
FPGA片上RAM:
160000+bit
SDRAM: 4 Banks x 1M x 16Bit , 100Mhz
软件环境:
Win7-64bit
QutartusII 11.0版本(支持中文,故所有代码都是中文注释,9.0版本看可能会乱码)
串口调试助手
Signaltap逻辑分析仪
---------------------------------------------华丽分割-----------------------------------------------
实验框图:
PLL产生三路时钟,分别为100MHZ,100MHZ(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.从串口调试助手看数据
点此下载
感谢您的阅读,如有错误,请指出,不胜感激。
众所周知,片上RAM是FPGA的宝贵资源。对于一些低端的FPGA芯片,其片上RAM实在是少的可怜,甚至不能存下一张图片。若要用FPGA实现图像处理,显然需要外部存储器。
而在外部存储器中,SDRAM的特点是速度快,价格低,但时序复杂。今天,主要介绍的就是使用FPGA读写SDRAM的实验。
文章最后,将会给出所有代码,代码均经过详细注释。
我之前的BLOG写过SDRAM的写过程仿真,如果对SDRAM的原理以及时序,命令等不熟悉的朋友,请参考我之前的Blog:SDRAM仿真
---------------------------------------------华丽分割-----------------------------------------------
实验环境:
硬件环境:
FPGA:Cyclone II 系列
FPGA片上RAM:
160000+bit
SDRAM: 4 Banks x 1M x 16Bit , 100Mhz
软件环境:
Win7-64bit
QutartusII 11.0版本(支持中文,故所有代码都是中文注释,9.0版本看可能会乱码)
串口调试助手
Signaltap逻辑分析仪
---------------------------------------------华丽分割-----------------------------------------------
实验框图:
PLL产生三路时钟,分别为100MHZ,100MHZ(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.从串口调试助手看数据
点此下载
感谢您的阅读,如有错误,请指出,不胜感激。
相关文章推荐
- 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验十九:SDRAM模块② — 多字读写
- 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验二十一:SDRAM模块④ — 页读写 β
- 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验二十二:SDRAM模块⑤ — FIFO读写
- 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验二十:SDRAM模块③ — 页读写 α
- 【iCore3 双核心板_FPGA】实验二十四:Niosii——SDRAM读写实验
- 【iCore3 双核心板_FPGA】实验二十六:SDRAM读写测试实验
- 【iCore1S 双核心板_ARM】例程十七:FSMC实验——读写FPGA
- nios ii小实验——SDRAM读写
- 【iCore3 双核心板】例程二十八:FSMC实验——读写FPGA
- 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验十八:SDRAM模块① — 单字读写
- 基于FPGA的PCIE总线实现PC与SDRAM的数据读写过程
- 【iCore4 双核心板_ARM】例程三十七:SDRAM实验——读写SDRAM
- 【iCore3 双核心板_FPGA】实验二十七:基于SDRAM的TFT驱动器的设计
- 【连载】【FPGA黑金开发板】NIOS II那些事儿--SDRAM实验(十二)
- FPGA之驱动sdram控制兼容性移植实验
- 【iCore4 双核心板_ARM】例程二十八:FSMC实验——读写FPGA
- 一路艰辛调试特权同学Verilog读写SDRAM实验,终于通了。
- 基于FPGA的SDRAM通用读写软IP
- 【iCore3 双核心板_FPGA】实验二十八:基于SDRAM 的VGA 驱动器的设计
- 【iCore系列核心板视频教程】之 SDRAM 读写实验