关于异步FIFO的异步比较模块!
parameter ADDRSIZE = 4;
parameter N = ADDRSIZE-1;
output aempty_n, afull_n;
input [N:0] wptr, rptr;
input wrst_n;
reg direction;
wire high = 1'b1;
wire dirset_n = ~( (wptr[N]^rptr[N-1]) & ~(wptr[N-1]^rptr[N]));
wire dirclr_n = ~((~(wptr[N]^rptr[N-1]) & (wptr[N-1]^rptr[N])) |
~wrst_n);
always @(posedge high or negedge dirset_n or negedge dirclr_n)
if (!dirclr_n) direction <= 1'b0;
else if (!dirset_n) direction <= 1'b1;
else direction <= high;
//always @(negedge dirset_n or negedge dirclr_n)
//if (!dirclr_n) direction <= 1'b0;
//else direction <= 1'b1;
assign aempty_n = ~((wptr == rptr) && !direction);
assign afull_n = ~((wptr == rptr) && direction);
endmodule
这个模块是sunburst的文档里面介绍的异步FIFO里面的比较模块不清楚里面定义的high是干什么用的,求小编帮帮忙给解答一下呀。
不错,挺好的
挺好的?
作为一个通用设计的编程风格,有些人喜欢将程序内部使用的常数值信号定义为wire信号,这样在特殊场景或移植代码上会有很多方便,也增加代码可读性,比如把1'b1定义成 high one 之类的
else if (!dirset_n) direction <= 1'b1;
else direction <= high;
这句用到high了啊 不是一样吗 两个结果
呵呵,这就是我说的编程风格和可移植性,假如这个设计需要移植,移植后又要求high信号不是1'b1这样的强1,可以只通过修改wire high的值来简单替换,比如一个设计里有10000个点在某种状态赋1'b1,但我的设计移植后又要求这10000个状态赋值是weak1,这时候用high这种模式就方便很多,否则就要改10000个点了,这与C中的typedef是类似的,写法不一样罢了
差不多明白了,谢谢啊
wire dirclr_n = ~( (~(wptr[N]^rptr[N-1]) & (wptr[N-1]^rptr[N])) | ~wrst_n);
同时复位时,由于wrst_n为0,dirclr_n为0,dirset_n计算可知为1
direction触发的条件为always@(posedge high or negedge dirset_n or negedge dirclr_n)
当negedge dirset_n 或者 negedge dirclr_n条件满足时触发direction更新,否则,由于posedge high永远满足,direction为high,即为1。high的作用:防止direction上电时处于不定态(假如此时还没有复位)。
