在设计中,读afifo时需要根据afifo数据输出的拍数进行数据采样。
数据采样时,建议使用非空判断后产生的vld信号进行数据采样,避免因空读产生无效的数据输出。如下文,afifo_rd_en是 afifo的读使能,afifo_rd_en_dly1是afifo读使能打一拍后的信号。afifo_rd_data_vld 是afifo输出有效valid,是由afifo_rd_en && (!empty)打拍后产生的,产生空读时afifo_rd_data_vld为0,推荐使用afifo_rd_data_vld进行数据采样,当afifo没有数据时,afifo_rd_en即使有效,也不会输出无效数据。不推荐使用afifo_rd_en_dly1进行数据采样,否则当afifo内部没有数据时也会产生data_vld。当然如果afifo_rd_en的产生逻辑没有问题也不会出现问题,但方式1的自我保护能力更强,更推荐使用
//方式1:推荐使用方式,应该使用afifo_rd_data_vld作为有效信号
always @(posedge rd_clk or negedge rd_rst_n)
if(~rd_rst_n)
data_out <= 1024{1'b0}};
else if(afifo_rd_data_vld)
data_out <= afifo_rd_data;
always @(posedge rd_clk or negedge rd_rst_n)
if(~rd_rst_n)
data_vld <= 1'b0 ;
else
data_vld <= afifo_rd_data_vld;
//方式2:不推荐方式,
always @(posedge rd_clk or negedge rd_rst_n)
if(~rd_rst_n)
data_out <= 1024{1'b0}};
else if(afifo_rd_en_dly1)
data_out <= afifo_rd_data;
always @(posedge rd_clk or negedge rd_rst_n)
if(~rd_rst_n)
data_vld <= 1'b0 ;
else
data_vld <= afifo_rd_en_dly1;
//-------------------------------------------//
//afifo外部代码
always @(posedge rd_clk or negedge rd_rst_n)
if(~rd_rst_n)
afifo_rd_en_dly1 <= 1'b0;
else
afifo_rd_en_dly1 <= afifo_rd_en;
//如下部分为afifo内部代码
input afifo_rd_en,
output afifo_rd_data_vld,
output [1023:0] afifo_rd_data,
assign afifo_ren = afifo_rd_en && (!empty);
bit_delay
#(
.DELAY_CYCLES (1),
.INIT_VAL (0)
)
bit_delay_u0(
.clk (rd_clk),
.rst_n (rd_rst_n),
.inbit (afifo_ren),
.outbit (afifo_rd_data_vld)
);