趙 靖,王延斌,馮光升,馬春光
(1.哈爾濱工程大學計算機學院,黑龍江 哈爾濱 1500012.哈爾濱工業(yè)大學機電學院,黑龍江 哈爾濱 150001)
在“VLSI及硬件描述語言”課程中,用VHDL語言描述系統硬件行為時,按語句執(zhí)行順序對其進行分類,可以分為順序(Sequential)描述語句和并發(fā)(Concurrent)描述語句。順序描述語句只能再現在進程(Process)或子程序(Subprogram)中,由它定義進程或子程序所執(zhí)行的算法[1,2]。并發(fā)描述語句執(zhí)行沒有先后順序,定義相互關聯的模塊和進程從而描述設計的行為或結構,但是它不能出現在上述的兩處[2]。
教師對這兩種描述語句進行講解的過程中,常會只偏重介紹各種語句的用法,卻忽視了其應用場所。筆者認為,在對變量和信號的教學中,除了強調變量賦值的立即性外,還要重視其初始化的方法與時刻。在循環(huán)體中涉及到對信號和變量的賦值情況,對信號進行多次賦值,只有最后一次生效。
如果順序與并發(fā)描述語句的書寫格式正確但位置出錯,則會出現語句錯用的情況。將順序描述語句書寫在 architecture里,將并發(fā)描述語句書寫在process里。我們在教學中以三八譯碼器為例,用選擇語句可以實現對三八譯碼器的描述。程序一使用并發(fā)描述語句WITH SELECT實現。程序二使用順序描述語句CASE實現。關鍵點在于,順序描述語句書寫在process內部,且其有相應的敏感變量。
Process的重要應用就是用來描述寄存器,即以時鐘為敏感變量且進行上升/下降沿判斷。若不進行時序功能的描述(如本例中的三八譯碼器),則在process內部的順序描述語句CASE和并發(fā)描述語句WITH SELECT在功能上是完全相同。學生在實踐過程中,經常忽視順序和并發(fā)描述語句的書寫位置,只注意到各種描述語句功能。經常發(fā)生的誤用情況(ModelSim編譯提示):將并發(fā)描述語句書寫到順序單元中,錯誤程序一的編譯提示:Illegal sequential statement,如圖1所示;將順序描述語句書寫到并發(fā)單元中,錯誤程序二的編譯提示:Illegal concurrent statement,見圖2所示。

圖1 錯誤程序一的編譯提示

圖2 錯誤程序二的編譯提示
因此在教學中要強調這兩種描述語句的適用范圍。下面是源程序和經常遇到的錯誤程序。程序一和程序二是源程序,在程序二及以后的錯誤程序中,省去了對實體的描述部分和結構體中語句重復部分的描述。
[程序一]


在變量的聲明處可以指定變量的初始化值,但初始化值只在process啟動前有效。正確的描述方法如程序三所示:用全0來初始化變量 indata,在process開始處對indata賦值。圖3是3-8譯碼器編譯通過的正確輸出,3-8譯碼器有3個二進制輸入端和8個譯碼輸出端。對輸入的值進行譯碼,就可以確定輸出端的哪一個輸出端變?yōu)橛行?低電平),從而達到譯碼的目的。

圖3 3-8譯碼器編譯通過的正確輸出


錯誤程序三試圖用變量來實現三八譯碼器,但其將變量indata的初始值指定為c&b&a。此處有兩個錯誤:用信號量對變量進行初始化;認為在process激活時對變量進行初始化。對于這種實現方式,ModelSim輸出三條警告,見圖4的編譯提示:Initial value of“indata”depends on value of signal“c”,Initial value of“indata”depends on value of signal“b”,Initial value of“indata”depends on value of signal“c”。雖然只是警告,但在功能描述是不正確的。在仿真中,indata的值為X,y的值為Z。在實際電路中,indata的值為隨機值,y的值也為隨機值。

圖4 錯誤程序三的編譯提示
在對變量的教學中除了強調賦值的立即性外,還要重視其初始化的方法與時刻。
[錯誤程序三]

在Loop循環(huán)語句中,若在一個循環(huán)體內需要對某一個數據進行多次操作,則必須用變量。因為對信號的多次賦值只有最后一次會生效。例如,程序5用變量實現1到9的累加計算,如果程序5的sum用信號進行多次賦值,只有最后一次生效,也就是說只有在i=9時候才生效,最后的結果是Sum=9。

并發(fā)描述語句與順序描述語句、信號與變量是VHDL中的重要組成部分。本文對VHDL教學中,學生經常遇到的混淆問題從而編程出現錯誤進行了詳細的解釋。我們應該在今后的教學中注意:除了講解其功能特性外,還要加強對其適用場合的說明。
[1]侯伯亭,顧新.VHDL硬件描述語言與數字邏輯電路設計.西安:西安電子科技大學出版社(修訂版),1997年9月第1版
[2]IEEE Standard VHDL Language Reference Manual.New York:The Institute of Electrical and Electronics Engineers,1988