<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > EDA/PCB > 設計應用 > 羿步FIFO的VHDL設計

羿步FIFO的VHDL設計

作者: 時(shí)間:2006-05-07 來(lái)源:網(wǎng)絡(luò ) 收藏

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

本文引用地址:http://dyxdggzs.com/article/226427.htm

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

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

1 異步FIFO功能描述

圖1給出了FIFO的接口信號和內部模塊圖。

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

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

由于空標志和滿(mǎn)標志控制了FIFO的操作,因此標志錯誤會(huì )引起操作的錯誤。如上所述,標志的產(chǎn)生是通過(guò)對讀寫(xiě)地址的比較產(chǎn)生的,當讀寫(xiě)時(shí)鐘完全異步時(shí),對讀寫(xiě)地址進(jìn)行比較時(shí),可能得出錯誤的結果。例如,在讀地址變化過(guò)程中,由于讀地址的各位變化并不同步,計算讀寫(xiě)地址的差值,可能產(chǎn)生錯誤的差值,導致產(chǎn)生錯誤的滿(mǎn)標志信號。若將未滿(mǎn)標志置為滿(mǎn)標志時(shí),可能降低了應用的性能,降低寫(xiě)數據速率;而將滿(mǎn)置標志置為未滿(mǎn)時(shí),執行一次寫(xiě)操作,則可能產(chǎn)生溢出錯誤,這對于實(shí)際應用來(lái)說(shuō)是絕對應該避免的??諛酥拘盘柕漠a(chǎn)生也可能產(chǎn)生類(lèi)似的錯誤。

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

從以上分析中可以看出,異步FIFO之所以會(huì )發(fā)生錯誤是國為在地址變化時(shí),由于多位地址各位變化時(shí)間不同,異步時(shí)鐘對其進(jìn)行采樣時(shí)數值可能為不同于地址變化喪后數值的其他值,異步產(chǎn)生錯誤的空標志和滿(mǎn)標志,以致于產(chǎn)生FIFO的操作錯誤。

格雷碼是一種在相鄰計數值之間只有一位發(fā)生變化的編碼方式??梢钥闯?,若讀寫(xiě)地址采用格雷碼編碼方式,就可以解決上面的問(wèn)題。

為了應用的靈活,還增加了兩個(gè)標志信號,將滿(mǎn)(almosf_full)標志和空(almost_empty)標志分別定義如下:當寫(xiě)地址與讀地址的距離小于某個(gè)預先定義數值時(shí),almost_full為1;當讀地址與寫(xiě)地址的距離小于這個(gè)預先定義的數值時(shí),almost_empty為1。

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

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

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

程序1:自然碼碼到格雷碼的轉換程序

entity norm_to_gery 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:格雷碼到自然碼的轉換程序

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程序之前,先給出一些內部信號的解釋?zhuān)?/p>

wadd ——自然碼寫(xiě)地址

wadd_grey ——格雷碼寫(xiě)地址

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

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

almost_length ——產(chǎn)生將滿(mǎn)和將空標志的予定義讀寫(xiě)地址差值

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

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:滿(mǎn)標志和滿(mǎn)標志產(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=11111110then full='1';

else full='0';

end if;

else

if wr_compare=11111111then 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)生模塊和空標志及空標志的產(chǎn)生模塊與寫(xiě)地址模塊類(lèi)似。

4 結論

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



評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>