《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 可編程邏輯 > 業(yè)界動(dòng)態(tài) > 異步FIFO的VHDL設(shè)計(jì)

異步FIFO的VHDL設(shè)計(jì)

2009-02-18
作者:沙燕萍 皇甫偉 曾烈光

  摘? 要: 給出了一種利用格雷碼對(duì)地址編碼的異步FIFO的實(shí)現(xiàn)方法,并給出了VHDL程序,以解決異步讀寫時(shí)鐘引起的問題。

  關(guān)鍵詞: FIFO? 雙口RAM? 格雷碼 VHDL

?

  FIFO(先進(jìn)先出隊(duì)列)是一種在電子系統(tǒng)得到廣泛應(yīng)用的器件,通常用于數(shù)據(jù)的緩存和用于容納異步信號(hào)的頻率或相位的差異。FIFO的實(shí)現(xiàn)通常是利用雙口RAM和讀寫地址產(chǎn)生模塊來實(shí)現(xiàn)的。FIFO的接口信號(hào)包括異步的寫時(shí)鐘(wr_clk)和讀時(shí)鐘(rd_clk)、與寫時(shí)鐘同步的寫有效(wren)和寫數(shù)據(jù)(wr_data)、與讀時(shí)鐘同步的讀有效(rden)和讀數(shù)據(jù)(rd_data)。為了實(shí)現(xiàn)正確的讀寫和避免FIFO的上溢或下溢,通常還應(yīng)該給出與讀時(shí)鐘和寫時(shí)鐘同步的FIFO的空標(biāo)志(empty)和滿標(biāo)志(full)以禁止讀寫操作。

1 異步FIFO功能描述

  圖1給出了FIFO的接口信號(hào)和內(nèi)部模塊圖。

?

?

  由圖1可以看出,寫地址產(chǎn)生模塊根據(jù)寫時(shí)鐘和寫有效信號(hào)產(chǎn)生遞增的寫地址,讀地址產(chǎn)生模塊根據(jù)讀時(shí)鐘和讀有效信號(hào)產(chǎn)生遞增的讀地址。FIFO的操作如下:在寫時(shí)鐘wr_clk的上升沿,當(dāng)wren有效時(shí),將wr_data寫入雙口RAM中寫地址對(duì)應(yīng)的位置中;始終將讀地址對(duì)應(yīng)的雙口RAM中的數(shù)據(jù)輸出到讀數(shù)據(jù)總線上。這樣就實(shí)現(xiàn)了先進(jìn)先出的功能。

  寫地址產(chǎn)生模塊還根據(jù)讀地址和寫地址關(guān)系產(chǎn)生FIFO的滿標(biāo)志。當(dāng)wren有效時(shí),若寫地址+2=讀地址時(shí),full為1;當(dāng)wren無效時(shí),若寫地址+1=讀地址時(shí),full為1。讀地址產(chǎn)生模塊還根據(jù)讀地址和寫地址的差產(chǎn)生FIFO的空標(biāo)志。當(dāng)rden有效時(shí),若寫地址-1=讀地址時(shí),empty為1;當(dāng)rden無效時(shí),若寫地址=讀地址時(shí),empty為1。按照以上方式產(chǎn)生標(biāo)志信號(hào)是為了提前一個(gè)時(shí)鐘周期產(chǎn)生對(duì)應(yīng)的標(biāo)志信號(hào)。

  由于空標(biāo)志和滿標(biāo)志控制了FIFO的操作,因此標(biāo)志錯(cuò)誤會(huì)引起操作的錯(cuò)誤。如上所述,標(biāo)志的產(chǎn)生是通過對(duì)讀寫地址的比較產(chǎn)生的,當(dāng)讀寫時(shí)鐘完全異步時(shí),對(duì)讀寫地址進(jìn)行比較時(shí),可能得出錯(cuò)誤的結(jié)果。例如,在讀地址變化過程中,由于讀地址的各位變化并不同步,計(jì)算讀寫地址的差值,可能產(chǎn)生錯(cuò)誤的差值,導(dǎo)致產(chǎn)生錯(cuò)誤的滿標(biāo)志信號(hào)。若將未滿標(biāo)志置為滿標(biāo)志時(shí),可能降低了應(yīng)用的性能,降低寫數(shù)據(jù)速率;而將滿置標(biāo)志置為未滿時(shí),執(zhí)行一次寫操作,則可能產(chǎn)生溢出錯(cuò)誤,這對(duì)于實(shí)際應(yīng)用來說是絕對(duì)應(yīng)該避免的。空標(biāo)志信號(hào)的產(chǎn)生也可能產(chǎn)生類似的錯(cuò)誤。

2 異步FIFO的改進(jìn)設(shè)計(jì)

  從以上分析中可以看出,異步FIFO之所以會(huì)發(fā)生錯(cuò)誤是因?yàn)樵诘刂纷兓瘯r(shí),由于多位地址各位變化時(shí)間不同,異步時(shí)鐘對(duì)其進(jìn)行采樣時(shí)數(shù)值可能為不同于地址變化前后數(shù)值的其他值,導(dǎo)致產(chǎn)生錯(cuò)誤的空標(biāo)志和滿標(biāo)志,以致于產(chǎn)生FIFO的操作錯(cuò)誤。

格雷碼是一種在相鄰計(jì)數(shù)值之間只有一位發(fā)生變化的編碼方式。可以看出,若讀寫地址采用格雷碼編碼方式,就可以解決上面的問題。

  為了應(yīng)用的靈活,還增加了兩個(gè)標(biāo)志信號(hào),將滿(almost_full)標(biāo)志和空(almost_empty)標(biāo)志分別定義如下:當(dāng)寫地址與讀地址的距離小于某個(gè)預(yù)先定義數(shù)值時(shí),almost_full為1;當(dāng)讀地址與寫地址的距離小于這個(gè)預(yù)先定義的數(shù)值時(shí),almost_empty為1。

3 異步FIFO的VHDL實(shí)現(xiàn)

  硬件描述語言VHDL(Very-high speed IC Hardware Description Language)是一種應(yīng)用于電路設(shè)計(jì)的高層次描述語言,具有行為級(jí)、寄存器傳輸級(jí)和門級(jí)等多層次描述,并且具有簡(jiǎn)單、易讀、易修改和與工藝無關(guān)等優(yōu)點(diǎn)。目前VHDL語言已經(jīng)得到多種EDA工具的支持,綜合工具得到迅速發(fā)展,VHDL語言的行為級(jí)綜合也已經(jīng)得到支持和實(shí)現(xiàn),因此利用VHDL語言進(jìn)行電路設(shè)計(jì)可以節(jié)約開發(fā)成本和周期。

  首先給出格雷碼和普通自然碼之間的轉(zhuǎn)換模塊的VHDL程序。

?????? 程序1:自然碼碼到格雷碼的轉(zhuǎn)換程序

?????? entity norm_to_grey is

????????????? generic(width:integer:=8);

????????????? port(

???????????????????? din:in std_logic_vector(width-1 downto 0);

???????????????????? dout:out std_logic_vector(width-1 downto 0);

?????? end norm_to_grey;

?????? architecture norm_to_grey of norm_to_grey is

?????? begin

????????????? dout<=din xor('0' & din(width-1 downto 1));

?????? end norm_to_grey;

?????? 程序2:格雷碼到自然碼的轉(zhuǎn)換程序

?????? process(din)

?????? variable tempd:std_logic;

?????? begin

???????????????????? for i in width-1 downto 0 loop

?????????????????????????????????? tempd:='0';

???????????????????? for j in width-1 downto i loop

?????????????????????????????????? tempd:=tempd xor din(j);

??????????????????????????? end loop;

???????????????????? dout(i)<=tempd;

????????????? end loop;

?????? end process;

  在給出異步FIFO的VHDL程序之前,先給出一些內(nèi)部信號(hào)的解釋:

????????????? wadd ?????????? ? ——自然碼寫地址

????????????? wadd_grey ???    ——格雷碼寫地址

????????????? wr_radd_grey ????? ——寫時(shí)鐘采樣的格雷碼讀地址

????????????? wr_radd??????????? ——寫時(shí)鐘采樣的自然碼讀地址

????????????? almost_length????? ——產(chǎn)生將滿和將空標(biāo)志的予定義

????????????????????????????????????????? 讀寫地址差值

?????? 程序3:寫地址產(chǎn)生模塊,此程序同時(shí)產(chǎn)生寫地址的自然碼和格雷碼

?????? waddp<=wadd+1;

?????? u1:norm_to_grey

????????????? port map(waddp,wadd_grey_temp);

?????? wadd_process:process(clr,wr_clk)

?????? begin

?????? if clr='0'then

????????????? wadd<=(others=>'0');

????????????? wadd_grey<=(others=>'0');

????????????? elsif wr_clk'event and wr_clk='1'then

????????????? if wren='1'then

????????????? wadd<=waddp;

????????????? wadd_grey<=wadd_grey_temp;

????????????? end if;

?????? end if;

?????? end process;

?????? 程序4:滿標(biāo)志和滿標(biāo)志產(chǎn)生模塊,以8位地址為例。

?????? u2:grey_to_norm

????????????? port map(wr_radd_grey,wr_radd_temp);

?????? process(clr,wr_clk)

?????? begin

?????? if clr='0'then

???????????????????? wr_radd_grey<=(others=>'0');

????????????? wr_radd<=(Others=>‘0’)

?????? elsif wr_clk'event and wr_clk='1'then

?????? wr_radd_grey<=radd_grey;

?????? wr_radd<=wr_radd_temp;

?????? end if;

?????? end process;

?????? wr_compare<=wadd-wr_radd;

?????? full_process:process(clr,wr_clk)

?????? begin

?????? if clr='0'then

?????? full<='0';

elsif wr_clk'event and wr_clk='1'then

if(wren='1')then

????????????? if wr_compare=″11111110″then full<='1';

????????????? else full<='0';

????????????? end if;

????????else

????????????? if wr_compare=″11111111″then full<='1';

????????????? else full<='0';

????????????? end if;

??? end if;

end if;

end process;

almost_full_process:process(clr,wr_clk)

begin

if clr='0' then

????????????? almost_full<='0';

elsif wr_clk'event and wr_clk='1'then

if(wren='1')then

????????????? if wr_compare>(″11111110″-almost_length)then

??????????????????????????? almost_full<='1';

???????????????????? else almost_full<='0';

????????????? end if;

????????????? else

????????????? if wr_compare>(″11111111″-almost_length)then

??????????????????????????? almost_full<='1';

???????????????????? else almost_full<='0';

????????????? end if;

?????? end if;

end if;

end process;

  讀地址的產(chǎn)生模塊和空標(biāo)志及空標(biāo)志的產(chǎn)生模塊與寫地址模塊類似。

4 結(jié)論

  為了解決FIFO的異步操作問題,本文提出了一種利用格雷碼對(duì)地址進(jìn)行編碼的異步FIFO的設(shè)計(jì),并采用VHDL語言進(jìn)行電路設(shè)計(jì),利用Altera公司FLEX10KE系列FPGA得以實(shí)現(xiàn),該電路軟件仿真和硬件實(shí)現(xiàn)已經(jīng)通過驗(yàn)證,并被應(yīng)用到各種電路中。實(shí)踐證明它可以解決由于異步產(chǎn)生的錯(cuò)誤,同時(shí)增加了應(yīng)用的靈活性。

?

參考文獻(xiàn)

1 劉寶琴.數(shù)字電路與系統(tǒng).北京:清華大學(xué)出版社,1993

2 王曉軍.VHDL簡(jiǎn)明教程.北京:清華大學(xué)出版社,1997

本站內(nèi)容除特別聲明的原創(chuàng)文章之外,轉(zhuǎn)載內(nèi)容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點(diǎn)。轉(zhuǎn)載的所有的文章、圖片、音/視頻文件等資料的版權(quán)歸版權(quán)所有權(quán)人所有。本站采用的非本站原創(chuàng)文章及圖片等內(nèi)容無法一一聯(lián)系確認(rèn)版權(quán)者。如涉及作品內(nèi)容、版權(quán)和其它問題,請(qǐng)及時(shí)通過電子郵件或電話通知我們,以便迅速采取適當(dāng)措施,避免給雙方造成不必要的經(jīng)濟(jì)損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。
主站蜘蛛池模板: 1000部拍拍拍18免费网站 | 午夜精品久久久久久毛片| 5g影院天天爽爽| 成人做受120视频试看| 五月婷婷久久综合| 特级西西人体444WWw高清大胆| 国产亚洲精品精品国产亚洲综合| 69免费视频大片| 好紧好大好爽14p| 久久不见久久见免费影院www日本| 欧美乱子伦videos| 人人妻人人澡人人爽欧美精品| 色cccwww| 国产小视频网站| 26uuu另类亚洲欧美日本| 奇米色在线视频| 中文字幕在线看日本大片| 日韩精品欧美一区二区三区| 亚洲欧美日韩综合在线| 精品一区二区三区波多野结衣 | 最好看的2019中文无字幕| 亚洲精品欧美精品中文字幕| 美女免费视频一区二区三区| 国产情侣真实露脸在线| 2020年亚洲天天爽天天噜| 天天看片天天射| 中文字幕乱理片免费完整的| 日韩加勒比一本无码精品| 亚洲成av人片不卡无码| 男人的天堂av网站| 和几个女同事的激情性事 | 日本丰满www色| 亚洲av无码成人精品区狼人影院| 欧美超清videos1080p| 免费人成在线观看播放国产| 羞羞视频网站在线观看| 国产在线精彩视频| 日本片免费观看一区二区| 国产精品视频全国免费观看| archiveofown路段涨奶| 少妇太爽了在线观看|