📄 syn_fifo.v
字号:
//-----------------------------------------------------// Design Name : syn_fifo// File Name : syn_fifo.v// Function : Synchronous (single clock) FIFO// Coder : Deepak Kumar Tala//-----------------------------------------------------module syn_fifo (clk , // Clock inputrst , // Active high resetwr_cs , // Write chip selectrd_cs , // Read chipe selectdata_in , // Data inputrd_en , // Read enablewr_en , // Write Enabledata_out , // Data Outputempty , // FIFO emptyfull // FIFO full); // FIFO constantsparameter DATA_WIDTH = 8;parameter ADDR_WIDTH = 8;parameter RAM_DEPTH = (1 << ADDR_WIDTH);// Port Declarationsinput clk ;input rst ;input wr_cs ;input rd_cs ;input rd_en ;input wr_en ;input [DATA_WIDTH-1:0] data_in ;output full ;output empty ;output [DATA_WIDTH-1:0] data_out ;//-----------Internal variables-------------------reg [ADDR_WIDTH-1:0] wr_pointer;reg [ADDR_WIDTH-1:0] rd_pointer;reg [ADDR_WIDTH :0] status_cnt;reg [DATA_WIDTH-1:0] data_out ;wire [DATA_WIDTH-1:0] data_ram ;//-----------Variable assignments---------------assign full = (status_cnt == (RAM_DEPTH-1));assign empty = (status_cnt == 0);//-----------Code Start---------------------------always @ (posedge clk or posedge rst)begin : WRITE_POINTER if (rst) begin wr_pointer <= 0; end else if (wr_cs && wr_en ) begin wr_pointer <= wr_pointer + 1; endendalways @ (posedge clk or posedge rst)begin : READ_POINTER if (rst) begin rd_pointer <= 0; end else if (rd_cs && rd_en ) begin rd_pointer <= rd_pointer + 1; endendalways @ (posedge clk or posedge rst)begin : READ_DATA if (rst) begin data_out <= 0; end else if (rd_cs && rd_en ) begin data_out <= data_ram; endendalways @ (posedge clk or posedge rst)begin : STATUS_COUNTER if (rst) begin status_cnt <= 0; // Read but no write. end else if ((rd_cs && rd_en) && !(wr_cs && wr_en) && (status_cnt != 0)) begin status_cnt <= status_cnt - 1; // Write but no read. end else if ((wr_cs && wr_en) && !(rd_cs && rd_en) && (status_cnt != RAM_DEPTH)) begin status_cnt <= status_cnt + 1; endend ram_dp_ar_aw #(DATA_WIDTH,ADDR_WIDTH)DP_RAM (.address_0 (wr_pointer) , // address_0 input .data_0 (data_in) , // data_0 bi-directional.cs_0 (wr_cs) , // chip select.we_0 (wr_en) , // write enable.oe_0 (1'b0) , // output enable.address_1 (rd_pointer) , // address_q input.data_1 (data_ram) , // data_1 bi-directional.cs_1 (rd_cs) , // chip select.we_1 (1'b0) , // Read enable.oe_1 (rd_en) // output enable); endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -