1. gzyueqian
      13352868059
      首頁 > 新聞中心 > > 正文

      一種新型異步FIFO的設計

      更新時間: 2007-11-08 10:29:58來源: 粵嵌教育瀏覽量:927

      引言

        FIFO(先入先出隊列)是一種在電子系統中得到廣范應用的器件。FIFO可以分為同步FIFO和異步FIFO。同步FIFO只在一個時鐘域里工作,比較簡單。而異步FIFO是工作在兩個時鐘域里的FIFO。兩個時鐘域的頻率和相位不同,在一個時鐘域里向FIFO寫數據,在另一個時鐘域里把FIFO中的數據讀走。本文設計的異步FIFO包含Buffer模式和水位可編程等新的想法,能夠滿足使用需求。

      異步FIFO的主要特性

        本文設計的異步FIFO的深度為16,寬度為8位。可以根據具體的應用而改變。

        該異步FIFO有兩種工作模式:FIFO模式和Buffer模式。當FIFO使能(fifo_en置為1)時工作在FIFO模式,當FIFO不使能(fifo_en置為0)時工作在Buffer模式。在FIFO模式時,FIFO的深度為16;在Buffer模式時,FIFO的深度為1。增加Buffer模式可以使該異步FIFO的應用范圍更加廣泛,使用時更加靈活。

        該異步FIFO的水位是可編程的,支持1/8,1/4,1/2,3/4和7/8五種水位。水位的具體含義是:當FIFO中的數據量達到或超過水位時,FIFO的狀態為OVERMARK。例如:在水位配置為1/2的情況下,當FIFO中的數據個數大于或等于8(8為水位與FIFO深度的乘積)時,FIFO的狀態為OVERMARK。這樣,DMA就可以根據FIFO的狀態一次在FIFO中取走一定量的數據。對于支持DMA的外設,該項特性非常有用。

        該異步FIFO在FIFO模式下可以輸出四種FIF0狀態,即FIFO_EMPTY、FIF0_NON_OVERMARK、FIFO_OVERMARK和FIF0_FULL。其中FIFO_NON_0VERMARK是當FIFO中的數據量低于水位時的FIFO狀態。在Buffer模式下只有兩種FIFO狀態,即FIFO_EMPTY和FIFO_FULL。

      異步FIFO的接口設計

        異步FIFO的接口信號圖如圖1所示。wclk為寫時鐘,wreset_n為寫時鐘域里的復位信號,低電平有效。rclk為讀時鐘,rreset_n為讀時鐘域里的復位信號,低電平有效。write為寫使能信號,高電平有效。read為讀使能信號,高電平有效。empty和full為FIFO的空滿狀態。Water_level為FIFO的水位。fifo_states為FIFO的狀態。wdata和rdata分別為寫數據線和讀數據線。

      異步FIFO模塊的劃分

        本文采用自頂向下的方法,將設計劃分為5個模塊:DPRAM模塊、WCTL模塊,RCTL模塊、W2R模塊和R2W模塊。

        其中DPRAM模塊、WCTL模塊和R2W模塊在寫時鐘(wclk)域里;RCTL模塊和W2R模塊在讀時鐘(rclk)域里。R2W模塊和W2P模塊為同步模塊,R2W將讀時鐘域里的信號同步到寫時鐘域里,W2P將寫時鐘域里的信號同步到讀時鐘域里。

      異步FIFO的關鍵部分設計

      空滿狀態的判斷

        對于異步FIFO來說,空滿狀態的設計非常重要。要防止在HFO已經滿的情況下還對FIFO進行寫操作,同時也要注意不要在FIFO已經空的情況下還對其進行讀操作。

        采用將寫指針和讀指針相比較的方法可以更有效地判斷FIFO的空滿狀態。寫指針表示將要對FIFO進行寫操作的寫地址,讀指針表示正在對FIFO進行讀操作時的讀地址。由于本FIFO的深度為16,所以可以將寫指針和讀指針設計為5位的位寬。其中低四位表示地址,位表示狀態。

        為了能更及時地顯示FIFO的空和滿狀態,設定在WCTL模塊進行滿狀態的判斷,在RCTL模塊進行空狀態的判斷。將RCTL模塊輸出的讀指針rptr經R2W模塊同步到寫時鐘域后為rptr_r2w,將rptr_r2w和WCTL模塊中的寫指針比較,若兩個指針的低四位相同而位不同,則FIFO為滿。將WCTL的讀指針wptr經W2R模塊同步到讀時鐘域后為wptr_w2r,將wptr_w2r和RCTL模塊中的讀指針比較,若兩個指針相同,則FIFO為空。

        rptr和wptr都用格雷碼編碼,由于相鄰的兩個格雷碼之間只有一位不同,這樣就可以避免在進行信號同步時,由于在同一個時鐘沿有多個信號變化而引起的問題。

        由于同步后的rptr_r2w比rptr有一定的延時,同步后的wptr_w2r比wptr也有一定的延時。因此,不會出現在FIFO已經滿的情況下還對FIFO進行寫操作和在FIFO已經空的情況下還對其進行讀操作的情況。

        判斷FIFO滿的Verilog代碼如下:

      parameter ASIZE=4;//addr size
      always@(rptr_bin or waddr_tmp)
      begin
      if((rptr_bin[ASIZE-1:0]==waddr_tmp[ASIZE-1:0])&&(rptr_ bin[ASIZE]==(-waddr_tmp[ASIZE])))
      full_temp=1'bl;
      else
      full_temp=1'b0;
      end

      Buffer模式下地址的控制

        當fifo_en為低電平時,FIFO工作在Buffer模式下,當此時寫使能有效且FIFO非滿(讀使能有效且FIFO非空)時,只改變寫指針(或讀指針)的位。這樣就可以保證FIFO的深度為1,像一個8位的寄存器一樣。

        產生FIFO讀地址的Verilog代碼如下:

      always@(waddr_tmp or full_temp or fifo_en or write)
      begin
      if(full_temp==1'bO&&write==l'b1)
      begin
      if(fifo_en==1'b1)//in fifo mode
      waddr_next=waddr_tmp+1'b1;
      else
      //in buffer mode
      Waddr_next=waddr_tmp+5'b1_0000;
      End
      Else
      Waddr_next=waddr_tmp;
      End

      FIFO狀態的確定

        除了空和滿狀態外,在FIFO模式下還有FIFO_NON_OVERMARK和FIFO_OVERMARK兩種狀態。

        判斷這兩種狀態主要是根據FIFO中的數據量和FIFO的水位來判斷的。FIFO中的數據量是通過寫指針減去讀指針得到的。先判斷FIFO是否處于空或滿的狀態,然后再判斷當FIFO中的數據量達到或超過水位時,FIFO的狀態為FIFO_OVERMARK;當FIFO中的數據量低于水位時,FIFO的狀態為FIFO_NON_OVERMARK。

        判斷FIFO狀態的Verilog代碼如下:

      //compute the data number in fifo parameter ASIZE=4;//addr size
      always@(rptr_bin or waddr_next)
      begin
      data_num=waddr_next[ASIZE:0]+(-rptr_bin[ASIZE:0])+1'b1;
      end
      always@(water_level)
      begin
      case(water_level)
      3'b000:data_water_level=4'b0010;//1/8
      3'b001:data_water_level=4'b0100;//1/4
      3'b010:data_water_level=4'b1000;//1/2
      3'b011:data_water_level=4'b1100;//3/4
      3'b100:data_water_level=4'b1110;//7/8
      default:data_water_level=4'b1000;//1/2
      endcase
      end
      //set the fifo_states
      always@(full_temp or empty_temp or data_num or data_water_level)
      begin
      if(empty_temp==1'b1) fifo_states='FIFO_EMPTY;
      else if(full_temp==1'b1) fifo_states='FIFO_FULL;
      else if(data_num>=data_water_level) fifo_states='FIF0_OVERMARK;
      else fifo_States='FIFO_NON_OVERMARK;
      end

      同步模塊的設計

        設計中W2R模塊和R2W模塊為同步模塊。把信號連續通過兩個觸發器可實現同步,這種同步方法十分簡單,且準確性比較高。

      仿真驗證

        本設計用Mentor Graphics公司的ModelSim進行仿真。當FIFO為空的時候,向FIFO連續寫入16個數據,然后再將數據連續讀出的仿真如圖3所示。

      結語

        本文討論了一種異步FIFO的設計方法,它支持Buffer模式,水位可以編程,有四種FIFO狀態。經驗證,該異步FIFO能夠安全地實現數據的跨時鐘域傳遞,有數據緩沖作用,可以應用到UART、SPI等通訊外設中。




      免費預約試聽課

      亚洲另类欧美综合久久图片区_亚洲中文字幕日产无码2020_欧美日本一区二区三区桃色视频_亚洲AⅤ天堂一区二区三区

      
      

      1. 日韩精品秘在线观看 | 丝袜美腿精品国产一区 | 在线日本v二区不卡中文字幕 | 日本道二区免费 | 亚洲成a人片在线观看一级 亚洲欧美国产制服动漫 | 婷婷中文字幕在线免费观看 |