wptr_full.v
来自「多时钟域下同步逻辑的RTL代码(包括数据同步器和控制信号万能同步器)」· Verilog 代码 · 共 78 行
V
78 行
/*************************************************
* 模块名: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 + =
减小字号Ctrl + -
显示快捷键?