0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

同步FIFO設(shè)計(上)

冬至子 ? 來源:兩猿社 ? 作者:IC猿 ? 2023-06-05 14:39 ? 次閱讀

1.介紹

FIFO ,F(xiàn)irst In First Out,先入先出隊列,顧名思義,即第一個到達的數(shù)據(jù)也將會是第一個離開。由于同步FIFO的操作速度非???,并且能 降低系統(tǒng)的復雜性 ,因此在很多高性能系統(tǒng)中是非常理想的選擇。且同步FIFO相比異步FIFO來說實現(xiàn)起來更簡單。所以在實際項目中用得相對較多。

UART項目中也使用了同步FIFO進行數(shù)據(jù)的緩存,本文主要對此進行講解。

2.FIFO設(shè)計

圖片

同步fifo架構(gòu),取自《硬件架構(gòu)的藝術(shù)》

根據(jù)系統(tǒng)時鐘和響應速度,需要確定 FIFO深度 。本設(shè)計中深度設(shè)置為15,數(shù)據(jù)寬度8bit。同步FIFO設(shè)計的關(guān)鍵在于空滿信號的產(chǎn)生。

設(shè)計中rptr為 讀指針 ,指向下一個要讀的地址;wptr為 寫指針 ,同樣指向下一個要寫的地址。有效的讀寫使能使讀寫指針遞增。

wfull為 寫滿信號 ,表示FIFO空間已經(jīng)寫滿,不能再寫入數(shù)據(jù);rempty為 讀空信號 ,表示FIFO內(nèi)沒有可供讀寫的有效數(shù)據(jù)。空滿信號的產(chǎn)生是根據(jù)讀寫指針(讀寫地址)產(chǎn)生的。

  • FIFO復位

此FIFO模塊中有兩個復位,一個是系統(tǒng)復位rst_,一個是FIFO復位fifo_rst。

系統(tǒng)復位為是整系統(tǒng)復位信號,該系統(tǒng)中所有寄存器會在此復位信號有效時有一個初始值,避免不定態(tài)的產(chǎn)生。

FIFO復位信號是同步FIFO的復位信號,只對此模塊有效,該信號有效時讀寫指針會歸0。

滿足FIFO復位單獨可控的設(shè)計要求。

  • 空滿信號產(chǎn)生

當FIFO復位信號fifo_rst有效時,讀寫指針會歸零,這時rempty信號會拉起,表示FIFO為空狀態(tài),此時往fifo中寫數(shù)據(jù);當fifo中沒有空間可以寫時,寫地址是ram的深度即15,寫指針指向下一個寫地址會回到0,此時fifo為滿狀態(tài),wfull信號拉起。

圖片

空滿產(chǎn)生

可以發(fā)現(xiàn),在讀寫指針相等時,F(xiàn)IFO要么空要么滿。那么我們怎么對空滿狀態(tài)進行區(qū)分呢?

FIFO深度為15,正常地址應該為4bit[3:0],為了區(qū)分空滿狀態(tài),我們將指針設(shè)置為5bit[4:0]。

根據(jù)上述的空滿狀態(tài)產(chǎn)生原理,可以發(fā)現(xiàn):

1) 當FIFO為空時,讀寫指針完全相等;

2) 當FIFO為滿時,讀寫指針的最高位是相反的,而低4位一定相等。

圖片

空滿信號產(chǎn)生

  • FIFO數(shù)據(jù)狀態(tài)指示

由于設(shè)計要求FIFO數(shù)據(jù)量需要可查詢,所以增加一個fifo_cnt,它的值為寫指針與讀指針的差值。表示FIFO中剩余的數(shù)據(jù)量,作為輸出傳遞到寄存器配置模塊供系統(tǒng)查詢。

最后附上本項目中所用到的同步FIFO代碼,可將FIFO數(shù)據(jù)位寬和深度參數(shù)化,減少改動方便重復調(diào)用。另外要養(yǎng)成良好的代碼習慣,多加注釋。

同步FIFO Verilog代碼:

1`timescale 1ns/1ps
 2
 3module    UART_FIFO(
 4    //inputs
 5    clk,
 6    rst_,
 7    fifo_rst,
 8    rinc,
 9    winc,
10    data_i,
11    //outputs
12    data_o,
13    wfull,
14    rempty,
15    fifo_cnt
16);
17
18input           clk;                 // ARM clock
19input           rst_;                // ARM reset
20input           fifo_rst;            // FIFO reset control signal.high active
21input           rinc;                // FIFO read enable signal
22input           winc;                // FIFO write enable signal
23input  [7:0]    data_i;              // in data line
24
25output          wfull;               // write full signal
26output          rempty;              // read empty signal
27output [7:0]    data_o;              // FIFO out data
28output [4:0]    fifo_cnt;            // FIFO statu register
29
30reg  [7:0]      data_o;
31reg  [4:0]      fifo_cnt;
32reg  [4:0]      wptr;                // write pointer
33reg  [4:0]      rptr;                // read pointer
34reg  [7:0]      ram[15:0];           // ram in FIFO
35
36// write data in ram
37always@(posedge clk or negedge rst_) begin
38    if(!rst_) begin
39        data_o <= 8'd0;
40        rptr   <= 5'd0;
41    end
42    else begin
43        if(fifo_rst) begin
44            rptr <= 5'd0;
45        end
46        else begin
47            if(rinc && !rempty) begin
48                data_o <= ram[rptr[3:0]];
49                rptr   <= rptr + 1'b1;
50            end
51        end
52    end
53end
54
55// read data from ram
56always@(posedge clk or negedge rst_) begin
57    if(!rst_) begin
58        wptr <= 5'd0;
59    end
60    else begin
61        if(fifo_rst) begin
62            wptr <= 5'd0;
63        end
64        else begin
65            if(winc && !wfull) begin
66                ram[wptr[3:0]] <= data_i;
67                wptr           <= wptr + 1'b1; 
68            end
69        end
70    end
71end
72
73// the number of data in the FIFO
74always@(posedge clk or negedge rst_) begin
75    if(!rst_) begin
76        fifo_cnt <= 5'd0;
77    end
78    else begin
79        fifo_cnt <= wptr - rptr;
80    end
81end
82
83// produce full and empty signal
84assign    wfull  = ({!wptr[4],wptr[3:0]}==rptr)? 1'b1 : 1'b0;
85assign    rempty = (wptr==rptr)? 1'b1:1'b0;
86
87endmodule
88
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5250

    瀏覽量

    119194
  • RAM
    RAM
    +關(guān)注

    關(guān)注

    8

    文章

    1344

    瀏覽量

    114213
  • FIFO存儲
    +關(guān)注

    關(guān)注

    0

    文章

    103

    瀏覽量

    5944
  • UART接口
    +關(guān)注

    關(guān)注

    0

    文章

    124

    瀏覽量

    15199
收藏 人收藏

    評論

    相關(guān)推薦

    同步FIFO設(shè)計詳解及代碼分享

    FIFO (先入先出, First In First Out )存儲器,在 FPGA 和數(shù)字 IC 設(shè)計中非常常用。 根據(jù)接入的時鐘信號,可以分為同步 FIFO 和異步 FIFO 。
    發(fā)表于 06-27 10:24 ?1845次閱讀
    <b class='flag-5'>同步</b><b class='flag-5'>FIFO</b>設(shè)計詳解及代碼分享

    握手型接口的同步FIFO實現(xiàn)

    按照正常的思路,在前文完成前向時序優(yōu)化和后向時序優(yōu)化后,后面緊跟的應該是雙向時序優(yōu)化策略了,不過不急,需要先實現(xiàn)一下握手型同步FIFO。
    的頭像 發(fā)表于 12-04 14:03 ?534次閱讀
    握手型接口的<b class='flag-5'>同步</b><b class='flag-5'>FIFO</b>實現(xiàn)

    異步FIFO的設(shè)計分析及詳細代碼

    (每個數(shù)據(jù)的位寬) FIFO同步和異步兩種,同步即讀寫時鐘相同,異步即讀寫時鐘不相同 同步FIFO用的少,可以作為數(shù)據(jù)緩存 異步
    發(fā)表于 11-15 12:52 ?8441次閱讀
    異步<b class='flag-5'>FIFO</b>的設(shè)計分析及詳細代碼

    FPGA之FIFO練習3:設(shè)計思路

    根據(jù)FIFO工作的時鐘域,可以將FIFO分為同步FIFO和異步FIFO。同步
    的頭像 發(fā)表于 11-29 07:08 ?1795次閱讀

    同步FIFO之Verilog實現(xiàn)

    FIFO的分類根均FIFO工作的時鐘域,可以將FIFO分為同步FIFO和異步FIFO
    的頭像 發(fā)表于 11-01 09:57 ?1698次閱讀

    異步FIFO之Verilog代碼實現(xiàn)案例

    同步FIFO的意思是說FIFO的讀寫時鐘是同一個時鐘,不同于異步FIFO,異步FIFO的讀寫時鐘是完全異步的。
    發(fā)表于 11-01 09:58 ?1446次閱讀

    FIFO使用及其各條件仿真介紹

    FIFO(First In First Out )先入先出存儲器,在FPG設(shè)計中常用于跨時鐘域的處理,FIFO可簡單分為同步FIFO和異步FIFO
    的頭像 發(fā)表于 04-25 15:55 ?3614次閱讀
    <b class='flag-5'>FIFO</b>使用及其各條件仿真介紹

    FIFO設(shè)計—同步FIFO

    FIFO是異步數(shù)據(jù)傳輸時常用的存儲器,多bit數(shù)據(jù)異步傳輸時,無論是從快時鐘域到慢時鐘域,還是從慢時鐘域到快時鐘域,都可以使用FIFO處理。
    發(fā)表于 05-26 16:12 ?1400次閱讀
    <b class='flag-5'>FIFO</b>設(shè)計—<b class='flag-5'>同步</b><b class='flag-5'>FIFO</b>

    FIFO設(shè)計—異步FIFO

    異步FIFO主要由五部分組成:寫控制端、讀控制端、FIFO Memory和兩個時鐘同步
    發(fā)表于 05-26 16:17 ?1452次閱讀
    <b class='flag-5'>FIFO</b>設(shè)計—異步<b class='flag-5'>FIFO</b>

    一個簡單的RTL同步FIFO設(shè)計

    FIFO 是FPGA設(shè)計中最有用的模塊之一。FIFO 在模塊之間提供簡單的握手和同步機制,是設(shè)計人員將數(shù)據(jù)從一個模塊傳輸?shù)搅硪粋€模塊的常用選擇。
    發(fā)表于 06-14 08:59 ?384次閱讀

    基于寄存器的同步FIFO

    ? FIFO 是FPGA設(shè)計中最有用的模塊之一。FIFO 在模塊之間提供簡單的握手和同步機制,是設(shè)計人員將數(shù)據(jù)從一個模塊傳輸?shù)搅硪粋€模塊的常用選擇。 在這篇文章中,展示了一個簡單的 RTL
    的頭像 發(fā)表于 06-14 09:02 ?655次閱讀

    基于Verilog的同步FIFO的設(shè)計方法

    同步FIFO的設(shè)計主要包括讀寫地址的產(chǎn)生、數(shù)據(jù)的讀寫、以及狀態(tài)的控制。下面我們將分別介紹這三個方面的設(shè)計。
    發(fā)表于 08-31 12:53 ?564次閱讀

    同步FIFO設(shè)計分析

    模塊雖小但是要有新意,首先寫一個同步FIFO,這是一個爛大街的入門級項目,但是我肯定不會寫的那么簡單
    的頭像 發(fā)表于 09-11 17:11 ?519次閱讀
    <b class='flag-5'>同步</b><b class='flag-5'>FIFO</b>設(shè)計分析

    同步FIFO和異步FIFO的區(qū)別 同步FIFO和異步FIFO各在什么情況下應用

    同步FIFO和異步FIFO的區(qū)別 同步FIFO和異步FIFO各在什么情況下應用? 1.
    的頭像 發(fā)表于 10-18 15:23 ?1462次閱讀

    同步FIFO和異步FIFO區(qū)別介紹

    ,并且間隔時間長,也就是突發(fā)寫入。那么通過設(shè)置一定深度的FIFO,可以起到數(shù)據(jù)暫存的功能,且使得后續(xù)處理流程平滑。 時鐘域的隔離:主要用異步FIFO。對于不同時鐘域的數(shù)據(jù)傳輸,可以通過FIFO進行隔離,避免跨時鐘域的數(shù)據(jù)傳輸帶來
    的頭像 發(fā)表于 06-04 14:27 ?755次閱讀
    <b class='flag-5'>同步</b><b class='flag-5'>FIFO</b>和異步<b class='flag-5'>FIFO</b>區(qū)別介紹