我们在应用master template时,将master_read和master_write都改为双时钟,方便在不同时钟频率下的读写操作。
注意一个问题:
burst_write_master:
dcfifo the_user_to_master_fifo (
.rdclk (clk),
.wrclk (user_write_clk),
.wrreq (user_write_buffer),
.aclr (reset),
.data (user_buffer_data),
.rdreq (read_fifo),
.q (master_writedata),
.rdempty (user_buffer_empty),
.wrusedw (),
.rdfull (),
.rdusedw (fifo_used),
.wrempty (),
.wrfull (user_buffer_full)
);
burst_read_master:
dcfifo the_master_to_user_fifo (
.rdclk (user_read_clk),
.wrclk (clk),
.wrreq (master_readdatavalid),
.aclr (reset_all),
.data (master_readdata),
.rdreq (user_read_buffer),
.q (user_buffer_data),
.rdempty (fifo_empty),
.wrusedw (fifo_used),
.rdfull (),
.rdusedw (),
.wrempty (),
.wrfull ()
);
fifo_used这个变量是控制读写启停的,千万不要用错,在burst_read_master里面由于FIFO写是由avalon总线读出sdram数据写入FIFO中,此时最好用wrusedw 来作为fifo_used赋值,因为此时的FIFO写时钟较快,需要准确知道当前fifo中数据数量,而wrusedw 是根据写时钟变化的。同理burst_write_master用rdusedw 来做为fifo_used的变量。
原因:
当FIFO是双时钟读写时,rdusedw 跟随rdclk 变化,wrusedw 跟随wrclk ,当读写时钟速度差异较大时,rdusedw与wrusedw 值会出现一段时间内不同的情况,用错fifo_used的值,会导致FIFO的读空或者是写满的现象。