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

圖中輸入信號是c,b,a;輸出信號是x和y,x=/ac+/ca=a c,y=/bc+/cb=b c,即a和c異或的結果給x,b和c異或的結果給y。
通過程序里把信號修改為變量,學生可以直觀看出信號與變量聲明位置和賦值符號的不同;對比兩個程序x和y的運行結果,學生可以理解信號和變量的賦值生效時間不同。
3 慎用IF語句
IF語句作為一種條件判斷語句,在VHDL程序設計中有著廣泛的應用。IF語句有3種結構,一種是門閂控制,語句形式為:
IF 條件 THEN
順序執行語句
END IF;
另一種是選擇控制,語句有兩種形式。形式一:
IF 條件 THEN
順序執行語句
ELSE
順序執行語
END IF;
形式二:
IF 條件 THEN
順序執行語句
:
ELSIF 條件 THEN
順序執行語句
ELSE
順序執行語句
END IF;
在用IF語句設計程序時,要注意2個問題:1)在多個條件判斷選擇時用選擇控制中的形式二語句,條件的判斷有優先,寫在前面的優先判斷;2)在設計組合邏輯電路時,盡量不引入不必要的寄存器,則應選擇帶有ELSE結構的語句。
程序二:
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語言實現一個二輸入的與非門,使用MAX+PLUSⅡ軟件編譯和仿真,仿真結果如圖3所示。a,b是輸入信號,q是輸出信號,當a和b同時為1(高電平)時,q輸出1,即高電平;a和b為其他值時,q為0。

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

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