在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

FPGA零基礎學習之Vivado-FIFO使用教程

FPGA技術江湖 ? 來源:FPGA技術江湖 ? 2023-06-09 09:38 ? 次閱讀

FIFO使用教程

作者:李西銳校對:陸輝

FIFO的英文全稱叫做First in First out,即先進先出。這也就決定了這個IP核的特殊性,先寫進去的數據優先被讀出,所以,FIFO是不需要地址信號線的,這也是它的一大特點,通常用來做數據的緩存,或者用來解決高速異步數據的交互,即解決了跨時鐘域的問題。此外,FIFO還有一個特點,就是數據被讀出之后就不存在了,不像RAMROM一樣,數據被讀出后還存在。所以我們如果想進行多次的讀,那么就需要進行同樣次數的寫。

FIFO分為同步時鐘和異步時鐘,同步FIFO指的是讀寫使用同一個時鐘,在時鐘沿信號來的時候進行讀寫。異步FIFO是指讀寫在不同時鐘下進行,這樣我們可以實現讀寫不同速度。

那么接下來,我們就來實現一下異步FIFO的讀寫過程。

2691bb5c-05ea-11ee-962d-dac502259ad0.png

上圖為選擇異步FIFO之后的圖示,在這個圖示中,我們給大家解釋一下每個信號的含義。

FIFO_WRITE

full:FIFO的滿信號,當FIFO的存儲空間寫滿了之后,此信號拉高,否則為低。此信號為FIFO的輸出信號。

din[17:0]:FIFO的數據輸入,寫進FIFO的數據通過此信號線進入FIFO。

wr_en:FIFO的寫使能,當我們要往FIFO里面寫入數據時,拉高此信號。此信號為FIFO的輸入。

FIFO_READ

empty:FIFO的空信號,當FIFO的存儲空間空了之后,此信號拉高,否則為低。此信號為FIFO的輸出信號。

dout:FIFO的數據輸出,讀出FIFO的數據通過此信號線輸出。

rd_en:FIFO的讀使能,當我們要從FIFO里面讀出數據時,拉高此信號。此信號為FIFO的輸入。

rst:FIFO復位,默認高電平有效。

wr_clk:寫時鐘

rd_clk: 讀時鐘

wr_rst_busy:寫復位忙信號

rd_rst_busy:讀復位忙信號

在了解了FIFO的端口之后,我們來實現一個應用實例。比如,我們以10MHz的速度往FIFO里面寫數據,寫滿之后,在20MHz的時鐘下將數據讀出,一直讀空。當然,在顯示應用中,FIFO的讀寫是可以同步進行的。

首先,我們先來新建工程。

新建好之后,我們先調用一下IP核:

2699dc38-05ea-11ee-962d-dac502259ad0.png

在IP核管理器界面,搜索FIFO,然后選中圖示所選項雙擊打開。

26adbbea-05ea-11ee-962d-dac502259ad0.png

在FIFO類型選項,我們選擇異步FIFO。剛打開默認的選項為同步FIFO。

26be877c-05ea-11ee-962d-dac502259ad0.png

在數據端口配置界面,我們將數據位寬改為8bit,深度使用1024。

復位端口在這就不再使用了,所以勾選位置取消掉。

26ce6354-05ea-11ee-962d-dac502259ad0.png

在此界面出現了almost full flag和almost empty flag。這兩個信號是幾乎滿或空的標志信號,在此實驗中,我們不使用。

26de3c16-05ea-11ee-962d-dac502259ad0.png

Datacount是FIFO數據用量計數器,代表了此時FIFO的內部存儲被使用的情況。假設我們寫進去了10個數,那么兩個計數器都為10。

26f6b30e-05ea-11ee-962d-dac502259ad0.png

此界面為IP核的信息,在此界面可以看出,我們的讀寫深度發生了變化,我們在前面設置的深度為1024,但是在此處顯示的卻是1023。原因是因為FIFO結構的特殊性,并不是我們設置的有問題。所以,在我們這個異步FIFO中,深度為1023。

27085a64-05ea-11ee-962d-dac502259ad0.png

點擊OK直接生成。在點擊Generate。

此外,我們還需要兩個不同時鐘,在這里我們使用鎖相環生成。

2719ba5c-05ea-11ee-962d-dac502259ad0.png

在管理界面搜索clock。配置過程我們在此前已經講過,就不在過多敘述。

接下來我們寫一下fifo的寫控制器,代碼如下:

1   module fifo_wr(
2     
3     input   wire             clk,
4     input   wire             rst_n,
5     input   wire             empty,
6     input   wire             full,
7     output   reg             fifo_wr_en,
8     output   reg     [7:0]      fifo_data_in
9   );
10
11    reg         state;
12    
13    always @ (posedge clk, negedge rst_n)
14    begin
15      if(rst_n == 1'b0)
16        begin
17          fifo_wr_en <= 1'b0;
18          fifo_data_in <= 8'd0;
19          state <= 1'b0;
20        end
21      else
22        case(state)
23          1'b0  :  begin
24                  if(empty)
25                    state <= 1'b1;
26                  else
27                    state <= 1'b0;
28                end
29          1'b1  :  begin
30                  if(full)
31                    begin
32                      fifo_wr_en <= 1'b0;
33                      fifo_data_in <= 8'd0;
34                      state <= 1'b0;
35                    end
36                  else
37                    begin
38                      fifo_wr_en <= 1'b1;
39                      fifo_data_in <= fifo_data_in + 1'b1;
40                      state <= 1'b1;
41                    end
42                end
43        endcase
44    end
45
46  endmodule

因為我們的實驗是讀空了才寫,所以我們用狀態機來做,先判斷FIFO是否為空。讀控制器代碼如下:

1   module fifo_rd(
2     
3     input   wire               clk,
4     input   wire               rst_n,
5     input   wire               empty,
6     input   wire               full,
7     output   reg               fifo_rd_en
8   );
9 
10    reg         state;
11    
12    always @ (posedge clk, negedge rst_n)
13    begin
14      if(rst_n == 1'b0)
15        begin
16          fifo_rd_en <= 1'b0;
17          state <= 1'b0;
18        end
19      else
20        case(state)
21          1'b0  :  begin
22                  if(full)
23                    state <= 1'b1;
24                  else
25                    state <= 1'b0;
26                end
27          1'b1  :  begin
28                  if(empty)
29                    begin
30                      fifo_rd_en <= 1'b0;
31                      state <= 1'b0;
32                    end
33                  else
34                    begin
35                      fifo_rd_en <= 1'b1;
36                      state <= 1'b1;
37                    end
38                end
39        endcase
40    end
41
42  endmodule

頂層代碼如下:

1   module fifo(
2     
3     input   wire               clk,
4     input   wire               rst_n,
5     output   wire       [7:0]      q
6   );
7     
8     wire           fifo_wr_clk;
9     wire           fifo_rd_clk;
10    wire           locked;
11    wire           empty;
12    wire           full;
13    wire           fifo_wr_en;
14    wire     [7:0]    fifo_data_in;
15    wire           fifo_rd_en;
16    
17    clk_wiz_0 clk_wiz_0_inst
18     (
19    // Clock out ports
20    .clk_out1(fifo_wr_clk),     // output clk_out1
21    .clk_out2(fifo_rd_clk),     // output clk_out2
22    // Status and control signals
23    .reset(~rst_n), // input reset
24    .locked(locked),       // output locked
25     // Clock in ports
26    .clk_in1(clk));      // input clk_in1
27    
28    fifo_wr fifo_wr_inst(
29    
30    .clk            (fifo_wr_clk),
31    .rst_n            (locked  ),
32    .empty            (empty    ),
33    .full            (full    ),
34    .fifo_wr_en          (fifo_wr_en  ),
35    .fifo_data_in        (fifo_data_in)
36  );
37
38    fifo_generator_0 fifo_generator_0_inst (
39      .wr_clk(fifo_wr_clk),  // input wire wr_clk
40      .rd_clk(fifo_rd_clk),  // input wire rd_clk
41      .din(fifo_data_in),        // input wire [7 : 0] din
42      .wr_en(fifo_wr_en),    // input wire wr_en
43      .rd_en(fifo_rd_en),    // input wire rd_en
44      .dout(q),      // output wire [7 : 0] dout
45      .full(full),      // output wire full
46      .empty(empty)    // output wire empty
47    );
48
49    fifo_rd fifo_rd_inst(
50    
51    .clk        (fifo_rd_clk),
52    .rst_n        (locked    ),
53    .empty        (empty    ),
54    .full        (full    ),
55    .fifo_rd_en      (fifo_rd_en)
56  );
57    
58  endmodule

代碼寫完之后,我們寫個仿真驗證一下波形,代碼如下:

1   `timescale 1ns / 1ps
2 
3   module fifo_tb;
4 
5     reg                clk;
6     reg                rst_n;
7     wire       [7:0]      q;
8     
9     initial begin
10      clk = 0;
11      rst_n = 0;
12      #105;
13      rst_n = 1;
14      #10000;
15      $stop;
16    end
17    
18    always #10 clk = ~clk;
19    
20    fifo fifo_inst(
21    
22    .clk      (clk),
23    .rst_n      (rst_n),
24    .q        (q)
25  );
26
27  endmodule

打開波形之后,我們將讀寫控制模塊的信號全部添加到波形窗口:

272c2aca-05ea-11ee-962d-dac502259ad0.png

添加好之后,點擊restart和run-all

273a6162-05ea-11ee-962d-dac502259ad0.png

由于波形默認運行10us,我們觀察不到全部波形,所以,在此我們繼續點擊run-all,然后點擊break,讓仿真停止。

27478004-05ea-11ee-962d-dac502259ad0.png

然后,我們觀察波形:

2752821a-05ea-11ee-962d-dac502259ad0.png

在波形里面可以清楚的看到我們的fifo_data_in和q的波形,一長一短。這是因為讀的速度快,所以波形維持的時間短。寫數據的時間長度是讀數據時間長度的兩倍。

然后放大波形觀察其他信號:

276173ec-05ea-11ee-962d-dac502259ad0.png

在黃色光標位置,可以看到滿信號拉高了,然后寫使能就拉低了,狀態開始進入到讀。在讀使能拉高之后,輸出q就有了數據,但是我們的empty信號維持了一段時間才拉低,這是因為fifo的特殊結構導致的,在此我們就不再過多討論。

結論:異步FIFO控制正確,仿真波形輸入和輸出信號正常。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • FPGA
    +關注

    關注

    1630

    文章

    21796

    瀏覽量

    605531
  • fifo
    +關注

    關注

    3

    文章

    389

    瀏覽量

    43823
  • 時鐘
    +關注

    關注

    11

    文章

    1746

    瀏覽量

    131728
  • IP核
    +關注

    關注

    4

    文章

    331

    瀏覽量

    49601
  • Vivado
    +關注

    關注

    19

    文章

    815

    瀏覽量

    66835

原文標題:FPGA零基礎學習之Vivado-FIFO使用教程

文章出處:【微信號:HXSLH1010101010,微信公眾號:FPGA技術江湖】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Vivado Tcl零基礎入門與案例實戰【高亞軍編著】

    Vivado Tcl零基礎入門與案例實戰-高亞軍編寫
    發表于 01-14 11:13

    FPGA高手的養成記:零基礎學FPGA 連載—小墨同學出品

    ://bbs.elecfans.com/jishu_475405_1_1.html零基礎學FPGA(十二)基于FIFO的串口發送機設計全流程https://bbs.elecfans.com
    發表于 04-03 11:22

    零基礎入門FPGA,如何學習?精選資料分享

    問:本人零基礎,想學FPGA,求有經驗的人說說,我應該從哪入手,應該看什么教程,應該用什么學習板和開發板,看什么書等,希望有經驗的好心人能夠給我一些引導。如果想速成,那就上網看視頻吧,這...
    發表于 07-20 07:28

    零基礎如何學習stm32?

    零基礎如何學習stm32?
    發表于 12-21 07:53

    FPGA零基學習:IP CORE FIFO設計

    CORE FIFO設計 本篇實現基于叁芯智能科技的SANXIN -B01 FPGA開發板,以下為配套的教程,如有入手開發板,可以登錄官方淘寶店購買,還有配套的學習視頻。 SA
    發表于 03-15 16:19

    FPGA零基學習Vivado-LED流水燈實驗

    及打算進階提升的職業開發者都可以有系統性學習的機會。系統性的掌握技術開發以及相關要求,對個人就業以及職業發展都有著潛在的幫助,希望對大家有所幫助。本次帶來Vivado系列,本篇為FPGA零基
    發表于 04-18 21:12

    FPGA零基學習Vivado-按鍵使用教程

    大俠好,歡迎來到FPGA技術江湖。本系列將帶來FPGA的系統性學習,從最基本的數字電路基礎開始,最詳細操作步驟,最直白的言語描述,手把手的“傻瓜式”講解,讓電子、信息、通信類專業學生、初入職場小白
    發表于 06-13 18:33

    FPGA零基學習Vivado-FIFO使用教程

    及打算進階提升的職業開發者都可以有系統性學習的機會。 系統性的掌握技術開發以及相關要求,對個人就業以及職業發展都有著潛在的幫助,希望對大家有所幫助。本次帶來Vivado系列,FIFO使用教程。話不多
    發表于 06-16 17:50

    FPGA零基學習Vivado-TLC549驅動設計

    大俠好,歡迎來到FPGA技術江湖。本系列將帶來FPGA的系統性學習,從最基本的數字電路基礎開始,最詳細操作步驟,最直白的言語描述,手把手的“傻瓜式”講解,讓電子、信息、通信類專業學生、初入職場小白
    發表于 08-16 19:57

    零基學習LEBVIEW】06 IO接口

    零基學習LEBVIEW】06 IO接口,感興趣的朋友一定要學習
    發表于 12-31 10:28 ?0次下載

    零基學習LEBVIEW】07 串口通信技術

    零基學習LEBVIEW】07 串口通信技術,感興趣的朋友一定要學習
    發表于 12-31 10:28 ?0次下載

    零基學習LEBVIEW】08 智能儀器

    零基學習LEBVIEW】08 智能儀器,感興趣的朋友一定要學習
    發表于 12-31 10:28 ?0次下載

    FPGA零基礎入門教程

    本文檔的主要內容詳細介紹的是FPGA零基礎入門教程免費下載。
    發表于 01-18 16:47 ?58次下載
    <b class='flag-5'>FPGA</b>的<b class='flag-5'>零基</b>礎入門教程

    FPGA零基學習Vivado-按鍵使用教程

    系統性的掌握技術開發以及相關要求,對個人就業以及職業發展都有著潛在的幫助,希望對大家有所幫助。本次帶來Vivado系列,按鍵的使用教程。話不多說,上貨。
    的頭像 發表于 04-28 14:01 ?1565次閱讀
    <b class='flag-5'>FPGA</b><b class='flag-5'>零基</b>礎<b class='flag-5'>學習</b><b class='flag-5'>之</b><b class='flag-5'>Vivado</b>-按鍵使用教程

    FPGA零基學習Vivado-ROM使用教程

    系統性的掌握技術開發以及相關要求,對個人就業以及職業發展都有著潛在的幫助,希望對大家有所幫助。本次帶來Vivado系列,ROM使用教程。話不多說,上貨。
    的頭像 發表于 06-07 12:27 ?1378次閱讀
    <b class='flag-5'>FPGA</b><b class='flag-5'>零基</b>礎<b class='flag-5'>學習</b><b class='flag-5'>之</b><b class='flag-5'>Vivado</b>-ROM使用教程
    主站蜘蛛池模板: 六月丁香啪啪 | 男人天堂伊人网 | 人人九九精| 能直接看黄的网站 | 国产精品大尺度尺度视频 | 日韩欧免费一区二区三区 | 咪咪爱毛片 | 国产精品无码永久免费888 | 成年人午夜影院 | 狠狠色婷婷七月色综合 | 中文字幕一区二区三区免费视频 | 国产成人免费无庶挡视频 | 黄a级免费 | 日本黄色免费电影 | 最色网在线观看 | 人人成人免费公开视频 | 欧美大片一区二区 | 日本亚洲卡一卡2卡二卡三卡四卡 | 萌白酱白丝护士服喷水铁牛tv | 男女吃奶一进一出动态图 | 天天躁夜夜躁狠狠躁2021a | 欧美福利在线播放 | 精品国内一区二区三区免费视频 | 日本黄色影片在线观看 | 国产乱子伦一区二区三区 | 国产性老妇女做爰在线 | 国产你懂的在线观看 | 一区二区三区四区国产精品 | 五月婷婷激情六月 | 国产色系视频在线观看免费 | 日韩a无吗一区二区三区 | 激情综合丝袜美女一区二区 | 一级在线观看视频 | 国产精品va在线观看不 | 一本大道香蕉大vr在线吗视频 | 在线观看免费av网站 | 色内内免费视频播放 | 免费一级欧美片片线观看 | 中文字幕在线观看一区 | 久久手机看片 | 一区二区高清在线观看 |