劉琳 吳維林
摘要:隨著航天產(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).