📄 fifo_control.v
字号:
//////////////////////////////////////////////////////////////////////////File Name: fifo_control.v//SetUp Data: 2006/03/14//modify Data: 2006/03/14 Setup the file// 2006/03/15 modify the file to the style of earlier// of fifo.v(2006.3.11)//Author: Shen Zhi//Function: Control the fifo_16_8////////////////////////////////////////////////////////////////////////////`include fifo_16_8.v//define`define DEPTH 15 //the number of bytes`define HALF 8 //half the number of bytes`define BITS 4 //the bits of depth need`define WIDTH 8 //the width of one bytemodule fifo_control(//input reset_n, wclk, //2MHz~27MHz rclk, //27MHz din, //output ena_out, dout); parameter address_size = 4;parameter word_size = 8;parameter mem_size = 16; input reset_n;input wclk;input rclk;input[word_size-1:0] din;output ena_out;output[word_size-1:0] dout;reg ena;reg[word_size-1:0] dout;wire we_n=0;wire[address_size-1:0] counter;wire low_thrsh = (counter<=4); //the bytes' number is less than 4wire high_thrsh = (counter>=6); //more than 8wire empty = (counter==0);wire full = (counter==16);wire rd_req = high_thrsh;reg rd_req_d;reg rd_req_d2;reg ena_d;reg rclk_2;wire[word_size-1:0] fifo_dout;reg[address_size-1:0] wptr;reg[address_size-1:0] rptr;assign ena_out=rclk_2|ena;assign counter=(wptr>=rptr)?wptr-rptr: `DEPTH+wptr-rptr+1; always@(negedge reset_n or posedge rclk_2)begin if(~reset_n) begin rd_req_d <= 0; rd_req_d2 <= 0; end else begin rd_req_d <= rd_req; rd_req_d2 <= rd_req_d; endendalways@(negedge reset_n or posedge wclk) //write data to memory from outsidebegin if(~reset_n) begin wptr<=`BITS'b0; end else begin if(wptr>=`DEPTH) wptr<=`BITS'b0; else wptr<=wptr+1; if(counter>=`DEPTH) begin $display("error at time %0t:",$time); $display("FIFO overflow\n"); end else; endendalways@(negedge reset_n or posedge rclk_2) //read data from memory to insidebegin if(~reset_n) begin rptr<=`BITS'b0; end else if(rd_req_d2) begin if(rptr>=`DEPTH) rptr<=`BITS'b0; else rptr<=rptr+1; if(counter==0) begin $display("error at time %0t:",$time); $display("FIFO underflow\n"); end else; endendalways@(negedge reset_n or negedge rclk_2)begin if(~reset_n) begin dout<={`WIDTH{1'bz}}; end else dout<=fifo_dout;endalways@(negedge reset_n or negedge rclk_2)begin if(~reset_n) begin ena<=1; ena_d<=1; end else begin ena_d<=~rd_req_d2; ena<=ena_d; endendalways@(negedge reset_n or negedge rclk)if(~reset_n) begin rclk_2<=1'b0; endelse begin rclk_2<=~rclk_2; endfifo_16_8 fifo_16_8( .wclk (wclk), .rclk (rclk_2), .we_n (we_n), .rd(rd_req_d2), .wptr (wptr), .rptr (rptr), .din (din), .dout (fifo_dout));endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -