|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
本帖最后由 PayPal 于 2020-7-4 20:16 编辑
经典FIFO代码,写的规范。
- //-----------------------------------------------------
- // Design Name : syn_fifo
- // File Name : syn_fifo.v
- // Function : Synchronous (single clock) FIFO
- // Coder :<a href="http://www.asic-world.com/">http://www.asic-world.com/</a>
- //-----------------------------------------------------
- module syn_fifo (
- clk , // Clock input
- rst , // Active high reset
- wr_cs , // Write chip select
- rd_cs , // Read chipe select
- data_in , // Data input
- rd_en , // Read enable
- wr_en , // Write Enable
- data_out , // Data Output
- empty , // FIFO empty
- full // FIFO full
- );
-
- // FIFO constants
- parameter DATA_WIDTH = 8;
- parameter ADDR_WIDTH = 8;
- parameter RAM_DEPTH = (1 << ADDR_WIDTH);
- // Port Declarations
- input 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;
- end
- end
- always @ (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;
- end
- end
- always @ (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;
- end
- end
- always @ (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;
- end
- end
-
- 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
复制代码
|
|