国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

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

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

FIFO的原理和設(shè)計(jì)

CHANBAEK ? 來源:數(shù)字IC與好好生活的兩居室 ? 作者:除夕之夜啊 ? 2023-03-26 16:00 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

FIFO(First In First Out)是異步數(shù)據(jù)傳輸時(shí)經(jīng)常使用的存儲器。該存儲器的特點(diǎn)是數(shù)據(jù)先進(jìn)先出(后進(jìn)后出)。其實(shí),多位寬數(shù)據(jù)的異步傳輸問題,無論是從快時(shí)鐘到慢時(shí)鐘域,還是從慢時(shí)鐘到快時(shí)鐘域,都可以使用 FIFO 處理。

FIFO 原理

工作流程

(1) 復(fù)位之后,在寫時(shí)鐘和非滿狀態(tài)信號的控制下,數(shù)據(jù)可以寫入 FIFO 中。RAM 的寫地址從 0 開始,每寫一次數(shù)據(jù)寫地址指針加一,指向下一個存儲單元。當(dāng) FIFO 寫滿后,數(shù)據(jù)將不能再寫入,否則數(shù)據(jù)會因覆蓋而丟失。

(2) FIFO 數(shù)據(jù)為非空、或滿狀態(tài)時(shí),在讀時(shí)鐘和非空狀態(tài)信號的控制下,數(shù)據(jù)可以從 FIFO 中讀出。RAM 的讀地址從 0 開始,每讀一次數(shù)據(jù)讀地址指針加一,即指向下一個存儲單元。當(dāng) FIFO 讀空后,就不能再讀數(shù)據(jù),否則讀出的數(shù)據(jù)將是錯誤的。

(3) FIFO 的存儲結(jié)構(gòu)為雙口 RAM,允許讀寫同時(shí)進(jìn)行。FIFO 的讀寫指針是循環(huán)計(jì)數(shù)的,即 讀寫指針對應(yīng)的 RAM 地址超過 FIFO 深度時(shí),會溢出歸零,重新計(jì)數(shù)。

典型異步 FIFO 結(jié)構(gòu)圖如下所示。相關(guān)信號及空滿狀態(tài)的原理將在下面一一說明。

圖片

讀寫時(shí)刻

(1) 關(guān)于寫時(shí)刻,只要 FIFO 中數(shù)據(jù)為非滿狀態(tài),就可以進(jìn)行寫操作;如果 FIFO 為滿狀態(tài),則禁止再寫數(shù)據(jù)。

(2) 關(guān)于讀時(shí)刻,只要 FIFO 中數(shù)據(jù)為非空狀態(tài),就可以進(jìn)行讀操作;如果 FIFO 為空狀態(tài),則禁止再讀數(shù)據(jù)。

(3) 總之,如果一段時(shí)間內(nèi)不間斷的對 FIFO 同時(shí)進(jìn)行讀寫操作,則要求寫 FIFO 速率不能大于讀 FIFO 速率。

讀空狀態(tài)

(1) 復(fù)位時(shí),F(xiàn)IFO 中沒有數(shù)據(jù),空狀態(tài)信號拉高。當(dāng) FIFO 被寫入數(shù)據(jù)后,空狀態(tài)信號拉低,表示非空狀態(tài)。當(dāng)讀數(shù)據(jù)地址追趕上寫地址,即讀寫地址都相等時(shí),F(xiàn)IFO 為空狀態(tài)。

(2) 因?yàn)?FIFO 是異步的,所以讀寫地址進(jìn)行比較時(shí),需要同步打拍邏輯,就需要耗費(fèi)一定的時(shí)間。因此,空狀態(tài)的指示信號不是實(shí)時(shí)的,會有一定的延時(shí)。如果在這段延遲時(shí)間內(nèi)又有新的數(shù)據(jù)寫入 FIFO,就會出現(xiàn)空狀態(tài)指示信號有效,但實(shí)際上 FIFO 中存在數(shù)據(jù)的現(xiàn)象。

(3) 嚴(yán)格來講該空狀態(tài)指示是錯誤的。但是產(chǎn)生空狀態(tài)的意義在于防止讀操作對空狀態(tài)的 FIFO 進(jìn)行數(shù)據(jù)讀取。產(chǎn)生空狀態(tài)信號時(shí),實(shí)際 FIFO 中有數(shù)據(jù),相當(dāng)于提前判斷了空狀態(tài)信號,此時(shí)不再進(jìn)行讀 FIFO 操作也是安全的。所以,該設(shè)計(jì)從應(yīng)用上來說是沒有問題的。

(4) 牢記,讀空狀態(tài)信號,是在讀時(shí)鐘域產(chǎn)生的。

寫滿狀態(tài)

(1) 復(fù)位時(shí),F(xiàn)IFO 中沒有數(shù)據(jù),滿信號是拉低的,表示 FIFO 中的數(shù)據(jù)沒有寫滿 (其實(shí) FIFO 是空的 )。當(dāng) FIFO 開始寫數(shù)據(jù)且讀操作不進(jìn)行或讀速率相對較慢時(shí),只要寫數(shù)據(jù)地址超過讀數(shù)據(jù)地址的 FIFO 深度時(shí),便會產(chǎn)生滿狀態(tài)信號。此時(shí)寫地址和讀地址也是相等的,但是意義是不一樣的。

圖片

(2) 此時(shí)經(jīng)常使用多余的 1bit 分別當(dāng)做讀寫地址的拓展位,來區(qū)分讀寫地址相同的時(shí)候,F(xiàn)IFO 的狀態(tài)是空還是滿狀態(tài)。當(dāng)讀寫地址與拓展位均相同的時(shí)候,表明讀寫數(shù)據(jù)的數(shù)量是一致的,則此時(shí) FIFO 是空狀態(tài)。如果讀寫地址相同,拓展位相反,表明寫數(shù)據(jù)的數(shù)量已經(jīng)超過讀數(shù)據(jù)數(shù)量的一個 FIFO 深度了,此時(shí) FIFO 是滿狀態(tài)。當(dāng)然,此條件成立的前提是空狀態(tài)禁止讀操作、滿狀態(tài)禁止寫操作。

(3) 同理,由于異步延遲邏輯的存在,滿狀態(tài)信號也不是實(shí)時(shí)的。但是也相當(dāng)于提前判斷了滿狀態(tài)信號,此時(shí)不再進(jìn)行寫 FIFO 操作也不會影響應(yīng)用的正確性。

(4) 牢記,寫滿狀態(tài)信號,是在寫時(shí)鐘域產(chǎn)生的。

格雷碼

(1) 當(dāng)讀寫時(shí)鐘都是同一個時(shí)鐘時(shí),此時(shí) FIFO 是同步的,直接對讀寫指針進(jìn)行比對,產(chǎn)生空、滿信號即可。

(2) 當(dāng)讀寫時(shí)鐘是異步的時(shí)候,因?yàn)樽x時(shí)鐘域產(chǎn)生讀空信號,寫時(shí)鐘域產(chǎn)生寫滿信號,所以產(chǎn)生空邏輯信號時(shí),需要將寫指針同步到讀時(shí)鐘域,再與讀指針進(jìn)行比較;產(chǎn)生滿邏輯信號時(shí),需要將讀指針同步到寫時(shí)鐘域,再與寫指針進(jìn)行比較。

(3) 因?yàn)樽x寫指針的信號寬度一般都是大于 1bit 的,所以同步處理時(shí)不能直接對多位寬的讀寫指針進(jìn)行延遲打拍,需要借助格雷碼對讀寫指針進(jìn)行轉(zhuǎn)換,保證每一個周期內(nèi)地址指針只有 1bit 變化,然后再進(jìn)行延遲打拍的同步處理。

(4) 4bit 的二進(jìn)制碼與格雷碼之間的變化關(guān)系如下所示,其中 ⊕ 表示異或操作符。由圖可知,二進(jìn)制碼對應(yīng)的十六進(jìn)制碼遞增時(shí),二進(jìn)制碼對應(yīng)的相鄰的兩個格雷碼之間只有 1bit 數(shù)據(jù)有變化。當(dāng)多位寬信號每次只有 1bit 數(shù)據(jù)變化時(shí),可以使用延遲打拍的方法對其進(jìn)行同步處理。

圖片

(5) 下面對空邏輯的產(chǎn)生進(jìn)行舉例說明:

5.1) 首先需要對寫指針 waddr 進(jìn)行組合邏輯的格雷碼變換 waddr_gray。

5.2) 為了保證 waddr_gary 在讀時(shí)鐘域每次被采集時(shí)只有 1bit 數(shù)據(jù)變化,則 waddr_gray 需要在其源時(shí)鐘域即寫時(shí)鐘域進(jìn)行一拍緩存 waddr_gray_d。因?yàn)?waddr 到 waddr_gray 的組合邏輯變換時(shí),每次兩者之間不只是有 1bit 變化的。

5.3) 在讀時(shí)鐘域?qū)?waddr_gray_d 進(jìn)行打拍同步,得到讀時(shí)鐘域同步后的寫指針為 waddr_gray_rclk。

5.4) 根據(jù)格雷碼變換規(guī)則,空信號有效時(shí)二進(jìn)制碼相等的讀寫指針,變?yōu)楦窭状a之后仍然相等。所以直接使用 waddr_gray_rclk 與讀指針進(jìn)行組合邏輯變換后的格雷碼進(jìn)行相等比較,即可產(chǎn)生讀空信號邏輯。

5.5) 需要說明的是,滿信號有效時(shí),帶有拓展位的讀寫指針高 1bit 相反、低位相同。所以變?yōu)楦窭状a之后,寫滿信號產(chǎn)生的條件,則是讀寫指針高 2bit 相反、低位相同 (請讀者思考一下為什么?)。

FIFO 設(shè)計(jì)

設(shè)計(jì)要求

為設(shè)計(jì)應(yīng)用于各種場景的 FIFO,這里對設(shè)計(jì)提出如下要求:

(1) FIFO 是異步的,即讀寫控制信號來自不同的時(shí)鐘域。

(2) FIFO 深度、寬度參數(shù)化,輸出空、滿狀態(tài)信號,并輸出一個可配置的滿狀態(tài)信號。當(dāng) FIFO 內(nèi)部數(shù)據(jù)達(dá)到設(shè)置的參數(shù)數(shù)量時(shí),該信號拉高,此時(shí)需要對格雷碼進(jìn)行反解碼。

(3) 輸入數(shù)據(jù)和輸出數(shù)據(jù)位寬可以不一致,但要保證寫數(shù)據(jù)、寫地址位寬與讀數(shù)據(jù)、讀地址位寬的一致性。例如寫數(shù)據(jù)位寬 8bit,寫地址位寬為 6bit(64 個數(shù)據(jù))。如果輸出數(shù)據(jù)位寬要求 32bit,則輸出地址位寬應(yīng)該為 4bit(16 個數(shù)據(jù))。

雙口 RAM 設(shè)計(jì)

RAM 地址位寬、數(shù)據(jù)位寬等端口參數(shù)可配置,讀寫位寬一致。實(shí)際中 RAMDP(Dual Port) 是需要使用 Memory IP 的,這里創(chuàng)建的 RAM 并沒有考慮到異步問題。

Verilog 描述如下。

module  ramdp
  #(  parameter       AW     = 5 ,
      parameter       DW     = 16
   )
   (
    input                   CLK_WR , //寫時(shí)鐘
    input [DW-1:0]          D ,      //寫數(shù)據(jù)
    input                   WR_EN ,  //寫使能
    input [AW-1:0]          ADDR_WR ,//寫地址
    input                   CLK_RD , //讀時(shí)鐘
    input                   RD_EN ,  //讀使能
    input [AW-1:0]          ADDR_RD ,//讀地址
    output reg [DW-1:0]     Q        //讀數(shù)據(jù)
    );

   reg [DW-1:0]                 mem [(1<

計(jì)數(shù)器設(shè)計(jì)

計(jì)數(shù)器用于產(chǎn)生讀寫地址信息,位寬可配置,不需要設(shè)置結(jié)束值,讓其溢出后自動重新計(jì)數(shù)即可。同時(shí)該計(jì)數(shù)器還具有格雷碼轉(zhuǎn)換與緩存的功能。

Verilog 描述如下。

module  ccnt_gray
  #(parameter W = 32'd8
    )
   (
    input              rstn ,
    input              clk ,
    input              en ,
    output [W-1:0]     cnt ,
    output [W-1:0]     cnt_gray ,
    output [W-1:0]     cnt_gray_d
    );


   reg [W-1:0]          cnt_r ;
   always @(posedge clk or negedge rstn) begin
      if (!rstn) begin
         cnt_r        <= 'b0 ;
      end
      else if (en) begin
         cnt_r        <= cnt_r + 1'b1 ;
      end
   end
   assign cnt = cnt_r ;
   assign cnt_gray      = cnt ^ (cnt>>1);


   reg [W-1:0]          cnt_gray_buf ;
   always @(posedge clk or negedge rstn) begin
      if (!rstn) begin
         cnt_gray_buf   <= 'b0 ;
      end
      else begin
         cnt_gray_buf   <= cnt_gray ;
      end
   end
   assign cnt_gray_d = cnt_gray_buf ;


endmodule

多位寬數(shù)據(jù)同步設(shè)計(jì)

讀寫指針進(jìn)行格雷碼變換并緩存后,每一個計(jì)數(shù)周期內(nèi)地址指針只有 1bit 變化,所以可以直接使用延遲打拍的方法進(jìn)行同步。數(shù)據(jù)寬度、同步級數(shù)均可配置。

Verilog 描述如下。

module  data1c_sync
  #(parameter DW    = 8,
    parameter STAGE = 3
    )
   (
    input              rstn ,
    input              clk ,
    input [DW-1:0]     data_in ,
    output [DW-1:0]    data_out
    );


   reg [DW-1: 0]       data_r [STAGE-1: 0];
   integer             i ;
   always @(posedge clk or negedge rstn) begin
      if (!rstn) begin
         for (i=0; i

格雷碼反解碼

因?yàn)樵?FIFO 還存在一個可配置的滿狀態(tài)信號輸出,所以需要對格雷碼同步后的讀指針進(jìn)行反解碼,然后在寫時(shí)鐘域與寫指針進(jìn)行比較,以判讀當(dāng)前 FIFO 中數(shù)據(jù)的具體個數(shù)。

module  gray_decode
  #(parameter W = 32'd8
    )
   (
    input [W-1:0]      gray ,
    output [W-1:0]     gray_decode
    );


   integer             i ;
   reg [W-1:0] gray_decode_r ;
   always @(*) begin
      gray_decode_r[W-1]        = gray[W-1];
      for (i=W-2; i>=0; i=i-1) begin
         gray_decode_r[i]     = gray_decode_r[i+1] ^ gray[i];
      end
   end


   assign gray_decode = gray_decode_r ;
endmodule

FIFO 設(shè)計(jì)

該模塊為 FIFO 的主體部分,產(chǎn)生讀寫控制邏輯,包括讀寫指針、讀寫有效時(shí)刻以及空、滿、可編程滿狀態(tài)的邏輯。

實(shí)際上此模塊已經(jīng)是典型的 FIFO 設(shè)計(jì),有需要的讀者可以直接使用該層次的 FIFO 代碼進(jìn)行測試,甚至應(yīng)用到自己的設(shè)計(jì)之中。

module  fifo
    #(  parameter       DW        = 16 ,
        parameter       DEPTH     = 32 ,
        parameter       PROG_DEPTH = 16) //可設(shè)置深度
    (
        input                   rstn,  //讀寫使用一個復(fù)位
        input                   wclk,  //寫時(shí)鐘
        input                   wren,  //寫使能
        input [DW-1: 0]         wdata, //寫數(shù)據(jù)
        output                  wfull,    //寫滿標(biāo)志
        output                  prog_full, //可編程滿標(biāo)志
        input                   rclk,  //讀時(shí)鐘
        input                   rden,  //讀使能
        output [DW-1 : 0]       rdata, //讀數(shù)據(jù)
        output                  rempty   //讀空標(biāo)志
     );


   localparam AW = log2b(DEPTH);
   //==================== push/wr counter ===============
   //wptr/waddr using one more bit to indict new-loop
   wire [AW:0]          waddr ;
   wire [AW:0]          waddr_gray ;
   wire [AW:0]          waddr_gray_d ;
   ccnt_gray        #(.W(AW+1))
   u_push_cnt(
      .rstn             (rstn),
      .clk              (wclk),
      .en               (wren && !wfull), //full 時(shí)禁止寫
      .cnt              (waddr),
      .cnt_gray         (waddr_gray),
      .cnt_gray_d       (waddr_gray_d)
      );


   // sync: wptr from wclk to rclk
   wire [AW:0]          waddr_gray_rclk ;
   data1c_sync   #(.DW(AW+1), .STAGE(3))
   u_waddr_to_rclk
   (
      .rstn        (rstn),
      .clk         (rclk),
      .data_in     (waddr_gray_d),
      .data_out    (waddr_gray_rclk)
    );
   //============== pop/rd counter ===================
   wire [AW:0]          raddr ;
   wire [AW:0]          raddr_gray ;
   wire [AW:0]          raddr_gray_d ;
   ccnt_gray        #(.W(AW+1))
   u_pop_cnt(
      .rstn             (rstn),
      .clk              (rclk),
      .en               (rden && !rempty), //full 時(shí)禁止寫
      .cnt              (raddr),
      .cnt_gray         (raddr_gray),
      .cnt_gray_d       (raddr_gray_d)
      );
   // sync: rdtr from rclk to wclk
   wire [AW:0]          raddr_gray_wclk ;
   data1c_sync   #(.DW(AW+1), .STAGE(3) )
   u_raddr_to_wclk
   (
       .rstn        (rstn),
       .clk         (wclk),
       .data_in     (raddr_gray_d),
       .data_out    (raddr_gray_wclk)
    );
   //============== full/empty logic ===================
   //(1) empty logic
   assign rempty = (raddr_gray == waddr_gray_rclk);




   //(2) full logic
   assign wfull  = (waddr_gray[AW:AW-1] == ~raddr_gray_wclk[AW:AW-1]) &&
                   (waddr_gray[AW-2:0] == raddr_gray_wclk[AW-2:0]) ;


   //(3) porgrammable full
   //waddr gray decode
   wire [AW:0]          raddr_degray_wclk ;
   gray_decode  #(.W(AW+1))
   u_waddr_degray_rclk (
       .gray            (raddr_gray_wclk),
       .gray_decode     (raddr_degray_wclk)
     );
   //prog full
   wire [AW:0]  waddr_delta = waddr >= raddr_degray_wclk ?
                              (waddr - raddr_degray_wclk) :
                              ((1<<(AW+1)) + waddr - raddr_degray_wclk) ;
   assign       prog_full   = waddr_delta >= PROG_DEPTH ;


   //雙口 ram 例化
   ramdp     #(.AW(AW), .DW (DW))
   u_ramdp
     (
      .CLK_WR          (wclk),
      .WR_EN           (wren & !wfull), //寫滿時(shí)禁止寫
      .ADDR_WR         (waddr[AW-1:0]),
      .D               (wdata[DW-1:0]),
      .CLK_RD          (rclk),
      .RD_EN           (rden & !rempty), //讀空時(shí)禁止讀
      .ADDR_RD         (raddr[AW-1:0]),
      .Q               (rdata[DW-1:0])
      );


   function  integer log2b ;
      input     integer depth ;
      for (log2b=0; (1<

FIFO 調(diào)用

下面可以調(diào)用設(shè)計(jì)的 FIFO,完成多位寬數(shù)據(jù)傳輸?shù)漠惒教幚怼?/p>

寫數(shù)據(jù)位寬為 4bit,寫深度為 32。

讀數(shù)據(jù)位寬為 16bit,讀深度為 8,可配置 full 深度為 16。

該模塊只是 FIFO 的一個具體應(yīng)用,用于數(shù)據(jù)的異步傳輸、緩存與整合。

//ensure write rate < read rate
module  fifo_buf
  #(  parameter       DWI        = 4 , //width 4
      parameter       AWI        = 5 , //depth 32
      parameter       DWO        = 16 ,
      parameter       AWO        = 3 ,
      parameter       PROG_DEPTH = 16
   )
   (
      input                     rstn,  //讀寫使用一個復(fù)位
      //data in
      input                     din_clk,  //寫時(shí)鐘
      input                     din_en,  //寫使能
      input [DWI-1: 0]          din, //寫數(shù)據(jù)
      //data out
      input                     dout_clk,  //讀時(shí)鐘
      output                    dout_valid,  //讀使能
      output [DWO-1 : 0]        dout //讀數(shù)據(jù)
    );


   wire                         wfull ;    //寫滿標(biāo)志
   wire                         prog_full ; //可編程滿標(biāo)志
   wire                         rempty ;   //讀空標(biāo)志
   wire [DWI-1:0]               rdata_fifo ;
   wire                         rden_fifo ;
   fifo  #(.DW(DWI), .DEPTH(1<

testbench

testbench 描述如下,用于測試空、滿邏輯信號,以及讀寫操作。測試中只列舉了輸入數(shù)據(jù)位寬小于輸出數(shù)據(jù)位寬的情景。

`timescale 1ns/1ns
`define SMALL2BIG


module test ;
`ifdef SMALL2BIG
   reg          rstn ;
   reg          clk_slow, clk_fast ;
   reg [3:0]    din ;
   reg          din_en ;
   wire [15:0]  dout ;
   wire         dout_valid ;


   //reset
   initial begin
      clk_slow  = 0 ;
      clk_fast  = 0 ;
      rstn      = 0 ;
      #50 rstn  = 1 ;
   end


   //讀時(shí)鐘 clock_slow 較快于寫時(shí)鐘 clk_fast 的 1/4
   //保證讀數(shù)據(jù)稍快于寫數(shù)據(jù)
   parameter CYCLE_WR = 40 ;
   always #(CYCLE_WR/2/4) clk_fast = ~clk_fast ;
   always #(CYCLE_WR/2-1) clk_slow = ~clk_slow ;


   //data generate
   initial begin
      din       = 16'h4321 ;
      din_en    = 0 ;
      wait (rstn) ;
      //(1) 測試 full、prog_full、empyt 信號
      force test.u_data_buf.u_fifo.rden = 1'b0 ;
      repeat(32) begin
         @(negedge clk_fast) ;
         din_en = 1'b1 ;
         din    = {$random()} % 16;
      end
      @(negedge clk_fast) din_en = 1'b0 ;


      //(2) 測試數(shù)據(jù)讀寫
      #500 ;
      rstn = 0 ;
      #10 rstn = 1 ;
      release test.u_data_buf.u_fifo.rden ;
      repeat(60) begin
         @(negedge clk_fast) ;
         if (!test.u_data_buf.u_fifo.wfull) begin
            din_en = 1'b1 ;
            din    = {$random()} % 16;
         end
         else begin
            din_en = 1'b0 ;
         end
      end


      //(3) 停止讀取再一次測試 empyt、full、prog_full 信號
      #800 ;
      force test.u_data_buf.u_fifo.rden = 1'b0 ;
      repeat(18) begin
         @(negedge clk_fast) ;
         din_en = 1'b1 ;
         din    = {$random()} % 16;
      end
   end


   fifo_buf #(.DWI(4), .AWI(5), .DWO(16), .AWO(3), .PROG_DEPTH(16))
     u_data_buf(
        .rstn           (rstn),
        .din_clk        (clk_fast),
        .din            (din),
        .din_en         (din_en),
        .dout_clk       (clk_slow),
        .dout           (dout),
        .dout_valid     (dout_valid));


`else // !`ifdef SMALL2BIG
`endif


   //stop sim
   initial begin
      forever begin
         #100;
         if ($time >= 5000)  $finish ;
      end
   end


endmodule

仿真分析

根據(jù) testbench 中的 3 步測試激勵,分析如下:

測試 (1) : FIFO 端口及一些內(nèi)部信號時(shí)序結(jié)果如下。

由圖可知,F(xiàn)IFO 內(nèi)部開始寫數(shù)據(jù),空狀態(tài)信號 rempty 拉低(紅色 M1 ) 之前有一段時(shí)間延遲,這是寫地址同步延時(shí)導(dǎo)致的。

由于此時(shí)沒有進(jìn)行讀 FIFO 操作,所以 prog_full 與 full 拉高 (黃色 M2 與綠色 M3) 幾乎沒有延遲。

圖片

測試 (2) : FIFO 同時(shí)進(jìn)行讀寫時(shí),fifo 與 fifo_buf 模塊的端口信號如下所示。

由圖可知,數(shù)據(jù)開始傳輸時(shí),fifo 模塊的等位寬數(shù)據(jù)輸出、fifo_buf 整合之后的數(shù)據(jù)輸出,均與輸入數(shù)據(jù)對應(yīng),沒有傳輸錯誤。

圖片

測試 (3) :整個 FIFO 讀寫行為及讀停止的時(shí)序仿真圖如下所示。

由圖可知,讀寫操作同時(shí)進(jìn)行時(shí),wfull 信號會不斷翻轉(zhuǎn) (M4 時(shí)刻之前),這是因?yàn)榇藭r(shí) fifo 的使用方法是非滿即寫,非空即讀。

M4 時(shí)刻禁止寫操作后(din_en 恒為 0),由于讀一致存在,所以 full 信號會拉低并保持,表示 fifo 中數(shù)據(jù)一直未滿。而 prog_full 也會相繼拉低 (M5 時(shí)刻),表示 FIFO 中的數(shù)據(jù)已經(jīng)低于配置的數(shù)目。

當(dāng)恢復(fù)寫操作后 (din_en 恒為 1,對應(yīng) M6 時(shí)刻),prog_full 與 full 信號相繼拉高。

圖片

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

    關(guān)注

    39

    文章

    7738

    瀏覽量

    171650
  • fifo
    +關(guān)注

    關(guān)注

    3

    文章

    407

    瀏覽量

    45742
  • 計(jì)數(shù)器
    +關(guān)注

    關(guān)注

    32

    文章

    2315

    瀏覽量

    98170
  • 時(shí)鐘
    +關(guān)注

    關(guān)注

    11

    文章

    1971

    瀏覽量

    134982
  • 指針
    +關(guān)注

    關(guān)注

    1

    文章

    484

    瀏覽量

    71843
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    FIFO隊(duì)列原理簡述

    FIFO是隊(duì)列機(jī)制中最簡單的,每個接口上只有一個FIFO隊(duì)列,表面上看FIFO隊(duì)列并沒有提供什么QoS保證,甚至很多人認(rèn)為FIFO嚴(yán)格意義上不算做一種隊(duì)列技術(shù),實(shí)則不然,
    發(fā)表于 07-10 09:22 ?2244次閱讀

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

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

    AXI接口FIFO簡介

    AXI接口FIFO是從Native接口FIFO派生而來的。AXI內(nèi)存映射接口提供了三種樣式:AXI4、AXI3和AXI4-Lite。除了Native接口FIFO支持的應(yīng)用外,AXI FIFO
    的頭像 發(fā)表于 03-17 10:31 ?2119次閱讀
    AXI接口<b class='flag-5'>FIFO</b>簡介

    什么是fifo

    1.什么是FIFOFIFO是英文First In First Out 的縮寫,是一種先進(jìn)先出的數(shù)
    發(fā)表于 07-22 16:00 ?0次下載

    FIFO的操作

    系統(tǒng)在上電復(fù)位時(shí),SPI工作在標(biāo)準(zhǔn)SPI模式,禁止FIFO功能。FIFO的寄存器SPIFFTX、SPIFFRX和SPIFFCT不起作用。通過將SPIFFTX寄存器中的SPIFFEN的位置為1,使能FIFO模式。SPIRST能在操
    發(fā)表于 09-29 10:38 ?33次下載

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

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

    什么是fifo fifo什么意思 GPIF和FIFO的區(qū)別

    什么是fifo (First Input First Output,先入先出隊(duì)列)這是一種傳統(tǒng)的按序執(zhí)行方法,先進(jìn)入的指令先完成并引退,跟著才執(zhí)行第二條指令。1.什么是FIFO
    發(fā)表于 12-20 13:51 ?1.3w次閱讀

    最經(jīng)典的FIFO原理

    最經(jīng)典的FIFO原理,詳細(xì)講述了FIFO的原理,適合入門新手,仔細(xì)分析閱讀,也適合高手查閱。
    發(fā)表于 05-03 15:15 ?0次下載

    如何配置自己需要的FIFOFIFO配置全攻略

    配置FIFO的方法有兩種: 一種是通過QUARTUS II 中TOOLS下的MegaWizard Plug-In Manager 中選擇FIFO參數(shù)編輯器來搭建自己需要的FIFO,這是自動生成
    發(fā)表于 07-20 08:00 ?17次下載
    如何配置自己需要的<b class='flag-5'>FIFO</b>?<b class='flag-5'>FIFO</b>配置全攻略

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

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

    異步fifo詳解

    異步fifo詳解 一. 什么是異步FIFO FIFO即First in First out的英文簡稱,是一種先進(jìn)先出的數(shù)據(jù)緩存器,與普通存儲器的區(qū)別在于沒有外部讀寫的地址線,缺點(diǎn)是只能順序的讀取
    的頭像 發(fā)表于 12-12 14:17 ?5554次閱讀

    FIFO設(shè)計(jì)—同步FIFO

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

    FIFO設(shè)計(jì)—異步FIFO

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

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

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

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

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