`timescale 1ns/1ns /**********************************RAM************************************/ module dual_port_RAM #(parameter DEPTH = 16, parameter WIDTH = 8)( input wclk ,input wenc ,input [$clog2(DEPTH)-1:0] waddr ,input [WIDTH-1:0] wdata ,input rclk ,input renc ,input [$clog2(DEPTH)-1:0] raddr ,output reg [WIDTH-1:0] rdata ); 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; wire [ADDR_WIDTH:0] waddr_next, raddr_next; assign waddr_next = (winc & (!wfull))?(waddr+'d1):waddr; assign raddr_next = (rinc & (!rempty))?(raddr+'d1):raddr; always@(posedge clk or negedge rst_n) begin if(!rst_n) begin {waddr,raddr} <= 'd0; end else begin {waddr,raddr} <= {waddr_next,raddr_next}; end end always@(posedge clk or negedge rst_n) begin if(!rst_n) begin {wfull,rempty} <= 'd0; end else begin {wfull,rempty} <= {(waddr=={~raddr[ADDR_WIDTH],raddr[ADDR_WIDTH-1:0]}),(waddr==raddr)}; end end dual_port_RAM #(.DEPTH(DEPTH), .WIDTH(WIDTH)) u_dual_port_RAM( .wclk(clk), .wenc(winc & (!wfull)), .waddr(waddr[ADDR_WIDTH-1:0]), .wdata(wdata), .rclk(clk), .renc(rinc & (!rempty)), .raddr(raddr[ADDR_WIDTH-1:0]), .rdata(rdata) ); endmodule