目录
一、概况
在上一篇文章中,我们通过添加fifo解决了防止数据和命令丢失的问题。但是引入了很多的端口信号,这导致使用的时候不是很方便,所以在该篇文章中我们设计两个模块,分别是“用户写控制”和“用户读控制”模块,来减少端口信号。
二、实现方法
(一)用户写控制模块
1.该模块的设计框架如图2-1所示,左边的信号是输入信号,右边的信号是输出信号,供上篇文章的fifo使用。
2.设计思路:先输入数据wr_data和写使能wr_en,打一拍后作为“写数据fifo”的使能和数据输入;当输入的数据结束时候(p2_wr_en拉低),我们产生“写命令fifo”的写使能p2_cmd_en;当“写数据fifo”里面的数据全部被写入到DDR3里面的时候,p2_wr_empty信号会拉高,此时我们产生user_wr_end信号;
3.注意:
(1)p2_wr_empty 是由“写数据fifo”读出端的“ui_clk”产生的,而我们这里用的是用户时钟,属于跨时钟域;所以在p2_wr_empty输入到本设计要实现的用户写控制模块中后,要打两拍才可以用。因为打两拍后跨时钟域使用产生亚稳态的可能足够低了。
(2)注意这里的P2_cmd_addr是起始地址,不能一直是零,要给出递增,增量设置为512,因为我们数据是128bit,ddr3的数据位宽为16bit,所以写入128bit数据ddr3的地址要增加8,而我们设计一次性写入64个128bit的数据,所以每写一次,ddr3的地址增加64*8=512。
(二)用户读控制模块
1.该模块的设计框架如图2-2所示。
2.设计思路:在输入的rd_start信号有效时,,给出“读命令fifo”所需的使能信号、突发长度、命令和地址信号,然后当“读数据fifo”里面存够一定数量的数据(p1_rd_count),给出“读数据fifo”的读使能p1_rd_en;当读出的数据满足本次突发的数据时,拉低p1_rd_en,并且产生user_rd_end信号。
3.两个模块都应该注意起始地址和终了地址应该在编写模块代码中就给出。