摘要 結(jié)合多輪的課程教學(xué)實踐,主要介紹VHDL語言中變量和信號的區(qū)別以及IF語句使用時應(yīng)注意的問題,提出的方法對VHDL語言教學(xué)以及VHDL設(shè)計都具有一定的指導(dǎo)意義。
關(guān)鍵詞 VHDL;信號;變量;IF
中圖分類號:G434 文獻(xiàn)標(biāo)識碼:A 文章編號:1671-489X(2008)20-0039-03
1 引言
VHDL語言是一種用于電路設(shè)計的高級語言,它的英文全寫是VHSIC(Very High Speed Integrated Circuit) Hardware Description Language,即超高速集成電路硬件描述語言。VHDL語言最初是由美國國防部開發(fā)出來,供美軍用來提高設(shè)計的可靠性和縮減開發(fā)周期的一種使用范圍較小的設(shè)計語言,后來成為IEEE工業(yè)標(biāo)準(zhǔn)的硬件描述語言。它具有很強的行為描述能力,與原理圖輸入方式相比較,用語言的方式描述硬件電路更容易修改和保存。因此,目前VHDL在電路設(shè)計中得到廣泛應(yīng)用。我國高等學(xué)校電子信息類專業(yè)把VHDL語言列為主干課程,作為電子專業(yè)學(xué)生必須掌握的專業(yè)知識。筆者在教學(xué)過程中常發(fā)現(xiàn)大部分學(xué)生無法分清變量與信號的區(qū)別以及IF語句常誤用等問題,通常雖然程序編譯可以通過,但結(jié)果卻和預(yù)期相差甚遠(yuǎn),且學(xué)生很難發(fā)現(xiàn)其中的錯誤[1]。本文主要介紹VHDL語言的信號與變量和IF語句應(yīng)用的教學(xué)經(jīng)驗。
2 變量與信號的區(qū)別
信號和變量是VHDL語言中的數(shù)據(jù)對象,是存放數(shù)據(jù)的容器[2]。兩者的區(qū)別:1)聲明的形式和位置不同。信號聲明為signal,常在結(jié)構(gòu)體中聲明;變量聲明為variable,常在進(jìn)程中聲明。2)賦值符號不同。信號賦值為“<=”;變量賦值為“∶=”。3)賦值生效的時間不同。信號賦值是進(jìn)程結(jié)束時生效;變量賦值是立即生效。4)使用范圍不同。信號是一個全局量,使用范圍是實體、結(jié)構(gòu)體和程序包;變量是一個局部量,常在進(jìn)程語句、函數(shù)語句和過程結(jié)構(gòu)中使用。下面以一個異或程序為例,說明信號和變量的區(qū)別以及對系統(tǒng)設(shè)計的影響。
程序一:
library ieee;
use ieee.std_logic_1164.all;
entity xor_sig is
port(a, b,c:in std_logic;
x,y:out std_logic);
end xor_sig;
architecture behav of xor_sig is
signal d:std_logic; ①
begin
process(a,b,c)
(*)
begin
d<=a;②
x<=c xor d; ③
d<=b;④
y<=c xor d; ⑤
end process;
end behav;
程序一中d定義為信號,使用MAX + PLUS II軟件對程序進(jìn)行編譯和仿真,編譯可以通過,沒有語法錯誤,但出現(xiàn)兩個警告:1)Found multiple assignments to the same signal-only the last assignment will take effect;2)Ignored unnecessary input signal pin ‘a(chǎn)’。警告內(nèi)容是程序?qū)π盘杁多次賦值,但只有最近的一次會生效,忽略輸入信號a的賦值。仿真結(jié)果如圖1所示。圖1中輸入信號是b和c,輸出信號是x和y。b和c異或的結(jié)果給x和y,即x=y=/bc+/cb=b c,程序中②沒有起作用,信號d的值是b。

程序一中加黑表示的部分是程序里使用信號的地方,如果這部分用變量來代替,則替換為以下語句:①改為“variable d:std_logic;”,并且其位置放置與程序中的*處;②改為“d:=a;”;③改為“x<=c xor d;”;④改為“d:=b;”;⑤改為“y<=c xor d;”。
對修改過的程序一使用MAX+PLUS Ⅱ軟件編譯和仿真,編譯沒有錯誤和警告,仿真結(jié)果如圖2所示。

圖中輸入信號是c,b,a;輸出信號是x和y,x=/ac+/ca=a c,y=/bc+/cb=b c,即a和c異或的結(jié)果給x,b和c異或的結(jié)果給y。
通過程序里把信號修改為變量,學(xué)生可以直觀看出信號與變量聲明位置和賦值符號的不同;對比兩個程序x和y的運行結(jié)果,學(xué)生可以理解信號和變量的賦值生效時間不同。
3 慎用IF語句
IF語句作為一種條件判斷語句,在VHDL程序設(shè)計中有著廣泛的應(yīng)用。IF語句有3種結(jié)構(gòu),一種是門閂控制,語句形式為:
IF 條件 THEN
順序執(zhí)行語句
END IF;
另一種是選擇控制,語句有兩種形式。形式一:
IF 條件 THEN
順序執(zhí)行語句
ELSE
順序執(zhí)行語
END IF;
形式二:
IF 條件 THEN
順序執(zhí)行語句
:
ELSIF 條件 THEN
順序執(zhí)行語句
ELSE
順序執(zhí)行語句
END IF;
在用IF語句設(shè)計程序時,要注意2個問題:1)在多個條件判斷選擇時用選擇控制中的形式二語句,條件的判斷有優(yōu)先,寫在前面的優(yōu)先判斷;2)在設(shè)計組合邏輯電路時,盡量不引入不必要的寄存器,則應(yīng)選擇帶有ELSE結(jié)構(gòu)的語句。
程序二:
library ieee;
use ieee.std_logic_1164.all;
entity and22 is
port(a, b:in std_logic;
q:out std_logic);
end and22;
architecture behav of and22 is
begin
process(a ,b)
begin
if(a='1' and b='1') then
q<='1';
else ①
q<='0'; ②
end if;
end process;
end behav;
程序二是用VHDL語言實現(xiàn)一個二輸入的與非門,使用MAX+PLUSⅡ軟件編譯和仿真,仿真結(jié)果如圖3所示。a,b是輸入信號,q是輸出信號,當(dāng)a和b同時為1(高電平)時,q輸出1,即高電平;a和b為其他值時,q為0。

把程序二中的加黑部分刪除,即采用門閂控制形式,使用MAX+PLUSⅡ軟件編譯和仿真,編譯沒有錯誤和警告,仿真結(jié)果如圖4所示。a,b是輸入信號,q是輸出信號,當(dāng)a和b同時為1(高電平)之前,q輸出不定值,在此之后,不論a和b為何值,q輸出一直為1,即高電平。出現(xiàn)此結(jié)果的原因是修改后的程序編譯綜合時形成Latch(鎖存器)的結(jié)構(gòu)。Latch結(jié)構(gòu)通常都由大量的觸發(fā)器組成,不僅使電路更復(fù)雜,工作速度降低,而且由于時序配合的原因而導(dǎo)致不可預(yù)料的結(jié)果[3]。

4 總結(jié)
通過對信號與變量以及IF語句的講解,配合實例的分析,使得學(xué)生對信號與變量以及IF語句有了更清楚的認(rèn)識,減少了不必要的錯誤。通過多年VHDL的教學(xué),筆者深深地體會到:
1)VHDL語言是一種硬件描述語言,不能簡單地認(rèn)為是一種高級語言,進(jìn)行程序設(shè)計時要與硬件對應(yīng),要考慮程序綜合后電路的形式。
2)教師不僅要精通理論知識,還要有豐富的程序設(shè)計經(jīng)驗,能夠熟練地指導(dǎo)實驗。對學(xué)生提出的任何問題要能夠結(jié)合課堂知識和編程經(jīng)驗加以解決。
3)任課教師要不斷學(xué)習(xí),不斷實踐,不斷總結(jié),將最新的技術(shù)成果引入教學(xué)實踐中,及時更新教學(xué)內(nèi)容,使學(xué)生能夠掌握最新知識和技術(shù)。
參考文獻(xiàn)
[1]楊丹,張樹林.VHDL中信號與變量的教學(xué)體會[J].電氣電子教學(xué)學(xué)報,2006(6):30-33
[2]黃正謹(jǐn),徐堅,等.CPLD系統(tǒng)設(shè)計入門與應(yīng)用[M].北京:電子工業(yè)出版社,2002
[3]戴慧.VHDL設(shè)計技巧探討[J].正德學(xué)院學(xué)報,2006(4)