ddr3 mig使用时app_rdy的疑问
大家怎么设计mig的状态机?直接assign app_en=app_rdy是否可行?
xlinx的资料应该有说明的,我记得叫UG406, 上面有app接口的总线时序,按上面的来就行。
app_rdy可以在置个高期间app_en处于无效状态,此时的地址并不会存到命令FIFO当中去。自己在设计当中发现应该是命令FIFO和数据FIFO两者之间会有一个交互过程:即当命令FIFO写入太多而数据写入少时就会置低app_rdy来停止写命令操作等待写数据,反之置低app_wr_rdy来等待写命令。自己采用每8个128位数据写入后同步一下写命令个数和写数据个数得到的测验结果是app_wr_rdy一直处于有效状态,也就是说数据和命令保持基本同步是可以一直想ddr3中不断的写数据。
明白你的意思,就是流水线操作命令和数据FIFO,不过仿真时发现app_wdf_rdy可以一直保持为高,而app_rdy时高时低,也许是命令FIFO的深度太浅。不过没有持续写入数据的需求,只需要检测到app_rdy有效时能立即写入,但如果app_rdy只有一个clk的话肯定做不到。
用组合逻辑来做,不要用时序逻辑产生app_en信号
我把读和写时的地址与数据保持同步,然后在读写之间来回跳转,这样可以连续操作而app_rdy保持为高吗?
nod,现在就是把app_en和app_rdy通过组合逻辑条件选通的
并不是单纯的用assign语句来选通app_en,我觉得应该放在状态机里,用状态机的 写数(进ddr3) 或者读数(出ddr3) 这些状态来选通app_en,但请注意,这个app_en选通输出要放在状态机组合逻辑输出中,不要放在clk下;这样才能用app_rdy输出正确的app_en信号
组合逻辑的状态机?怎么个写法,always@(*)吗?请赐教~
状态转移用时序逻辑写always@(posedge @clk),而状态输出(仅app_en逻辑相关的)用组合逻辑always@(state)写,地址相关的还是用时序逻辑always@(posedge @clk)来做,当然这样的状态机单段式肯定完成不了的,需要写成多段式的才行。
状态转移用时序逻辑写always@(posedge @clk),而状态输出(仅app_en逻辑相关的)用组合逻辑always@(state)写,地址相关的还是用时序逻辑always@(posedge @clk)来做,当然这样的状态机单段式肯定完成不了的,需要写成多段式的才行。
恩,我一般都用多段式。明白,你的意思是addr和data还是用时钟打拍,en用组合逻辑与rdy绑定。但是我发现mig在读写之间不停切换的话app_rdy的高脉宽很短且无规律,mig的效率很低,与一直读或者写相比差得多,感觉后者能有90%,前者最多40%,遇到过这种问题吗?
读写切换,尽量维持写(或读)操作一定长度的数据(KB级别的数据传输长度),完了之后再切换另外种模式,应该会满足带宽需求,试试看行否。我一般是这样来做的
我现在的需求是写20个CLK左右就得切到读,带宽利用率很低。连续读写kb级别就是说至少要连读或连写16个数据包(BL=8)才能提高带宽利用率对吧?如果用AXI4接口的MIG呢,能否不用连续操作而提高利用率?
在20个clk内,要保证定长数据完全写入确实需要好好设计下状态机。如果板子在设计的时候,多片ddr地址线是独立的话,可以考虑例化多个MIG控制盒,乒乓操作,写core0的时候可以读core1。
另外,AXI总线结合的是软核或者ARM来配合使用的,利用率只会比传统总线更低。
没法做乒乓操作,因为要连续存1.5s的数据点(200M频率,5ns一个点),在存的过程中顶层隔10ms发一个读命令,读取位置随机,然后要连续输出该位置之后的数据点,整个过程输入数据是不间断的,即写操作一直存在而起始读位置不固定,所以乒乓操作时如果读和写的地址在同一片DDR就没办法实现乒乓了。