摘要:給出了一個利用格雷碼對地址編碼的羿步FIFO的實現(xiàn)方法,并給出了VHDL程序,以解決異步讀寫時鐘引起的問題。
關鍵詞:FIFO 雙口RAM 格雷碼 VHDL
FIFO(先進先出隊列)是一種在電子系統(tǒng)得到廣泛應用的器件,通常用于數(shù)據(jù)的緩存和用于容納異步信號的頻率或相位的差異。FIFO的實現(xiàn)通常是利用雙口RAM和讀寫地址產(chǎn)生模塊來實現(xiàn)的。FIFO的接口信號包括異步的寫時鐘(wr_clk)和讀時鐘(rd_clk)、與寫時鐘同步的寫有效(wren)和寫數(shù)據(jù)(wr_data)、與讀時鐘同步的讀有效(rden)和讀數(shù)據(jù)(rd_data)。為了實現(xiàn)正確的讀寫和避免FIFO的上溢或下溢,通常還應該給出與讀時鐘和寫時鐘同步的FIFO的空標志(empty)和滿標志(full)以禁止讀寫操作。
1 異步FIFO功能描述
圖1給出了FIFO的接口信號和內(nèi)部模塊圖。
由圖1可以看出,寫地址產(chǎn)生模塊根據(jù)寫時鐘和寫有效信號產(chǎn)生遞增的寫地睛,讀地址產(chǎn)生模塊根據(jù)讀時鐘和讀有效信號產(chǎn)生遞增的讀地址。FIFO的操作如下:在寫時鐘wr_clk的升沿,當wren有效時,將wr_data寫入雙口RAM中寫地址對應的位置中;始終將讀地址對應的雙口RAM中的數(shù)據(jù)輸出到讀數(shù)據(jù)總線上。這樣就實現(xiàn)了先進先出的功能。
寫地址產(chǎn)生模塊還根據(jù)讀地址和寫地址關系產(chǎn)生FIFO的滿標志。當wren有效時,若寫地址+2=讀地址時,full為1;當wren無效時,若寫地址+1=讀地址時,full為1。讀地址產(chǎn)生模塊還根據(jù)讀地址和寫地址的差產(chǎn)生FIFO的空標志。當rden有效時,若寫地址-1=讀地址時,empty為1;當rden無效時,若寫地址=讀地址時,empty為1。按照以上方式產(chǎn)生標志信號是為了提前一個時鐘周期產(chǎn)生對應的標志信號。
由于空標志和滿標志控制了FIFO的操作,因此標志錯誤會引起操作的錯誤。如上所述,標志的產(chǎn)生是通過對讀寫地址的比較產(chǎn)生的,當讀寫時鐘完全異步時,對讀寫地址進行比較時,可能得出錯誤的結果。例如,在讀地址變化過程中,由于讀地址的各位變化并不同步,計算讀寫地址的差值,可能產(chǎn)生錯誤的差值,導致產(chǎn)生錯誤的滿標志信號。若將未滿標志置為滿標志時,可能降低了應用的性能,降低寫數(shù)據(jù)速率;而將滿置標志置為未滿時,執(zhí)行一次寫操作,則可能產(chǎn)生溢出錯誤,這對于實際應用來說是絕對應該避免的�?諛酥拘盘柕漠a(chǎn)生也可能產(chǎn)生類似的錯誤。
2 異步FIFO的改進設計
從以上分析中可以看出,異步FIFO之所以會發(fā)生錯誤是國為在地址變化時,由于多位地址各位變化時間不同,異步時鐘對其進行采樣時數(shù)值可能為不同于地址變化喪后數(shù)值的其他值,異步產(chǎn)生錯誤的空標志和滿標志,以致于產(chǎn)生FIFO的操作錯誤。
格雷碼是一種在相鄰計數(shù)值之間只有一位發(fā)生變化的編碼方式�?梢钥闯�,若讀寫地址采用格雷碼編碼方式,就可以解決上面的問題。
為了應用的靈活,還增加了兩個標志信號,將滿(almosf_full)標志和空(almost_empty)標志分別定義如下:當寫地址與讀地址的距離小于某個預先定義數(shù)值時,almost_full為1;當讀地址與寫地址的距離小于這個預先定義的數(shù)值時,almost_empty為1。
3 異步FIFO的VHDL實現(xiàn)
硬件描述語言VHDL(Very-highspeedICHardware Description Language)是一種應用于電路設計的高層次描述語言,具有行為級、寄存器傳輸級和門級等多層次描述,并且具有簡單、易讀、易修改和與工藝無關等優(yōu)點。目前VHDL語言已經(jīng)得到多種EDA工具的支持,綜合工具得到迅速發(fā)展,VHDL語言的行為級綜合也已經(jīng)得到支持和實現(xiàn),因此利用VHDL語言進行電路設計可以節(jié)約開發(fā)成本和周期。
首先給出格雷碼和普通自然碼之間的轉(zhuǎn)換模塊的VHDL程序。
程序1:自然碼碼到格雷碼的轉(zhuǎn)換程序
entity norm_to_gery is