求教:异步FIFO设计的空满标志位
小弟最近在做一个异步FIFO的设计各位大虾能告诉我怎样用简便的方法判断空满标志位?小弟从网上找了一个程序其中有些语句看不懂希望各位大虾指点一下!
wgnext = (wbnext>>1) ^ wbnext;
assign wfull_val = (wgnext=={~w2_rptr, w2_rptr}); 回复【楼主位】matrx2010
-----------------------------------------------------------------------
这是从网上找的完整代码,其中空满标志位的判断有些看不懂
module fifo_asyn(rdata,
wfull,
rempty,
wdata,
winc, //写使能的作用
wclk,
w_rst,
rinc, // 读使能的作用
rclk,
r_rst);
parameter DSIZE = 8;
parameter ASIZE = 4;
output rdata; //width
output wfull;
output rempty;
input wdata; //width
input winc, wclk, w_rst;
input rinc, rclk, r_rst;
reg rdata;
reg wfull,rempty;
reg wptr, rptr, w2_rptr, r2_wptr, w1_rptr,r1_wptr;//
reg rbin, wbin;
reg mem; //DEEPTH 0~15
wire waddr, raddr; //
wire rgnext, rbnext,wgnext,wbnext;
wire rempty_val,wfull_val;
//双口RAM存储器
always@(posedge rclk)
if (rinc && !rempty)
rdata=mem; //waddr,raddr 范围 0~15
always@(posedge wclk)
if (winc && !wfull)
mem <= wdata; //waddr,raddr 范围 0~15
//raddr产生
always @(posedge rclk or negedge r_rst)// GRAYSTYLE2 pointer
if (!r_rst)
{rbin, rptr} <= 0;
else
{rbin, rptr} <= {rbnext, rgnext};
//同步wptr指针
always @(posedge rclk or negedge r_rst)
if (!r_rst)
{r2_wptr,r1_wptr} <= 0;
else
{r2_wptr,r1_wptr} <= {r1_wptr,wptr};
// Memory read-address pointer (okay to use binary to address memory)
assign raddr = rbin;
assign rbnext = !rempty ? (rbin + rinc) : rbin;
assign rgnext = (rbnext>>1) ^ rbnext; //binary-to-gray conversion
// FIFO empty when the next rptr == synchronized wptr or on reset
//rempty产生
assign rempty_val = (rgnext == r2_wptr);
always @(posedge rclk or negedge r_rst) begin
if (!r_rst)
rempty <= 1'b1;
else
rempty <= rempty_val;
end
//wfull产生与waddr产生
always @(posedge wclk or negedge w_rst) // GRAYSTYLE2 pointer
if (!w_rst)
{wbin, wptr} <= 0; //width
else
{wbin, wptr} <= {wbnext, wgnext};
//同步rptr 指针
always @(posedge wclk or negedge w_rst)
if (!w_rst)
{w2_rptr,w1_rptr} <= 0;
else
{w2_rptr,w1_rptr} <= {w1_rptr,rptr}; //width
// Memory write-address pointer (okay to use binary to address memory)
assign waddr = wbin; //waddr width
assign wbnext = !wfull ? (wbin + winc) : wbin;
assign wgnext = (wbnext>>1) ^ wbnext; // binary-to-gray conversion
assign wfull_val = (wgnext=={~w2_rptr, w2_rptr});//不明白
always @(posedge wclk or negedge w_rst)
if (!w_rst)
wfull <= 1'b0;
else
wfull <= wfull_val;
endmodule http://blog.ednchina.com/coyoo/237775/message.aspx
这里面有不少很好的方法。 回复【2楼】wodish
-----------------------------------------------------------------------
谢了!
页:
[1]