色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 異步FIFO的VHDL設(shè)計(jì)

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

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

          關(guān)鍵詞:

          雙口RAM 格雷碼

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

          1 FIFO功能描述

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

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

          寫(xiě)地址產(chǎn)生模塊還根據(jù)讀地址和寫(xiě)地址關(guān)系產(chǎn)生FIFO的滿標(biāo)志。當(dāng)wren有效時(shí),若寫(xiě)地址+2=讀地址時(shí),full為1;當(dāng)wren無(wú)效時(shí),若寫(xiě)地址+1=讀地址時(shí),full為1。讀地址產(chǎn)生模塊還根據(jù)讀地址和寫(xiě)地址的差產(chǎn)生FIFO的空標(biāo)志。當(dāng)rden有效時(shí),若寫(xiě)地址-1=讀地址時(shí),empty為1;當(dāng)rden無(wú)效時(shí),若寫(xiě)地址=讀地址時(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)生是通過(guò)對(duì)讀寫(xiě)地址的比較產(chǎn)生的,當(dāng)讀寫(xiě)時(shí)鐘完全異步時(shí),對(duì)讀寫(xiě)地址進(jìn)行比較時(shí),可能得出錯(cuò)誤的結(jié)果。例如,在讀地址變化過(guò)程中,由于讀地址的各位變化并不同步,計(jì)算讀寫(xiě)地址的差值,可能產(chǎn)生錯(cuò)誤的差值,導(dǎo)致產(chǎn)生錯(cuò)誤的滿標(biāo)志信號(hào)。若將未滿標(biāo)志置為滿標(biāo)志時(shí),可能降低了應(yīng)用的性能,降低寫(xiě)數(shù)據(jù)速率;而將滿置標(biāo)志置為未滿時(shí),執(zhí)行一次寫(xiě)操作,則可能產(chǎn)生溢出錯(cuò)誤,這對(duì)于實(shí)際應(yīng)用來(lái)說(shuō)是絕對(duì)應(yīng)該避免的??諛?biāo)志信號(hào)的產(chǎn)生也可能產(chǎn)生類似的錯(cuò)誤。

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

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

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

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

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

          硬件描述語(yǔ)言(Very-high speed IC

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

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

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

          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:格雷碼到自然碼的轉(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 ——自然碼寫(xiě)地址

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

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

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

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

          本文引用地址:http://cafeforensic.com/article/201706/349499.htm


          程序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:滿標(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=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)生模塊和空標(biāo)志及空標(biāo)志的產(chǎn)生模塊與寫(xiě)地址模塊類似。

          4 結(jié)論

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



          關(guān)鍵詞: 異步 FIFO VHDL 設(shè)計(jì)

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉