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