xilinx FPGA DDR3 IP核(VHDL&VIVADO)(用户接口)

本篇只讲用户接口不讲AIX4接口

关于ddr3的介绍网上有很多,用通俗一点的语言来形容,就是fpga开发板里面的大容量存储单元,因为平时可能就直接用rom或者fifo就好了,但是资源是有限的,就可以用ddr来代替。其实ddr3跟ram很相似,就是有读写地址,然后可以读写相应的数据。

然后最大的区别就是ddr3的ip核是分物理层和用户侧的,我们只需要应用用户侧的的引脚就好。

下图是用户接口的示意图:

正在上传…重新上传取消正在上传…重新上传取消

然后是建立ip核:

  1. 可以看到器件型号和硬件语言是不是自己工程想要的,如果不是可以cancel,回到setting里面重新设置(如果只是仿真则无所谓,如果是板卡验证就要选择正确)

正在上传…重新上传取消正在上传…重新上传取消

  1. 只有verilog才可以选择AXI4接口,其他按下图选择:

正在上传…重新上传取消正在上传…重新上传取消

  1. 目标器件默认为已选器件:

正在上传…重新上传取消正在上传…重新上传取消

  1. 选择DDR3:

正在上传…重新上传取消正在上传…重新上传取消

  1. 下面是一个重要环节,关于DDR3的时钟设置

PS:先讲一下ddr3芯片的型号,例如:MT41J128M16XX-125,其中16是指位宽,就可以算出其容量(也就是不读能写入的最大数据量)128M*16bit=1024MByte;125是指tck=1.25ns,也就是最大的IO时钟频率是1/1.25ns=800MHZ(DDR3的频率);那么传输速率就是2*800=1600Mbit/s(因为是双时钟沿传输);那么带宽(16根数据线的传输速率)1600Mbit/s*16=25600Mbit/s=3.125GBbit/s

在ddr3当中,有两个时钟,参考时钟(200MHZ)和系统时钟,所以当系统时钟是200MHZ时,就可以用同一个时钟了。(也就是说要使用ddr3,需提供这两个时钟,一般都是有FPGA的开发板将晶振的时钟pll倍频之后再给ddr3,所以我们可以都使用200MHZ,就只需要一个pll倍频时钟即可。另外在ip核配置时,对于系统时钟的来源就可以选择no buffer,因为来自fpga的pll倍频,而不是单独的时钟源输入,那么参考时钟就可以选择用系统时钟,此处的系统时钟是指ddr3 ip核的系统时钟)

在ddr3的mig IP核当中会产生三个时钟,第一个就是clk_period:

正在上传…重新上传取消正在上传…重新上传取消

正在上传…重新上传取消正在上传…重新上传取消

6.

正在上传…重新上传取消正在上传…重新上传取消

正在上传…重新上传取消正在上传…重新上传取消

7.

正在上传…重新上传取消正在上传…重新上传取消

正在上传…重新上传取消正在上传…重新上传取消

8.

正在上传…重新上传取消正在上传…重新上传取消

正在上传…重新上传取消正在上传…重新上传取消

正在上传…重新上传取消正在上传…重新上传取消

最后一直next即可

正在上传…重新上传取消正在上传…重新上传取消

片选信号(Controller Chip Select Pin)设置为 Enable,即使用该引脚,实际开发板的

DDR3 的 CS 信号有连接到 FPGA 管脚,所以这里需要使用该引脚。如果硬件上 DDR3

管脚未连接到 FPGA,那么这里就可以设置为 Disable。

参考时钟(Reference Clock):该时钟需要频率为 200MHz 时钟,由于在前面配置中将

系统时钟设置为 200MHz,所以可以选择 Use System Clock,这样就可以将两个输入

时钟合并一个共用的 200MH 输入。如果前面的系统时钟设置的不是 200MHz 这里配

置选项就没有“Use System Clock”可选,只能由管脚端口输入时钟或者 FPGA 内部产

生这个 200MHz 时钟。

sys_rst 是 IP 的系统复位输入信号,低电平复位

实验二:因为ddr3的位宽比较大,需要两端各加一个fifo来进行时钟和位宽的转换

那么就是将数据先写进fifo0(只要fifo0没有满就可以一直写),然后将fifo0的数据读进ddr3(改fifo使用FWFT模式,也就是rd_en和fifo_dout同时有效,将rd_en和ddr3的写使能信号连接),然后将ddr3的数据读出并写入到fifo1(在fifo1没满之前一直写,将ddr3的读出数据和读出数据有效信号和fifo1的写数据和写使能分别连接),后面就可以根据读出数据时序,在fifo1没空的时候读数据(这里就是只要fifo1没空就一直读)

下面是ILA抓取的时序图:

可以看到,在ddr3初始化成功之后,对fifo0写入递增数据(1——50)

正在上传…重新上传取消正在上传…重新上传取消

在app_en,app_rdy,app_wdf_rdy都有效时,且fifo0的empty=0的时候,使能fifo0的rd_en

和ddr的app_wdf_wren就可读出fifo0的数据到app_wdf_data,下图可以看到在地址为0的时候,写入了0001.....0008,因为除了地址,其他使用的是组合逻辑,所以跟时钟就对不齐

正在上传…重新上传取消正在上传…重新上传取消

可以看到ddr3读出的第一个数就是写进地址0的数据

正在上传…重新上传取消正在上传…重新上传取消

可以看到fifo1读出的第一个数据是1(这是因为fifo1用的是标准模式,那么读出的数据会比读使能延迟一个时钟周期)

正在上传…重新上传取消正在上传…重新上传取消

猜你喜欢

转载自blog.csdn.net/qq_43811597/article/details/127898103