国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

VHDL設(shè)計(jì)中變量和信號(hào)探討

2014-02-25 10:52:18劉琳吳維林
電腦知識(shí)與技術(shù) 2014年1期

劉琳 吳維林

摘要:隨著航天產(chǎn)品中越來越廣泛使用FPGA器件,熟練掌握VHDL硬件語言對(duì)于電路設(shè)計(jì)顯得至關(guān)重要。變量和信號(hào)是VHDL語言中最為常用和最重要的兩種數(shù)據(jù)對(duì)象,該文針對(duì)變量和信號(hào)的重要區(qū)別和使用技巧展開了探討,并結(jié)合實(shí)際FPGA測試中的實(shí)例進(jìn)行了詳細(xì)的闡述和仿真驗(yàn)證。

關(guān)鍵詞:FPGA;VHDL;變量和信號(hào)

中圖分類號(hào):TP31 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2014)01-0219-04

1 概述

隨著EDA技術(shù)的發(fā)展,越來越多的航天產(chǎn)品中開始使用FPGA器件, FPGA設(shè)計(jì)中使用的硬件語言VHDL語言由于發(fā)展的較早,語法嚴(yán)格,非常適合大規(guī)模系統(tǒng)的設(shè)計(jì),被航天產(chǎn)品設(shè)計(jì)師廣泛應(yīng)用。

變量和信號(hào)是VHDL語言中最為常用和最重要的兩種數(shù)據(jù)對(duì)象,在電路設(shè)計(jì)中正確應(yīng)用變量和信號(hào)是成功完成電路設(shè)計(jì)的重要因素。在對(duì)航天型號(hào)FPGA產(chǎn)品的評(píng)測過程中發(fā)現(xiàn),設(shè)計(jì)師在使用VHDL語言時(shí)會(huì)對(duì)變量和信號(hào)的使用把握不準(zhǔn)確,導(dǎo)致一些不必要的問題發(fā)生。因此,深入研究VHDL中變量和信號(hào)的基本特性和應(yīng)用特點(diǎn)十分重要,對(duì)于提高FPGA的設(shè)計(jì)效率有著重要的意義。

2 變量和信號(hào)的主要區(qū)別

信號(hào)、變量和常量是VHDL中常用的2類數(shù)據(jù)對(duì)象。變量非常接近軟件高級(jí)語言中的變量、而信號(hào)則具備更多的硬件特征,能對(duì)應(yīng)硬件電路中的實(shí)際連線,是VHDL語言所特有的。信號(hào)和變量的用法和區(qū)別主要體現(xiàn)在以下幾個(gè)方面。

1)變量是一個(gè)局部量,只能在進(jìn)程和子程序中聲明和使用。信號(hào)是一個(gè)全局量,使用和定義范圍是實(shí)體、結(jié)構(gòu)體和程序包,它具有全局性特征。例如,在實(shí)體中定義的信號(hào)可以被該實(shí)體中所有的進(jìn)程使用。因此,信號(hào)可以作為信息交流通道在不同進(jìn)程之間傳遞信息。

2)變量和信號(hào)的賦值語句不同,前者為“:=”,后者為“<=”。

3)進(jìn)程中的敏感列表中可以有信號(hào),不能有變量。

4)變量的賦值不存在延時(shí),是立即發(fā)生的,而信號(hào)賦值都是有延時(shí)的。在一個(gè)進(jìn)程中,如果對(duì)同一個(gè)信號(hào)多次賦值,僅最后一次賦值是有效的,如果對(duì)一個(gè)變量進(jìn)行多次賦值,那么每次賦值都是有效的,變量的值在再次賦值之前一直保持不變。

結(jié)合以下的幾個(gè)例子我們可以體會(huì)到變量和信號(hào)在賦值時(shí)的不同之處。在程序1中,由于信號(hào)賦值有延時(shí),即進(jìn)程結(jié)束時(shí)賦新值,所以結(jié)果是a和b 的值互換;而程序2中,由于變量賦值是立即更新的,所以結(jié)果是a和b的值均為b。

程序1:

architecture xinhao_arch of xinhao is

signal a,b : std_logic; —信號(hào)

begin

process (a,b)

begin

a <= b;

b <= a;

end process;

end xinhao_arch ;

程序2:

architecture bianliang_arch of bianliang is

begin

process

variable a,b : std_logic;—變量

begin

a := b;

b := a;

end process;

end bianliang_arch ;

程序3和程序4是將輸入信號(hào)din用信號(hào)賦值和變量賦值的方法分別賦值給輸出信號(hào)dout。我們分別比較兩種情況下的區(qū)別。

程序3:

entity xh is

port(

din : in std_logic;—輸入信號(hào)

clk : in std_logic;—時(shí)鐘信號(hào)

dout : out std_logic –輸出信號(hào)

);

end xh;

architecture xh_a of xh is

signal da,db: std_logic;—信號(hào)

begin

process(clk)

begin

if rising_edge(clk) then

da <= din;

db <= da;

end if;

end process ;

dout <= db;

end xh_a;

在程序3中,由于信號(hào)的賦值不是即時(shí)的,輸入端口din的值在賦給輸出端口dout時(shí)經(jīng)過了2個(gè)時(shí)鐘延時(shí),所以它由2個(gè)D觸發(fā)器構(gòu)成,如圖1和圖2。

程序4:

entity bl is

port(

din : in std_logic;

clk : in std_logic;

dout : out std_logic

);

end bl;

architecture bl_b of bl is

begin

process(clk)

variable da,db: std_logic;—變量

begin

if rising_edge(clk) then

da := din;

db := da;

dout <= db;

end if;

end process ;

end bl_b;

程序4中,由于變量的賦值是即時(shí)的,相當(dāng)于把輸入端口din的的值賦給輸出端口dout,所以它由一個(gè)D觸發(fā)器構(gòu)成,如圖3、圖4。

3 變量和信號(hào)賦初值技巧

在FPGA設(shè)計(jì)中,復(fù)位時(shí)賦予各個(gè)信號(hào)初值是很有必要的,否則可能出現(xiàn)不定態(tài)。在給變量和信號(hào)定義的時(shí)候雖然可以賦初值,但應(yīng)該注意的是,這個(gè)初始值只是對(duì)于行為級(jí)仿真來說有用 , 綜合器在綜合時(shí)會(huì)忽略這些信息。

在某型號(hào)FPGA產(chǎn)品測試時(shí)發(fā)現(xiàn)設(shè)計(jì)師使用多個(gè)變量信號(hào),并對(duì)這些變量信號(hào)賦初始值,前仿真結(jié)果正確,但后仿真中觀測的信號(hào)為不定值,無法順利進(jìn)行后仿真。程序部分代碼如下:

process(clk)

variable en : std_logic := '0';

variable cnt : std_logic_vector(1 downto 0) := (others =>'0');

begin

if rising_edge(clk) then

cnt := cnt + (clk2 and en);

en := not clk2

end if;

end process;

波形見下圖5

分析其原因:在定義變量en和cnt時(shí)直接給其賦初始值并不能生效,這是因?yàn)榫C合過程中綜合器將略去所有變量的初始值,因此變量en和cnt在后仿真中為不確定態(tài),從而使得后仿真無法順利進(jìn)行。

為了實(shí)現(xiàn)對(duì)變量en和cnt賦初值,需要對(duì)程序進(jìn)行如下修改。修改后仿真波形見下圖6,后仿真結(jié)果正確。

process(clk)

variable en : std_logic;

variable cnt : std_logic_vector(1 downto 0);

begin

if rising_edge(clk) then

if reset = '0' then — reset為全局復(fù)位信號(hào)

cnt := (others=>'0');

en := '0';

else

cnt := cnt + (clk2 and en);

en := not clk2;

end if;

end if;

end process;

由此可見,信號(hào)和變量應(yīng)該避免在定義時(shí)初始化賦值。而改由在相應(yīng)的位置(如復(fù)位處)進(jìn)行初始化。因此,無論是在仿真還是綜合時(shí),都建議使用這樣的方法(在復(fù)位處)進(jìn)行初始化。

4 變量和信號(hào)使用特點(diǎn)

在實(shí)際編程中,我們要結(jié)合變量和信號(hào)有各自的區(qū)別和優(yōu)缺點(diǎn)在不同的情況下進(jìn)行選擇使用,尤其注意以下幾個(gè)幾點(diǎn):

1)變量可以用來實(shí)現(xiàn)一些復(fù)雜的算法,也可以進(jìn)行建模。對(duì)于仿真來說,使用變量一般可以提高程序的仿真速度,縮短測試周期,但在有的仿真器中也存在無法直接觀測變量波形和變化值,使得仿真過程復(fù)雜化。

2)變量賦值雖然是無延時(shí)的,但變量的操作綜合后容易在硬件上產(chǎn)生較大的延時(shí),這是因?yàn)閷?duì)變量的操作往往被綜合成為組合邏輯。而信號(hào)更接近于硬件,綜合后一般對(duì)應(yīng)成觸發(fā)器,能很好的控制硬件上的延時(shí)。因此,從這個(gè)意義上講使用信號(hào)能提高設(shè)計(jì)的速度。

3)變量由于其有效范圍只是局限在它所在的進(jìn)程之中,因此要將變量的值傳輸?shù)竭M(jìn)程之外的話必須要先傳輸給信號(hào),利用信號(hào)的全局特性進(jìn)行信息傳遞。因此,程序中如果大量使用變量就必須同時(shí)定義若干個(gè)相關(guān)信號(hào),在多個(gè)進(jìn)程之間傳遞大量的信息十分的不方便,也大大降低了程序的可讀性。而信號(hào)不存在這樣的缺點(diǎn),因此在實(shí)際設(shè)計(jì)中應(yīng)盡量使用信號(hào)進(jìn)行內(nèi)部信息傳遞。

5 結(jié)束語

通過上面的討論可知,在FPGA設(shè)計(jì)中,要特別注意信號(hào)和變量的區(qū)別和使用特點(diǎn),靈活掌握信號(hào)和變量的使用技巧,提高設(shè)計(jì)效率。

參考文獻(xiàn):

[1] 侯伯亨,顧新.VHDL硬件描述語言與數(shù)字邏輯電路設(shè)計(jì)[M].西安電子科技大學(xué)出版社,1999.

[2] 潘松,黃繼業(yè).EDA技術(shù)應(yīng)用教程[M].科學(xué)出版社,2006.

[3] 金寶根.VHDL中常用數(shù)據(jù)對(duì)象的應(yīng)用及注意事項(xiàng)[J].信息技術(shù),2012(5).

石阡县| 安塞县| 涞水县| 扎鲁特旗| 大名县| 上栗县| 措勤县| 柳河县| 浏阳市| 广平县| 昌邑市| 城固县| 永年县| 康保县| 体育| 科技| 曲沃县| 梨树县| 临江市| 东宁县| 本溪市| 定边县| 大邑县| 蒙阴县| 陆良县| 安吉县| 康乐县| 湘乡市| 彩票| 奉贤区| 贵定县| 扎赉特旗| 荆州市| 泾川县| 方正县| 莱州市| 桃源县| 溆浦县| 桐城市| 苏尼特左旗| 禹城市|