📄 wptr_full.v
字号:
/*************************************************
* 模块名:wptr_full
* 时 间:2007-05-14
* 设计者:张波涛
* 说 明:FIFO的判满逻辑
*************************************************/
//`include "timescale.v"
module wptr_full(
wfull, //FIFO的满信号
waddr, //满地址, (n-1)位Gray码
wptr, //满指针, n位Gray码, 送往写时钟域
wrptr2, //同步读指针,从读时钟域来
winc, //写请求信号
wclk, //写时钟
wrst_n //写时钟域复位信号
);
parameter ADDRSIZE = 4;
output wfull;
output [ADDRSIZE-1:0] waddr;
output [ADDRSIZE:0] wptr;
input [ADDRSIZE:0] wrptr2;
input winc,wclk,wrst_n;
reg [ADDRSIZE:0] wptr,wbin,wgnext,wbnext; //当前写指针(Gray), 写地址(二进制), 下一拍写指针(Gray), 写地址(二进制)
reg wfull,waddrmsb;
//产生Gray码
always @ (posedge wclk or negedge wrst_n)
begin
if(!wrst_n)
begin
wptr <= 0;
waddrmsb <= 0;
end
else begin
wptr <= wgnext;
waddrmsb <= wgnext[ADDRSIZE]^wgnext[ADDRSIZE-1];
end
end
//产生下一拍的地址和指针
always @(wptr or winc)
begin:Gray_inc
integer i;
for (i=0;i<=ADDRSIZE;i=i+1)
wbin[i] = ^(wptr >> i);
if(!wfull)
wbnext = wbin + winc;
else
wbnext = wbin;
wgnext = (wbnext >> 1)^wbnext;
end
//写地址
assign waddr = {waddrmsb,wptr[ADDRSIZE-2:0]};
//判满逻辑
wire w_2ndmsb = wgnext[ADDRSIZE]^wgnext[ADDRSIZE-1];
wire wr_2ndmsb = wrptr2[ADDRSIZE]^wrptr2[ADDRSIZE-1];
always @(posedge wclk or negedge wrst_n)
if(!wrst_n)
wfull <= 0;
else
wfull <= ((wgnext[ADDRSIZE] != wrptr2[ADDRSIZE])&&
(w_2ndmsb == wr_2ndmsb)&&
(wgnext[ADDRSIZE -2:0] == wrptr2[ADDRSIZE-2:0]));
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -