美女精品网站_欧美精品91_亚洲人成高清_狠狠入ady亚洲精品_精品不卡一区二区三区_欧美性天天影院_一区二区精品国产_黄色成人精品网站_午夜欧美理论片_亚洲婷婷免费

您的位置:首頁 > 快訊 >

同步FIFO設(shè)計詳解及代碼分享|環(huán)球短訊

2023-06-27 14:41:36 來源:FPGA探索者

1. FIFO 簡介

FIFO (先入先出, First In First Out )存儲器,在 FPGA和數(shù)字 IC設(shè)計中非常常用。 根據(jù)接入的時鐘信號可以分為同步 FIFO 和異步 FIFO 。

**FIFO 底層基于雙口 RAM** ,同步 FIFO 的讀寫時鐘一致,異步 FIFO 讀時鐘和寫時鐘不同。 同步時鐘主要應(yīng)用于速率匹配(數(shù)據(jù)緩沖),類似于乒乓存儲提高性能的思想,可以讓后級不必等待前級過多時間; 異步 FIFO 主要用于多 bit 信號的跨時鐘域處理。

本文討論同步 FIFO 的結(jié)構(gòu)及控制邏輯設(shè)計,并給出代碼。


(資料圖片僅供參考)

2. 同步 FIFO 接口

對于同步 FIFO ,包含必要的接口如下圖所示:

(1) clk : 時鐘信號,讀寫共用;

(2) rst_n : 復(fù)位信號,視具體設(shè)計和芯片采用同步復(fù)位還是異步復(fù)位,此處默認使用異步低電平復(fù)位;

(3) wdata : 寫數(shù)據(jù)信號,信號后帶“ \\ ”表示是多 bit 信號;

(4) rdata : 讀數(shù)據(jù)信號,信號后帶“ \\ ”表示是多 bit 信號;

(5) wfull : 滿信號,指示 FIFO 寫滿了,不能再寫了,如果再寫會覆蓋掉還沒讀出的寫入數(shù)據(jù),造成數(shù)據(jù)丟失;

(6) rempty : 空信號,指示 FIFO 讀空了,不能在讀了,如果再讀相當于有的數(shù)據(jù)重復(fù)讀了第二遍,造成數(shù)據(jù)錯誤;

(7) winc : 寫使能信號,寫使能有效時表示希望能寫入數(shù)據(jù);

(8) rinc : 讀使能信號,讀使能有效時表示希望能讀出數(shù)據(jù);

3. 雙口 RAM 接口

在實現(xiàn) FIFO 時,無論是同步 FIFO 還是異步 FIFO ,通常會通過雙口 RAM ( Dual Port RAM )并添加一些必要的邏輯來實現(xiàn)。雙口 RAM 的接口如下圖所示。

**左側(cè)全部是寫時鐘域的,包括寫時鐘、寫數(shù)據(jù)、寫地址和寫使能信號;

**

右側(cè)全部是讀時鐘域的,包括讀時鐘、讀數(shù)據(jù)、讀地址和讀使能信號;

4. 基于雙口 RAM 的同步 FIFO 結(jié)構(gòu)

根據(jù)同步 FIFO 的接口和雙口 RAM 的接口,在借助雙口 RAM 實現(xiàn)同步 FIFO 時,如下圖所示結(jié)構(gòu),只需要加入讀、寫控制邏輯即可。在寫邏輯中,用于產(chǎn)生寫地址和寫滿信號; 在讀邏輯中,用于產(chǎn)生讀地址和讀空信號。 讀寫控制邏輯還需要受到讀寫使能信號的控制。

5. 讀寫地址產(chǎn)生邏輯

讀寫地址什么時候能夠遞增?

顯然,對于寫地址必須滿足:

(1) 寫使能有效(要寫入);

(2) 沒寫滿(能寫入);

即:

always @ (posedge clk ornegedge rst_n) begin  if(~rst_n) begin    waddr <= "b0;  end   else begin    if( winc && ~wfull ) begin      waddr <= waddr + 1"b1;    end     else begin      waddr <= waddr;        end   end end

對于讀地址必須滿足:

(1) 讀使能有效(要讀出);

(2) 沒讀空(能讀出);

即:

always @ (posedge clk or negedge rst_n) begin  if(~rst_n) begin    raddr<= "b0;  end   else begin    if( rinc && ~rempty ) begin      raddr <= raddr + 1"b1;    end     else begin      raddr <= raddr;        end   end end

6. 空滿信號產(chǎn)生邏輯

搞定了讀寫地址的控制邏輯,還差最后一步也是最關(guān)鍵的信號:空滿信號如何產(chǎn)生。

空: 讀空,讀地址追上寫地址;

滿: 寫滿,寫地址追上讀地址。

問題來了: 怎么判地址斷追上了呢? 如果地址相等那應(yīng)該是追上了,即 raadr == waddr 或者 wddr == raddr 。 如果按照這種判斷,顯然這兩個地址追上對方的判斷是等效的,無法區(qū)分出來到底是寫追上讀還是讀追上寫。

可以考慮: 使用 1 個標志位 flag 來額外指示寫追上讀還是讀追上寫。

參考前人的文獻,判斷空滿的方式有多種,非常常用的一種是 Clifford E. Cummings 文章中提到的 擴展 1 bit 的讀寫地址方法,也就是說,將前面提到的 flag 指示信號和原本 N 位的讀寫地址結(jié)合,使用 N+1 位的讀寫地址,其中最高位用于判斷空滿信號,其余低位還是正常用于讀寫地址索引。

以一個 4 深度的 FIFO 實例來說明, 4 深度原本需要 2 bit 的讀寫地址,現(xiàn)在擴展成 3 bit 。

使用低 2 位來進行雙口 RAM 的地址索引,高位用于判斷空滿。 對于空信號,可以知道當 FIFO 里沒有待讀出的數(shù)據(jù)時產(chǎn)生。** 也就是說,此時讀追上了寫,把之前寫的數(shù)據(jù)剛剛?cè)慷汲觯x地址和寫地址此時指向相同的位置,讀地址 - 寫地址 =0** ,即

raddr == waddr

對于寫滿信號, **當寫入后還沒被讀出的數(shù)據(jù)恰好是 FIFO 深度的時候,產(chǎn)生滿信號,即寫地址 - 讀地址 = FIFO 深度 = 4 ** 。 對照下圖可以發(fā)現(xiàn),此時對于雙口 RAM 的 2 bit 的地址來說,讀寫地址一致; 對于最高位來所,寫是 1 而讀是 0 。

再考慮下圖所示的一種情況,寫入待讀出的數(shù)據(jù)仍然是 4 個,此時也是 4 深度的 FIFO 已經(jīng)滿了。 讀寫地址的低位相同,高位是寫 0 讀 1 。

對于寫滿的 2 種情況,總結(jié)下來,都是低位相同,最高位相反。

即:

raddr[N] = = ~waddr[N]    raddr[N-1:0] = = waddr[N-1:0]

也就是:

raddr == {~waddr[N], waddr[N-1:0]}

所以,空滿邏輯產(chǎn)生的代碼為:

always @ (posedge clk or negedge rst_n) begin  if(~rst_n) begin    wfull <= "b0;    rempty <= "b0;  end   else begin    wfull <= (raddr == {~waddr[ADDR_WIDTH], waddr[ADDR_WIDTH-1:0]});    rempty <= (raddr == waddr);  end end

7. 全部代碼

`timescale 1ns/1ns  /****************************/// 作者:FPGA探索者/****************************/module sfifo#(  parameter  WIDTH = 8,  parameter   DEPTH = 16)(  input           clk    ,   input           rst_n  ,  input           winc  ,  input            rinc  ,  input     [WIDTH-1:0]  wdata  ,  output reg        wfull  ,  output reg        rempty  ,  output wire [WIDTH-1:0]  rdata);  // 用localparam定義一個參數(shù),可以在文件內(nèi)使用    localparam ADDR_WIDTH = $clog2(DEPTH);    reg [ADDR_WIDTH:0] waddr;    reg [ADDR_WIDTH:0] raddr;    always @ (posedge clk or negedge rst_n) begin        if(~rst_n) begin            waddr <= "b0;        end         else begin            if( winc && ~wfull ) begin                waddr <= waddr + 1"b1;            end             else begin                waddr <= waddr;                end         end     end     always @ (posedge clk or negedge rst_n) begin        if(~rst_n) begin            raddr <= "b0;        end         else begin            if( rinc && ~rempty ) begin                raddr <= raddr + 1"b1;            end             else begin                raddr <= raddr;                end         end     end     always @ (posedge clk or negedge rst_n) begin        if(~rst_n) begin            wfull <= "b0;            rempty <= "b0;        end         else begin            wfull <= (raddr == {~waddr[ADDR_WIDTH], waddr[ADDR_WIDTH-1:0]});            rempty <= (raddr == waddr);        end     end // 帶有 parameter 參數(shù)的例化格式    dual_port_RAM      #(        .DEPTH(DEPTH),        .WIDTH(WIDTH)    )    dual_port_RAM_U0     (        .wclk(clk),      .wenc(winc),        .waddr(waddr[ADDR_WIDTH-1:0]),       .wdata(wdata),              .rclk(clk),        .renc(rinc),        .raddr(raddr[ADDR_WIDTH-1:0]),       .rdata(rdata)     );       endmodule/**************RAM 子模塊*************/module dual_port_RAM #(parameter DEPTH = 16,             parameter WIDTH = 8)(   input wclk  ,input wenc  ,input [$clog2(DEPTH)-1:0] waddr  //深度對2取對數(shù),得到地址的位寬。  ,input [WIDTH-1:0] wdata        //數(shù)據(jù)寫入  ,input rclk  ,input renc  ,input [$clog2(DEPTH)-1:0] raddr  //深度對2取對數(shù),得到地址的位寬。  ,output reg [WIDTH-1:0] rdata     //數(shù)據(jù)輸出);reg [WIDTH-1:0] RAM_MEM [0:DEPTH-1];always @(posedge wclk) begin  if(wenc)    RAM_MEM[waddr] <= wdata;end always @(posedge rclk) begin  if(renc)    rdata <= RAM_MEM[raddr];end endmodule

關(guān)鍵詞:

[責任編輯:xwzkw]

相關(guān)閱讀

美女精品网站_欧美精品91_亚洲人成高清_狠狠入ady亚洲精品_精品不卡一区二区三区_欧美性天天影院_一区二区精品国产_黄色成人精品网站_午夜欧美理论片_亚洲婷婷免费
激情综合久久| 久久在线91| 久久久久网址| 欧美天天视频| 99精品国产福利在线观看免费| 日韩视频一区二区三区在线播放免费观看| aa国产精品| 美日韩精品免费| 国内精品美女在线观看| 在线播放一区| 玖玖精品视频| 一区二区精品| 国产精品多人| 六月婷婷一区| 亚洲看片一区| 欧美三级乱码| 欧美一级一区| 亚洲欧洲一区二区天堂久久| 美女网站久久| 亚洲视频1区| 含羞草久久爱69一区| 午夜在线a亚洲v天堂网2018| 激情欧美亚洲| 国产精品二区影院| 久久久久久久久久久久久久一区| 精品成人免费| 欧美日韩在线播放一区二区| 亚洲一区二区动漫| 99伊人成综合| 亚洲茄子视频| 狠狠久久婷婷| 国产中文一区| 欧美日韩ab| 欧美影视一区| 久久综合一区二区三区| 亚洲资源av| 国产精品一区二区三区免费观看| 亚洲激情网址| 亚洲精品极品| 亚洲伦伦在线| 亚洲国产专区| 99国产精品久久久久久久| 国产精品分类| 欧美激情一区| 欧美日韩国产综合视频在线| 久久久久久国产精品一区| 国产精品日韩久久久| 国产欧美不卡| 性欧美长视频| 女人香蕉久久**毛片精品| 久久亚洲一区二区| 欧美日本免费| 最新日韩在线| 亚洲一区二区三区精品视频| 亚洲永久网站| 欧美va亚洲va日韩∨a综合色| 久久精品日产第一区二区| 久久久久久夜| 国产在线不卡| 99精品久久| 免费日韩一区二区| 欧美日韩精品免费观看| 亚洲福利久久| 另类国产ts人妖高潮视频| 久久亚洲图片| 亚洲黄网站黄| 久久久水蜜桃av免费网站| 欧美成熟视频| 99热精品在线| 欧美激情视频一区二区三区免费| 伊人成人在线视频| 免费久久99精品国产自| 欧美1区2区视频| 日韩午夜免费视频| 久久综合图片| 一区二区久久| 欧美网站在线| 国产日韩精品一区观看| 欧美一区激情| 国产亚洲一区二区三区在线播放| 欧美高清视频一区| 国产日韩欧美在线播放不卡| 欧美日韩国产免费观看| 亚洲欧美日本日韩| 亚洲国产mv| 欧美激情 亚洲a∨综合| 亚洲精品一区二区三| 久久中文字幕一区二区三区| 亚洲区国产区| 欧美性久久久| 欧美激情日韩| 久久动漫亚洲| 国产日本精品| 亚洲欧洲日本mm| 国产精品vip| 欧美一区二区三区久久精品茉莉花| 亚洲久久在线| 亚洲大片av| 国产一区久久| 午夜精品久久| 老司机精品导航| 免费在线成人| 中文一区二区| 亚洲国产日韩欧美| 亚洲特级毛片| 伊人蜜桃色噜噜激情综合| 午夜精品久久99蜜桃的功能介绍| 国产一区二区三区高清| 在线观看一区| 亚洲二区精品| 亚洲精品一二| 99一区二区| 宅男噜噜噜66国产日韩在线观看| 亚洲成色精品| 亚洲精品乱码久久久久久蜜桃麻豆 | 午夜激情一区| 欧美激情91| 久久午夜视频| 欧美精品九九| 红桃视频亚洲| 亚洲欧洲另类| 亚洲一区二区三区色| 午夜亚洲一区| 亚洲欧美文学| 激情综合久久| 国产精品久久久久9999高清| 国产伦精品一区二区三区四区免费 | 欧美在线播放一区| 国产精品v一区二区三区| 国产精品vip| 亚洲国产黄色| 亚洲在线成人| 欧美日本韩国在线| 91久久黄色| 香蕉久久夜色| 欧美日韩国产亚洲一区| 一区在线免费观看| 亚洲神马久久| 玖玖玖国产精品| 国产中文一区| 中文有码久久| 女人天堂亚洲aⅴ在线观看| 欧美日韩中文| 国产精品一区在线播放| 欧美不卡在线| 中文日韩在线| 欧美日韩精选| 亚洲免费网址| 国产精品av一区二区| 一本色道精品久久一区二区三区| 六月丁香综合| 亚洲国产欧美国产综合一区| 免费久久久一本精品久久区| 黑人一区二区三区四区五区| 午夜影院日韩| 亚洲精品自在在线观看| 麻豆成人在线| 99亚洲一区二区| 韩国自拍一区| 欧美阿v一级看视频| 国产日本精品| 亚洲精品乱码| 黑丝一区二区三区| 欧美激情无毛| 国产精品美女| 亚洲三级电影在线观看| 欧美日韩视频| 欧美一区国产在线| 国产精品一区在线观看| 亚洲黑丝一区二区| 国产精品二区三区四区| 久久蜜桃精品| 美女国产一区| 麻豆av福利av久久av| 99精品视频网| 夜久久久久久| 999亚洲国产精| 亚洲精品激情| 亚洲伦伦在线| 亚洲美女色禁图| 精品99视频| 好吊色欧美一区二区三区四区| 久久亚洲欧美| 久久久人人人| 久热这里只精品99re8久| 欧美亚洲专区| 久久久久久精| 久久久久久久久一区二区| 翔田千里一区二区| 久久激情久久| 欧美韩国一区| 黄色亚洲精品| 亚洲巨乳在线| 亚洲欧美清纯在线制服| 久久精品国产综合精品| 欧美一区激情视频在线观看| 欧美黄在线观看| 黄色工厂这里只有精品| 亚洲网站视频| 亚洲精品女人| 亚洲影院一区| 欧美日本一区二区高清播放视频| 欧美三级网页| 亚洲精品一区二区三区樱花| 99在线精品视频在线观看| 国产欧美日韩亚洲| 久久天堂国产精品| 激情另类综合| 亚洲欧美久久久久一区二区三区| 久久精品三级| 亚洲午夜久久久久久尤物| 亚洲精品护士| 久久天天综合| 日韩视频精品在线观看| 蜜桃伊人久久| 亚洲高清免费| 久久午夜视频| 1024成人| 久久青草久久| 亚洲狼人精品一区二区三区| 国产伦精品一区二区三区视频孕妇 | 欧美精品99| 99在线精品视频在线观看| 久久久天天操| 99re热精品| 欧美日韩三区四区| 国产亚洲成人一区| 国产精品黄色| 久久久久一区二区| 亚洲激情社区| 欧美日韩91| 蜜桃av久久久亚洲精品| 亚洲高清视频在线观看| 久久精品日产第一区二区| 亚洲国产日韩在线| 欧美久久久久| 亚洲欧美网站| 国产视频精品网| 伊人久久成人| 欧美日韩天堂| 欧美在线观看天堂一区二区三区| 99精品福利视频| 激情成人综合| 欧美高清视频一区| 蜜桃av综合| 亚洲永久网站| 国产视频一区在线观看一区免费| 黑人中文字幕一区二区三区| 欧美.日韩.国产.一区.二区| 性高湖久久久久久久久| 国产欧美日韩在线播放| 极品中文字幕一区| 国产综合色一区二区三区| 欧美激情1区2区| 欧美在线3区| 欧美激情视频一区二区三区在线播放| 亚洲欧美99| 羞羞视频在线观看欧美| 亚洲欧美日韩精品久久久 | 久久久蜜桃一区二区人| 国产乱码精品一区二区三区不卡| 亚洲欧洲日本国产| 91久久在线| 91久久精品www人人做人人爽| 欧美视频观看一区| 欧美三级网页| 欧美午夜在线视频| 欧美午夜国产| 亚洲第一在线| 99精品欧美一区二区三区| 亚洲国产高清一区| 亚洲国产精品第一区二区| 亚洲成人自拍视频| 91久久国产自产拍夜夜嗨| 亚洲免费不卡| 羞羞答答国产精品www一本 | 亚洲国产日韩欧美| 亚洲精品一区二区三| 在线视频精品| 美女爽到呻吟久久久久| 欧美粗暴jizz性欧美20| 国内精品亚洲| 国产日韩精品一区观看| 国产精品日本| 欧美韩国一区| 日韩午夜免费| 久久精品官网| 亚洲一级特黄| 亚洲综合不卡| 欧美日韩综合网| 99精品久久久| 欧美xxx在线观看| 伊人久久av导航| 午夜亚洲一区| 亚洲一二区在线| 欧美中日韩免费视频| 黑人一区二区| 久久国产精品一区二区三区| 国产一区二区中文字幕免费看| 亚洲美女一区| 欧美日韩99| 国产一区二区三区免费不卡 | 国产精品久久777777毛茸茸| 玖玖在线精品| av成人天堂| 欧美日韩系列| 亚洲影视综合| 好看不卡的中文字幕| 国产精品夜夜夜一区二区三区尤| 欧美精品亚洲| 久久99伊人| 亚洲国产日韩欧美| 欧美黄色一区二区| 国产日韩一区二区三区| 国产一区二区三区自拍| 免费中文字幕日韩欧美| 亚洲经典自拍| 国产一区二区中文字幕免费看| 国产精品最新自拍| 日韩视频三区| 亚洲亚洲精品三区日韩精品在线视频| 国产精品久久久久久模特| 在线观看成人av| 欧美日韩系列| 欧美激情性爽国产精品17p| 亚洲综合电影一区二区三区| 在线观看一区视频| 亚洲图片在线观看| 欧美日韩一区综合| 欧美日韩国产一区精品一区| 久久免费99精品久久久久久| 亚洲一区视频| 久久大香伊蕉在人线观看热2| 中文精品视频一区二区在线观看| 亚洲二区精品| 亚洲国产日韩欧美| 在线观看欧美一区| 亚洲国产欧美国产综合一区| 欧美日韩ab| 欧美日韩亚洲一区| 欧美日韩一区在线播放| 欧美精品一卡| 国产精品va| 在线日本成人| 中文一区二区| 欧美主播一区二区三区美女 久久精品人| 9久re热视频在线精品| 亚洲欧洲一区| 国产日韩亚洲| 久久久久国产精品一区三寸| 久久av一区二区| 久久看片网站| 欧美日韩国产综合视频在线| 欧美视频二区| 99视频精品| 免费在线国产精品| 欧美另类综合| 亚洲区国产区| 欧美亚洲免费高清在线观看| 久久久久久久久久码影片| 女同一区二区| 伊人久久婷婷| 亚洲一区二区网站| 欧美福利在线| 亚洲三级毛片| 久久黄色影院| 国模一区二区三区| 国产精品亚洲综合色区韩国| 久久久夜夜夜| 亚洲精品美女91| 先锋a资源在线看亚洲| 欧美国产三级| 夜夜精品视频| 欧美精品入口| 国产色综合网| 国内揄拍国内精品久久| 国产精品日韩欧美一区二区| 女人香蕉久久**毛片精品| 亚洲福利电影| 久久青青草综合| 亚洲精品一级| 欧美日韩亚洲免费| 亚洲尤物在线| 亚洲国产欧美不卡在线观看| 久久综合导航| 国产手机视频一区二区| 国产一区二区中文字幕免费看| 夜夜嗨av一区二区三区网站四季av| 久久青青草综合| 国产亚洲欧美另类一区二区三区| 久久九九精品| 国产精品嫩草99av在线| 国产一区视频观看| 久久久精品五月天| 国产精品久久久对白| 国产专区一区| 午夜视频一区| 久久最新视频| 另类av一区二区| 亚洲中字在线|