同步FIFO设计

来源:互联网 发布:js object tostring 编辑:程序博客网 时间:2024/05/21 16:56

同步FIFO设计:

FIFO(first in first out)可以由其名称理解为先入先出储存器,其设计即为双口RAM,其外部没有读写地址线,写入时按照顺序写入,读取时同样按照顺序将先写入的先读出来,后再将后写入的按顺序读出。

依照以上设计思想,首先需主体寄存器80个,每8个为一组,并行输入一组8个数据。当写入时先写入[7:0]这低位8个寄存器,随后一个时钟周期内移位至高八位内,再在低8位中存入数据。以此可实现循环储存。在代码实现部分使用拼接符 { } 来实现移位。

再读取时,同样先读取最先进入的,所以在设计中加入了一个计数器来计算移位次数,使每次读取时可以从最先开始的数据位输出。在读取和输入都是用状态机来实现。

无论是在读取时还是写入时,每一次数据位的增减都经过判断,输入/输出,移位三步在3个时钟周期内完成,所以数据的保持时间为3倍的系统时间。

module FIFO_ctrl(                clk,                rst_n,                fifo_wr_en,                fifo_rd_en,                fifo_full,                fifo_empty,                fifo_wr_data,                fifo_rd_data,                fifo_data_num    );        input                       clk;    input                       rst_n;    input                       fifo_wr_en;    input                       fifo_rd_en;        input       [7:0]           fifo_wr_data;        output                      fifo_full;        output                      fifo_empty;        output  reg  [7:0]          fifo_rd_data;    output  reg  [6:0]          fifo_data_num;                         reg     [3:0]               fifo_rd_addr;    reg     [3:0]               fifo_wr_addr;        wire                        fifo_wr_cen;    wire                        fifo_rd_cen;        reg     [79:0]              fifo_mem;    reg      [1:0]             rd_state;    reg                        wr_state;    //    reg     [4:0]               wr_cnt;//    reg     [4:0]               rd_cnt;        reg     [4:0]              cnt;  //    always@(*)begin//        rd_cnt <= 4'd9 - wr_cnt;//    end    always@( posedge clk or negedge rst_n) begin        if( ! rst_n ) begin            cnt <= 4'd0;            rd_state  <= 2'd0;            wr_state  <= 1'd0;        end        else if (fifo_wr_cen) begin            case( wr_state )                1'd0 : begin                    fifo_mem[7:0] <= fifo_wr_data;                    wr_state      <= 1'd1;                    rd_state      <= 2'd0;                   end                1'd1 : begin                    fifo_mem      <= { fifo_mem[71:0],fifo_mem[79:72]};                    cnt           <= cnt + 1'd1;                    wr_state      <= 1'd0;                end            endcase        end        else if(fifo_rd_cen) begin            case(rd_state)                2'd0 : begin                    if( ! cnt) begin                        fifo_mem  <= {fifo_mem[7:0],fifo_mem[79:8]};                        cnt       <= cnt - 1'd1;                        wr_state  <= 1'd0;                    end                        else                         rd_state  <= 2'd1;                end                2'd1 : begin                        fifo_rd_data <= fifo_mem[7:0];                        rd_state     <= 2'd2;                end                2'd2 : begin                        fifo_mem     <=  { fifo_mem[71:0],fifo_mem[79:72]};                        cnt          <= cnt  +  1'd1;                        rd_state     <= 2'd1;                end            endcase        end    end            always @(posedge clk or negedge rst_n) begin              if(! rst_n)                  fifo_data_num <= 7'd0 ;              else if (fifo_wr_en & (~ fifo_full) & (~(fifo_rd_en & (~fifo_empty))) & (wr_state == 0)) //Valid Write Only, increase data cnt;                  fifo_data_num <= fifo_data_num + 4'd8 ;                 else if (fifo_rd_en & (~ fifo_empty) & (~(fifo_wr_en & (~fifo_full))) & (rd_state == 1)) //Valid Read Only, decrease data cnt;                  fifo_data_num <= fifo_data_num - 4'd8 ;               end            //middle wire        assign fifo_empty  = (fifo_data_num == 0 ) ;        assign fifo_wr_cen = fifo_wr_en & (~ fifo_full) ;                assign fifo_full   = (fifo_data_num == 7'd80) ;        assign fifo_rd_cen = fifo_rd_en & (~ fifo_empty) ;        endmodule

设计的RTL图为

 

资源使用率


 

仿真图

 

 

 

 

仿真时首先写入,由于未读取,fifo_rd_data为不定值,随后读取,fifo_rd_data输出存储值。fifo_wr_data为输入值,fifo_data_num为FIFO内存留的数据位数。

通过这次设计,再次深入了解了FIFO的结构,加深了Verilog与FPGA的使用熟悉程度。设计还有很大的缺陷,占用资源过大,而却未能够真正的先入先出。

原创粉丝点击