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

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

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

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

冬至子 ? 來源:FPGA開發(fā)備忘錄 ? 作者:小創(chuàng) ? 2023-04-25 15:55 ? 次閱讀

1

定義

FIFO(First In First Out )先入先出存儲器,在FPG設(shè)計中常用于跨時鐘域的處理,F(xiàn)IFO可簡單分為同步FIFO和異步FIFO。同步FIFO可理解為讀寫時鐘同源且頻率相同的FIFO,異步FIFO為讀寫時鐘不同源,時鐘頻率不一樣的FIFO。

2

同步FIFO的仿真

該仿真基于XIlinx的fifo generator13.2進行設(shè)計,IP core的配置如下。

圖片

由圖所示,時鐘模式配置為common clock,F(xiàn)IFO深度為16,F(xiàn)IFO數(shù)據(jù)位寬為36bit,其中32bit為數(shù)據(jù)位寬,4bit為用戶自定義比特tuser。下圖為FIFO例化的IPcore。

圖片

理論情況下FIFO的數(shù)據(jù)傳輸時序如下

圖片

當(dāng)復(fù)位拉高后,F(xiàn)IFO模塊若沒有滿,s_axis_tready信號會拉高,然后用戶將s_axis_valid信號拉高就可以向FIFO里面寫入有效的數(shù)據(jù)了,這就發(fā)起了寫操作;此時在主端口用戶可將m_axis_tready拉高,F(xiàn)IFO若不為空,則m_tvalid信號會拉高,此時就可以源源不斷的從FIFO里讀出數(shù)據(jù)了,這就發(fā)起了讀操作。

下面討論下在同步FIFO中的兩種情況

2.1 讀寫時鐘為100M,m_axis_tready在m_axis_tvaild后,此時的仿真圖如下所示。

圖片

由上圖所示,在用戶側(cè)還未將m_axis_tready拉高之前,valid到來后,F(xiàn)IFO輸出的數(shù)據(jù)就不為0了,而是FIFO中存入的第一個數(shù)據(jù),一直到用戶將m_axis_tready拉高,才會輸出FIFO里的下一個數(shù)據(jù)。所以并不是我們理解的,只有用戶發(fā)起FIFO讀,F(xiàn)IFO才會輸出數(shù)據(jù)。

2.2 讀寫時鐘為100M,m_axis_tready在m_axis_tvaild前,此時的仿真圖如下所示。

圖片

由上圖所示,在FIFO的valid數(shù)據(jù)到來之前,我們先將tready拉高,這樣就不會在讀操作之前FIFO就吐出數(shù)據(jù)了。在做設(shè)計時,將復(fù)位拉高后,隨即將tready拉高即可。

3

** 異步FIFO的仿真**

做異步FIFO時,IPCORE的配置如下圖所示

圖片

時鐘模式配置為independent clock,F(xiàn)IFO深度為16,F(xiàn)IFO數(shù)據(jù)位寬為36bit,其中32bit為數(shù)據(jù)位寬,4bit為用戶自定義比特tuser。

理論情況下FIFO的數(shù)據(jù)傳輸時序如下

圖片

由上圖所示,讀速率是寫速率的1/2,因此寫不是連續(xù)的,讀速率是連續(xù)的。下面分幾個情況進行討論。

3.1 寫為100M讀為30.3M,m_trady在m_tvaild前

圖片

由上圖所示,寫數(shù)據(jù)也不連續(xù),s_tready為周期性有效,切換周期和讀時鐘周期一樣,其中高電平時間為一個寫數(shù)據(jù)時鐘周期。

3.2 寫為50M讀為100M,m_trady在m_tvaild前

圖片

由上圖所示,此時讀數(shù)據(jù)不連續(xù),m_tvalid為周期性有效,切換周期和寫時鐘周期一樣,其中高電平時間為一個讀數(shù)據(jù)時鐘周期。

4

對不同深度配置進行討論

4.1當(dāng)FIFO深度為16時

圖片

由上圖可知,若讀數(shù)據(jù)不及時,比較滯后,則FIFO可以存入15個數(shù)據(jù),當(dāng)FIFO滿后,s_axis_tready拉低,不能繼續(xù)寫FIFO,當(dāng)讀操作開始時,F(xiàn)IFO將從存入的第一個數(shù)據(jù)依次輸出。

4.2 當(dāng)fifo為32時

圖片

由上圖可知,若讀數(shù)據(jù)不及時,比較滯后,則FIFO可以存入33個數(shù)據(jù),當(dāng)FIFO滿后,s_axis_tready拉低,不能繼續(xù)寫FIFO,當(dāng)讀操作開始時,F(xiàn)IFO將從存入的第一個數(shù)據(jù)依次輸出。

5

在仿真時遇到的問題

圖片

在仿真時提示說t_user管腳找不到,但打開代碼和block_design看了下,該端口是存在的,后面把block_design刪掉,重新例化新模塊后,問題解決,目前不知道是什么問題導(dǎo)致。

6

激勵文件

`timescale 1ns / 1ps
module tb_fifo( );
reg [31:0] s_axis_tdata ; 
wire       s_axis_tready;
reg        s_axis_tvalid;
reg [3:0]  s_axis_tuser ;     
reg        m_aclk       ;      
reg        s_aclk       ;       
reg        s_aresetn    ;  
wire [31:0] m_axis_tdata ; 
reg         m_axis_tready;
wire        m_axis_tvalid;
wire [3:0]  m_axis_tuser ;


initial begin 
  s_aresetn = 1'b0;
  s_axis_tdata = 32'h0000_0001;
  s_axis_tvalid = 1'b0;
  m_aclk =1'b1;
  s_aclk =1'b1;
  s_axis_tuser = 4'b1010;
  #50
  s_aresetn = 1'b1;
  #10
  s_axis_tvalid = 1'b1;
end


initial begin
  m_axis_tready = 1'b0;
  #340
  m_axis_tready= 1'b1;
end
always #10 s_aclk = ~s_aclk;
always #5 m_aclk = ~m_aclk;


always @(posedge s_aclk) begin
  s_axis_tdata = s_axis_tdata +1'b1;
end


design_1_wrapper tb_design_fifo_wrapper (
  .S_AXIS_0_tdata (s_axis_tdata ),
  .S_AXIS_0_tready(s_axis_tready),
  .S_AXIS_0_tvalid(s_axis_tvalid),
  .S_AXIS_0_tuser (s_axis_tuser ),
  .m_aclk_0       (m_aclk       ),
  .s_aclk_0       (s_aclk       ),
  .s_aresetn_0    (s_aresetn    ),
  .M_AXIS_0_tdata (m_axis_tdata ),
  .M_AXIS_0_tready(m_axis_tready),
  .M_AXIS_0_tvalid(m_axis_tvalid),
  .M_AXIS_0_tuser (m_axis_tuser)
);
endmodule

圖片

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • FPGA設(shè)計
    +關(guān)注

    關(guān)注

    9

    文章

    428

    瀏覽量

    26465
  • 存儲器
    +關(guān)注

    關(guān)注

    38

    文章

    7430

    瀏覽量

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

    關(guān)注

    0

    文章

    103

    瀏覽量

    5955
  • 時鐘源
    +關(guān)注

    關(guān)注

    0

    文章

    92

    瀏覽量

    15921
收藏 人收藏

    評論

    相關(guān)推薦

    Efinity FIFO IP仿真問題 -v1

    Efinity目前不支持聯(lián)合仿真,只能通過調(diào)用源文件仿真。 我們生成一個fifo IP命名為fifo_sim 在Deliverables中保留Testbench的選項。 在IP的生成目
    的頭像 發(fā)表于 10-21 11:41 ?789次閱讀
    Efinity <b class='flag-5'>FIFO</b> IP<b class='flag-5'>仿真</b>問題 -v1

    異步FIFO結(jié)構(gòu)及FPGA設(shè)計

    首先介紹異步FIFO 的概念、應(yīng)用及其結(jié)構(gòu),然后分析實現(xiàn)異步FIFO的難點問題及其解決辦法; 在傳統(tǒng)設(shè)計的基礎(chǔ)上提出一種新穎的電路結(jié)構(gòu)并對其
    發(fā)表于 04-16 09:25 ?46次下載

    基于LPM的高速FIFO的設(shè)計

    利用參數(shù)可設(shè)置模塊庫(LPM)中的兆功能模塊,根據(jù)實際系統(tǒng)的需要,對其參數(shù)進行必要的調(diào)整設(shè)置,介紹了一個高速FIFO 存儲器的設(shè)計方法和步驟,給出了仿真結(jié)果,方便實用。
    發(fā)表于 09-02 09:33 ?26次下載

    異步FIFO結(jié)構(gòu)

    設(shè)計一個FIFO是ASIC設(shè)計者遇到的最普遍的問題之一。本文著重介紹怎樣設(shè)計FIFO——這是一個看似簡單卻很復(fù)雜的任務(wù)。一開始,要注意,FIFO通常用于時鐘域的過渡,是雙時鐘設(shè)計
    發(fā)表于 10-15 08:44 ?94次下載

    高速異步FIFO的設(shè)計與實現(xiàn)

    本文主要研究了用FPGA 芯片內(nèi)部的EBRSRAM 來實現(xiàn)異步FIFO 設(shè)計方案,重點闡述了異步FIFO 的標(biāo)志信號——空/滿狀態(tài)的設(shè)計思路,并且用VHDL 語言實現(xiàn),最后進行了仿真驗證。
    發(fā)表于 01-13 17:11 ?40次下載

    異步FIFO結(jié)構(gòu)及FPGA設(shè)計

    摘要:首先介紹異步FIFO的概念、應(yīng)用及其結(jié)構(gòu),然后分析實現(xiàn)異步FIFO的難點問題及其解決辦法;在傳統(tǒng)設(shè)計的基礎(chǔ)上提出一種新穎的電路結(jié)構(gòu)并對
    發(fā)表于 06-20 12:46 ?3842次閱讀
    異步<b class='flag-5'>FIFO</b>結(jié)構(gòu)及FPGA設(shè)計

    嵌入式 FIFO 數(shù)據(jù)傳輸系統(tǒng)設(shè)計

    本文以dMAX和EMIF接口的數(shù)據(jù)傳輸為例,介紹嵌入式FIFO的設(shè)計、配置及其使用。
    發(fā)表于 06-23 17:19 ?1197次閱讀
    嵌入式 <b class='flag-5'>FIFO</b> 數(shù)據(jù)傳輸系統(tǒng)設(shè)計

    SVPWM原理及其Simulink仿真

    SVPWM原理及其Simulink仿真。
    發(fā)表于 04-15 17:49 ?71次下載

    基于FLASH的FIFO讀寫

    基于FLASH的FIFO讀寫,介紹的比較詳細(xì),值得一讀。
    發(fā)表于 04-28 10:30 ?22次下載

    LED照明節(jié)電裝置的技術(shù)要求及其應(yīng)用條件介紹

    本文介紹了照明節(jié)電裝置及其應(yīng)用技術(shù)的條件分析。
    發(fā)表于 10-23 16:54 ?2次下載
    LED照明節(jié)電裝置的技術(shù)要求<b class='flag-5'>及其</b>應(yīng)用<b class='flag-5'>條件</b>的<b class='flag-5'>介紹</b>

    以太網(wǎng)基礎(chǔ)介紹:MAC地址,FIFO, DMA

    介紹了STM32中以太網(wǎng)外設(shè)的特性:MAC地址,FIFO, DMA
    的頭像 發(fā)表于 07-03 05:04 ?7680次閱讀

    系統(tǒng)仿真及其Matlab實現(xiàn)

    系統(tǒng)仿真及其Matlab的實現(xiàn)方法介紹。
    發(fā)表于 06-17 17:13 ?27次下載

    FIFO的使用介紹

    FIFO的使用非常廣泛,一般用于不同時鐘域之間的數(shù)據(jù)傳輸,或者用于不同數(shù)據(jù)寬度之間的數(shù)據(jù)匹配。在實際的工程應(yīng)用,可以根據(jù)需要自己寫FIFO。不考慮資源的情況下,也可以使用Xilinx提供的IP核來完成。
    的頭像 發(fā)表于 08-14 10:49 ?5037次閱讀

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

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

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

    1. FIFO簡介 FIFO是一種先進先出數(shù)據(jù)緩存器,它與普通存儲器的區(qū)別是沒有外部讀寫地址線,使用起來非常簡單,缺點是只能順序讀寫,而不能隨機讀寫。 2. 使用場景 數(shù)據(jù)緩沖:也就是數(shù)據(jù)寫入過快
    的頭像 發(fā)表于 06-04 14:27 ?1199次閱讀
    同步<b class='flag-5'>FIFO</b>和異步<b class='flag-5'>FIFO</b>區(qū)別<b class='flag-5'>介紹</b>