题解 | #同步FIFO#
注意点1:
重写了一下,还是有好几个小错误的
注意点:如果是奇数位的FIFO怎么判断空满。题解 | #同步FIFO#_牛客博客 (nowcoder.net),没有全看懂,只初步了解FIFO深度为奇数时需要特殊处理。
注意点1:例化的格式。
注意点1:例化的格式。
注意点2:传入到RAM中的使能信号rinc & ~rempty,winc & ~wfull
注意点3:空满判断。
dual_port_RAM #( .WIDTH(WIDTH), .DEPTH(DEPTH) ) ram_inst .waddr(waddr[addr_width-1:0]), .raddr(raddr[addr_width-1:0]),
`timescale 1ns/1ns /**********************************RAM************************************/ module dual_port_RAM #(parameter DEPTH = 16, parameter WIDTH = 8)( input wclk ,input wenc ,input [$clog2(DEPTH)-1:0] waddr //深度对2取对数,得到地址的位宽。 ,input [WIDTH-1:0] wdata //数据写入 ,input rclk ,input renc ,input [$clog2(DEPTH)-1:0] raddr //深度对2取对数,得到地址的位宽。 ,output reg [WIDTH-1:0] rdata //数据输出 ); reg [WIDTH-1:0] ram1 [0:DEPTH-1]; //write data always @(posedge wclk) begin if (wenc) begin ram1[waddr] <= wdata; end end //read data always @(posedge rclk) begin if (renc) begin rdata <= ram1[raddr]; end end // reg [WIDTH-1:0] RAM_MEM [0:DEPTH-1]; // always @(posedge wclk) begin // if(wenc) // RAM_MEM[waddr] <= wdata; // end // always @(posedge rclk) begin // if(renc) // rdata <= RAM_MEM[raddr]; // end endmodule /**********************************SFIFO************************************/ module sfifo#( parameter WIDTH = 8, parameter DEPTH = 16 )( input clk , input rst_n , input winc , input rinc , input [WIDTH-1:0] wdata , output reg wfull , output reg rempty , output wire [WIDTH-1:0] rdata ); parameter addr_width = $clog2(DEPTH); reg [addr_width:0] waddr, raddr; //wirte waddr always @ (posedge clk, negedge rst_n) begin if(!rst_n) begin waddr <= 'b0; end else begin waddr <= (winc & ~wfull) ? waddr + 'b1 : waddr; end end //wirte raddr always @ (posedge clk, negedge rst_n) begin if(!rst_n) begin raddr <= 'b0; end else begin raddr <= (rinc & ~rempty) ? raddr + 'b1 : raddr; end end //judge always @ (posedge clk, negedge rst_n) begin if(!rst_n) begin wfull <= 'b0; rempty <= 'b0; end else begin wfull <= {~waddr[addr_width],waddr[addr_width-1:0]} == raddr; rempty <= waddr == raddr; end end //例化 dual_port_RAM #( .WIDTH(WIDTH), .DEPTH(DEPTH) ) ram_inst( .wclk(clk), .rclk(clk), .wenc(winc & ~wfull), .renc(rinc & ~rempty), .waddr(waddr[addr_width-1:0]), .raddr(raddr[addr_width-1:0]), .wdata(wdata), .rdata(rdata) ); endmodule