可能是最简单的同步fifo 的设计
文章目錄
- 可能是最簡單的同步fifo 設計
- 什么是FIFO
- FIFO的分類
- 設計FIFO的關鍵
- FIFO空滿判斷方法
- 本次同步FIFO設計的基本參數
- 具體代碼實現過程
可能是最簡單的同步fifo 設計
什么是FIFO
FIFO的英文全稱為First In First Out ,是我們在FPGA工程設計開發中經常使用的一種先進先出的數據緩存器。它區別于其他普通存儲器(比如rom ,ram)的是沒有外部讀寫地址線。設計開發者使用它的時候不需要對地址進行管理,只需要給寫使能.寫數據,就能把對應的數據寫入存儲器保存;如果數據區域不空,給出讀使能就能把有效數據讀出來。雖然說這樣使用對于開發者設計電路結構來說方便簡單一些,但也存在很大的局限性:就是在存儲或者讀取數據時只能順序進行,而不像使用普通存儲器那樣可以自由的通過控制地址線來對對應存儲區間的數據進行操作。
FIFO的分類
設計FIFO的關鍵
不管是設計同步FIFO,還是設計異步FIFO,關鍵點之一是能產生正確的FIFO空滿(empty/full)信號。
FIFO空滿判斷方法
FIFO空滿判斷方法有兩種:
1.增加拓展位的方法
2.設置數據計數器的方法 (此種方法比較簡單)
設置一個數據計數器count。 當寫使能有效時每寫入一個數據,數據計數器count同時加1;讀操作時,每讀出一個有效數據,數據計數器count同時減1。當數據計數器count等于0的時刻,fifo為空,empty拉高。當數據計數器count等于fifo深度值時,表示fifo被寫滿,full拉高。此種方法雖然簡單,不易出錯,但是由于計數器會占用額外的資源,當fifo的深度較大時,可能會降低fifo的讀寫速度。
本次同步FIFO設計的基本參數
- FIFO深度:FIFO能存儲的數據的個數
- FIFO寬度:寫入數據,讀出數據的寬度(此處的讀寫數據位寬保持同樣值)。
- 滿標志:拉高表示此時FIFO內部已經寫滿,不能再寫入數據。如果仍然進行寫數據操作,那么數據會丟失,不會被寫入數據存儲區
- 空標志:拉高表示此時FIFO內部沒有數據,數據已經全部被讀走或者沒有寫入過數據。此時仍然可以進行讀數據操作,讀出來的數據是無效數據
- 讀寫時鐘:對FIFO進行讀寫操作的基準時鐘
- 讀出數據有效標志:此信號為高電平表示此時從FIFO讀出的數據是有效的。
具體代碼實現過程
寫入讀出數據位寬,FIFO深度通過參數聲明。直接修改參數即可實現其它位寬和深度的FIFO設計。
下面的工程是把上述設計的FIFO作為一個IP核調用,外接一些外設接口在某開發板的測試工程.測試結果表明設計沒有問題.
設計源文件部分代碼如下:
module syn_fifo #(parameter DATA_WIDTH = 3'd4 ,parameter FIFO_DEPTH = 5'd16 ,parameter CNT_WIDTH = 3'd5 ) (input rst_n ,input clk ,input [DATA_WIDTH-1:0] data_in ,input wr_en ,input rd_en ,output reg [DATA_WIDTH-1:0] data_out =0 ,output reg valid =0 ,output reg [CNT_WIDTH-1 :0] count = 0 ,output full ,output empty ); //------------------------------------------------------------------ // Variable definitionreg [DATA_WIDTH-1:0] ram [FIFO_DEPTH-1:0] ;reg [CNT_WIDTH-2 :0] read_cnt = 0 ;reg [CNT_WIDTH-2 :0] write_cnt = 0 ;//------------------------------------------------------------------ // Read and write pointer,number of data in fifo always @(posedge clk)beginif(rst_n == 1'b0)beginread_cnt <= 0 ;write_cnt <= 0 ;count <= 0 ;data_out <= 0 ;valid <= 0 ; endelsebegincase({wr_en,rd_en})2'b00: begincount <=count ;valid <= 0 ;end 2'b01: begin valid <= ( count >0 ) ? rd_en:0 ;data_out<=ram[read_cnt] ; read_cnt<= ( count >0 ) ?(read_cnt+1 ):read_cnt ;if ( count >0 ) count <= count-1 ;else count <= 0 ;end2'b10:beginram[write_cnt] <= ( count<FIFO_DEPTH ) ? data_in:ram[write_cnt] ;count <= ( count<FIFO_DEPTH ) ? count+1:count ;write_cnt <= ( count<FIFO_DEPTH ) ? write_cnt+1 :write_cnt ; valid <= 0 ; end2'b11:begin ram[write_cnt] <= data_in ;data_out <= ram[read_cnt] ;write_cnt <= write_cnt+1 ;read_cnt <= read_cnt+1 ;count <= count ; valid <= rd_en ;end default : ;endcaseendend//------------------------------------------------------------------ // fifo flag output assign full = (count == FIFO_DEPTH); assign empty = (count == 0); endmoduletestbench文件代碼如下:
`timescale 1ns/100ps `define half_cycle 5module syn_fifo_tb ;parameter DATA_WIDTH = 3'd4 ;parameter FIFO_DEPTH = 5'd16 ;parameter CNT_WIDTH = 3'd5 ;reg rst_n ;reg clk ;reg [DATA_WIDTH-1:0] data_in ; reg wr_en ;reg rd_en ; wire [DATA_WIDTH-1:0] data_out ;wire valid ;wire full ;wire empty ;syn_fifo#(.DATA_WIDTH ( DATA_WIDTH ),.FIFO_DEPTH ( FIFO_DEPTH ),.CNT_WIDTH ( CNT_WIDTH ))syn_fifo_inst(.rst_n ( rst_n ) ,.clk ( clk ) ,.data_in ( data_in ) ,.wr_en ( wr_en ) ,.rd_en ( rd_en ) ,.data_out ( data_out ) ,.valid ( valid ) ,.full ( full ) ,.empty ( empty ));always #(`half_cycle) clk=~clk;initialbeginclk=0;data_in=0;rst_n=0;wr_en =0 ;rd_en = 0 ;#50 ;rst_n=1; wr_en=1;rd_en=0;# 500;wr_en=0;rd_en=1;#500 ;wr_en=1;rd_en=0;#100 ;wr_en=0;rd_en=1;#300 ;wr_en=1;rd_en=0;#300 ;wr_en=0;rd_en=1;#100 ;wr_en=0;rd_en=0; #100 ;wr_en=1;rd_en=0;#100 ;wr_en=0;rd_en=0; #300 ;wr_en=0;rd_en=1; #100 ;wr_en=0;rd_en=0; #100 ; wr_en=1;rd_en=0;#100 ; wr_en=1;rd_en=1;#320 ;wr_en=1;rd_en=1; #100 ;wr_en=0;rd_en=0;#100 ;wr_en=1;rd_en=0; #100 ;wr_en=1;rd_en=0;#600 ;$stop;endalways@(posedge clk)data_in=data_in+1;endmodule仿真結果
-
寫入數據測試
仿真測試結果:向深度為16的FIFO中寫入16個數據之后,FIFO的full信號被拉高,表明此時已經寫滿,不能再寫入數據。 -
讀出數據測試
仿真測試結果: 再連續寫入16個數據之后。進行連續讀操作,可以把寫入的數據正確的讀出來(伴隨的讀數據有效信號為高電平)。注意紅框中的信息。 在正確讀出最后一個數據的時候,empty拉高,表明目前讀出來的數據已經是FIFO里邊存儲的最后一個數據。之后如果沒有新的數據寫入,繼續進行讀操作,那么讀出來的數據是無效數據,valid信號應該為低電平。
分享不易,看完點個贊唄。
總結
以上是生活随笔為你收集整理的可能是最简单的同步fifo 的设计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 京东工业完成3亿美元B系列优先股交易 京
- 下一篇: vivado链接不上开发板最有可能原因