Skip to content

lauchinyuan/FPGA_DDR3_Ctrl

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

28 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

关于

本项目在Xilinx FPGA平台上实现了对DDR3 SDRAM读写操作,并通过RS232串口将图像数据存到SDRAM存储器,接着读取存储数据内容,并通过HDMI音视频接口实现图像/视频显示,其中DDR3读写控制器是AXI总线接口从机。

其它版本
  • non_fifo_ip branch提供了不使用FIFO IP核的实现方案,即利用自行设计的异步FIFO模块,取代FIFO IP核,实测其部署后的资源开销更小。

  • sd_ddr_hdmi branch提供了从SD卡读取数据到SDRAM的工程版本。

  • multi_channel branch实现了多通道读取SDRAM地址,并在一个屏幕上显示读取图像的简单示例,设计了读写控制逻辑及简单的通道读写仲裁器。

若您想复现该工程,请先阅读本文最后一段,有任何问题欢迎您通过lauchinyuan@yeah.net联系我,一起探讨学习。

FPGA上板实验的效果如图1-3所示,硬件实验平台使用的是博宸精芯Kintex-7基础板开发板,芯片型号为XC7K325T-2FFG676,在其它硬件平台上复现该工程时,应注意更改约束文件中的管脚约束,同时MIG IP核也应该依据所用硬件平台的SDRAM型号进行相应更改。

图1. 演示1

图2. 演示2

图3. 演示3(视频播放)

图4. 演示4(多通道读取)

更新说明

2023/11/23: 更改了MATLAB脚本生成文件的逻辑,将图像/视频像素数据直接以二进制的形式写入txt文本,这一文本文件可以直接通过串口调试助手发送,更实用。

2023/12/30:新增多通道读写机制,设计了多通道读写仲裁控制机制,可以实现图像/视频的多通道读取,相关代码在multi_channel

仓库内容简介

本仓库提供了所有模块的Verilog 代码,其中比较关键的模块是AXI写主机AXI读主机AXI控制器,这三个模块加上AXI总线 DDR3 MIG IP核,构成了DDR3读写接口

testbench目录提供了几乎所有子模块的仿真测试文件,wave目录下提供了本工程子模块的简要波形示意图,配合波形图将有助您理解本工程的设计细节

xci目录存放了项目中用到的所有IP核文件配置信息,在Vivado中作为source添加即可,其中rgb2dvi IP核使用Digilent开源IP核,需要在Vivado上添加IP核仓库。

图像数据处理方面, matlab目录提供了将图像转换为16进制像素值txt文件的MATLAB脚本。而img文件夹则是一些测试图像文件,txt文件夹是转换后的数据文本文件, 可以通过串口发送。

数据流&框图

本项目的结构示意图如图5

图5. 系统框图

处理数据的流程具体说明如下:

  1. RS232串口接收上位机发送的图像像素数据。
  2. 像素数据存到"写FIFO"中,进行缓存。
  3. "写FIFO"中的数据数量满足设定值,向AXI写主机发送写数据请求。
  4. AXI写主机收到写请求,发起AXI总线写动作,将数据发送到AXI从机(DDR3 MIG IP核)。
  5. AXI从机将AXI总线上送来的数据转换为DDR3 SDRAM物理接口时序,将数据写入SDRAM中。
  6. VGA模块依据VGA时序,在需要输出图像数据时,向"读FIFO"模块发出读请求,并获得“读FIFO”内存储的数据,而当“读FIFO”内数据不够时,向“AXI读主机“发送读请求。收到请求后“AXI读主机“发起AXI读操作,从AXI从机(DDR3 MIG IP核)处获取SDRAM中存储的数据。其中DDR3 MIG IP核将解析AXI总线协议,并转换为DDR3的读时序,从SDRAM读取数据。
  7. VGA模块获得数据,并生成VGA时序。
  8. 通过rgb2dvi IP核将VGA时序转换为HDMI TMDS时序,通过HDMI接口将图像输出到屏幕上。

复现需注意!

  1. 若您想测试通过在线逻辑分析仪(ILA), 简单分析ddr读写功能,而不进行图像显示,请将ddr3_test模块置为顶层,并将ddr3_test.xdc设置为target约束文件。否则顶层模块是uart_ddr_hdmi,约束文件为uart_ddr_hdmi.xdc

  2. 图像显示使用RGB888格式,为了可以在一个时钟周期内得到一个像素数据,实际上从“读FIFO”中获取的数据位宽为32bit, 数据从高到低分别为R、G、B、0 ,最低位舍去。

  3. 为了正确显示图像,顶层模块中设置的的读写地址空间parameter应该与所显示图像分辨率相匹配,例如显示分辨率为1280*960,则寻址空间范围应该是 1280 × 960 × 4 = 4915200(如2, 每一个像素实际上的存储空间是32bit,即4Byte)。进行视频输出时,寻址范围设置为这个值的帧数倍,例如显示60帧,则上面例子中寻址空间范围为4915200×60。

  4. 更改图像分辨率,请在vga_ctrl模块更改parameter, 注意要更改时钟生成IP核(clk_gen)的时钟频率(clk_fifo及clk_hdmi), clk_fifo即vga时序的像素时钟,其中hdmi时钟频率和vga时钟频率要保持5:1的关系,更改频率后,也要注意更改顶层模块定义的FREQ parameter。

有任何问题欢迎联系我(●ˇ∀ˇ●)

About

An AXI DDR3 SDRAM controller for FPGA

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published