|
fifo在 芯片和逻辑应用非常的广泛,是非常常见的基础模块,写了一个简单的fifo,- module fifo_syn
- (
- clk ,
- rst_n ,
- fifo_wr_en ,
- fifo_wr_dat,
- fifo_rd_en ,
- fifo_rd_dat,
- fifo_full ,
- fifo_empty ,
- fifo_cnt
- );
- parameter WWIDTH = 8; //可参数化的地址位宽,
- parameter DWIDTH = 8; //参数化的数据位宽
- input clk ;
- input rst_n ;
- input fifo_wr_en ; //写使能
- input [DWIDTH-1:0] fifo_wr_dat; //写数据
- input fifo_rd_en ; //读使能
- output fifo_rd_dat; //读数据
- output fifo_full ; //满信号
- output fifo_empty ; //空信号
- output [WWIDTH-1:0] fifo_cnt ; //fifo 计数,从0~255,256可以用满来表示
- reg [WWIDTH:0] waddr ; //写地址
- reg [WWIDTH:0] raddr ; //读地址
- ram_ref //例化ram
- #(
- .DWIDTH(DWIDTH ),
- .WWIDTH(WWIDTH )
- )
- u_ram_ref
- (
- .clk (clk ),
- .wr_en (fifo_wr_en ),
- .waddr (waddr[WWIDTH-1:0] ),
- .wdata (fifo_wr_dat ),
- .raddr (raddr[WWIDTH-1:0] ),
- .rdata (fifo_rd_dat )
- );
- assign fifo_cnt = waddr[WWIDTH-1:0] - raddr[WWIDTH-1:0];
- assign fifo_full = (waddr == raddr)?1'b1:1'b0; //读写地址相等的时候,满信号拉起来
- assign fifo_empty = ((waddr[WWIDTH]!=raddr[WWIDTH])&&(waddr[WWIDTH-1:0]==raddr[WWIDTH-1:0]))?1'b1:1'b0;//最高位不相等,低位相等的时候,是空
- always @(posedge clk or negedge rst_n)
- begin
- if(rst_n == 1'b0)
- waddr <= 'd0;
- else if(fifo_wr_en == 1'b1 && fifo_full == 1'b0) //有写使能,并且fifo非满的时候写地址自增
- waddr <= #1 waddr + 'd1;
- end
- always @(posedge clk or negedge rst_n)
- begin
- if(rst_n == 1'b0)
- raddr <= 'd0;
- else if(fifo_rd_en == 1'b1&& fifo_empty == 1'b0) //有读使能,并且fifo非空的时候读地址自增
- raddr <= #1 raddr + 'd1
- end
- endmodule
- module ram_ref //ram模型,2个时钟周期出数据,在读地址给出之后,综合工具可以自己推断出RAM,或者自己用coregen生成ram
- (
- clk ,
- wr_en , //ram写使能
- waddr , //ram写地址
- wdata , //ram写数据
- raddr , //ram写地址
- rdata //ram读数据
- );
- parameter WWIDTH = 8;
- parameter DWIDTH = 8;
- parameter DEPTH = 2**WWIDTH;
- input [DWIDTH -1:0] wdata;
- input [WWIDTH -1:0] waddr;
- input wr_en;
- input [DWIDTH -1:0] rdata;
- output [WWIDTH -1:0] raddr;
- reg [DWIDTH-1 :0] mem_ram[DEPTH-1:0];
- reg [DWIDTH-1 :0] q;
- always @(posedge clk)
- begin
- if(wr_en == 1'b1)
- mem_ram[waddr] <= #1 wdata;
- end
- always @(posedge clk)
- begin
- q <= #1 mem_ram[raddr];
- rdata <= #1 q;
- end
- endmodule
复制代码 |
|