呂高煥,楊 亮,鄧冠龍
(魯東大學信息與電氣工程學院,山東煙臺264025)
在我國高校電子類專業(yè)課程中,可編程邏輯器件PLD(Programmable Logic Device)是必不可少的教學內(nèi)容[1,2]。目前,現(xiàn)場可編程邏輯門陣列FPGA(Field Programmable Gate Arrays)是獲得最廣泛應用的一類PLD。開發(fā)此類PLD常用的工具是VHDL語言[3,4]。在VHDL語言中,有限狀態(tài)機FSM(Finite State Machine)是數(shù)字邏輯電路設計的核心部分,是VHDL語言的精髓所在,又是學生理解的難點所在。由于FSM系統(tǒng)編程復雜,控制量和信號量多,學生通常會感到棘手,編出的程序往往不能滿足系統(tǒng)需求。因此,講好VHDL語言中的FSM是很有挑戰(zhàn)性的。
FSM分Moore型和Mealy型兩類[5-7]。Moore型FSM的輸出僅與當前狀態(tài)有關(guān),而Mealy型FSM的輸出除與當前狀態(tài)有關(guān)外,還與當前輸入信號有關(guān)。因此,兩類FSM在編程過程中有些差異。
在FSM的設計過程中,狀態(tài)控制信號的分類非常重要,它不僅決定了程序的條理性,還決定了所設計系統(tǒng)的有效性和可靠性。我們將控制信號分為兩類,一類是強制狀態(tài)控制信號,一類是常規(guī)狀態(tài)控制信號,將這兩類信號放在不同的控制進程中,分別編程控制。教學過程中,我們將FSM的編程步驟分為三步,即:系統(tǒng)圖、狀態(tài)轉(zhuǎn)移圖和編程。系統(tǒng)圖表示了整個系統(tǒng)的輸入、輸出關(guān)系,并標示了控制信號在系統(tǒng)中的位置;狀態(tài)轉(zhuǎn)移圖展示了系統(tǒng)狀態(tài)在控制信號作用下的轉(zhuǎn)換過程;而編程則是根據(jù)系統(tǒng)圖和狀態(tài)轉(zhuǎn)移圖,使用VHDL語言描述系統(tǒng)的狀態(tài)運動、輸出過程。在編程過程中,這三步都要具備。通常對FSM的編程方式有單進程、雙進程和三進程模式。其中三進程模式易于理解,方便編程控制,且編程過程中條理清晰,易于查錯。因此,在教學過程中,把三進程編程方式作為主要講授內(nèi)容。
狀態(tài)圖的設計方法在FSM的教學中也比較重要,課堂上我們以數(shù)字探測為例,講授狀態(tài)圖的設計方法,以此啟發(fā)學生理解狀態(tài)轉(zhuǎn)換過程及狀態(tài)圖的畫法。通過上述教學策略,學生基本掌握了基于VHDL的FSM設計和編程方法,取得了良好的教學效果。
在講授FSM之前,需要辨析FSM的系統(tǒng)圖和狀態(tài)圖。系統(tǒng)圖描述了數(shù)據(jù)流和控制流在FSM系統(tǒng)中的流動過程以及狀態(tài)轉(zhuǎn)移過程,是編寫狀態(tài)圖和程序的基礎(chǔ)。典型的FSM系統(tǒng)圖如圖1所示。
圖1 典型FSM的系統(tǒng)圖
在講授的過程中,一定要為學生講清楚常規(guī)狀態(tài)控制信號和強制狀態(tài)控制信號。所謂常規(guī)狀態(tài)控制信號,即是不同狀態(tài)轉(zhuǎn)換過程中所公用的控制信號,而強制狀態(tài)控制信號則是當該信號有效時,將當前狀態(tài)直接控制到固定的狀態(tài),如復位、使能等。狀態(tài)圖則是在控制信號作用下為實現(xiàn)該系統(tǒng)功能而設計的狀態(tài)轉(zhuǎn)換過程,以及輸入輸出關(guān)系。在Moore型FSM中,其輸出信號僅與當前狀態(tài)有關(guān)系,因此每個狀態(tài)對應一個確定的輸出;而在Mealy型FSM中,其輸出信號不僅和當前狀態(tài)有關(guān)系,而且還與當前輸入的常規(guī)狀態(tài)控制信號有關(guān)系。不同類型FSM的狀態(tài)轉(zhuǎn)移圖畫法亦不相同。圖2(a)和(b)分別表示了Moore型FSM和Mealy型FSM的兩個狀態(tài)之間的局部狀態(tài)轉(zhuǎn)移圖。
圖2 FSM的局部狀態(tài)轉(zhuǎn)換圖示例
系統(tǒng)圖、狀態(tài)轉(zhuǎn)移圖和VHDL編碼組成三段式編程框架。首先畫出如圖1所示的系統(tǒng)框圖,其上準確標示出常規(guī)狀態(tài)控制信號和強制狀態(tài)控制信號。常規(guī)狀態(tài)控制信號作為狀態(tài)轉(zhuǎn)移組合邏輯的輸入端,強制狀態(tài)控制信號作為狀態(tài)寄存器的輸入端。其次根據(jù)狀態(tài)控制信號畫出狀態(tài)轉(zhuǎn)換圖,最后根據(jù)狀態(tài)轉(zhuǎn)換圖寫出VHDL代碼。
在FSM編程過程中,將狀態(tài)控制信號分為常規(guī)和強制兩類信號是非常必要的,它更符合電路設計過程中各功能模塊“相互獨立、各盡其責”的思想,避免電路設計復雜和串擾。從電路類型來講,強制狀態(tài)控制信號起作用后狀態(tài)輸出是固定的,而常規(guī)狀態(tài)控制信號起作用后其狀態(tài)輸出還需要當前狀態(tài)共同決定,因此是有記憶的。因此,在理論和實踐上,將這兩類信號分開,不僅有助于概念上的理解,還有助于程序的編寫。
FSM的編程方法分單進程、雙進程和三進程三種。單進程將整個系統(tǒng)圖放在一個process里面描述;雙進程一般是將狀態(tài)轉(zhuǎn)移和狀態(tài)寄存器放在一個進程,而將輸出進程單獨實現(xiàn);而三進程描述方法則是將三個模塊分別描述,不同進程之間使用狀態(tài)信號相互通信。一般而言,單進程和雙進程在狀態(tài)控制信號比較少時,編程比較方便,但在控制信號較多時,不易調(diào)試。因此我們推薦學生使用三進程的編程方法。
教學過程中,我們以數(shù)字序列中的“10”信號檢測為例為學生講解狀態(tài)機的設計原理,以此為基礎(chǔ),使學生了解狀態(tài)轉(zhuǎn)換與控制信號之間的設計關(guān)系。設輸入信號為din,復位信號為reset,當從串行輸入序列din中檢測到“10”時,輸出信號dout<=‘1’,否則dout<=‘0’,復位信號reset=‘0’時有效。
根據(jù)輸入、輸出信號,畫出其系統(tǒng)圖,如圖3所示。
圖3 “10”檢測器的系統(tǒng)圖
這里reset為強制狀態(tài)轉(zhuǎn)移信號,即當該信號為‘0’時,強制轉(zhuǎn)換到初始狀態(tài);din為常規(guī)狀態(tài)控制信號,即在不同的狀態(tài)下,當din為不同的值時,下一個狀態(tài)亦不相同。
授課時Moore型FSM狀態(tài)轉(zhuǎn)換圖的逐步引導過程如下。首先畫出主狀態(tài)轉(zhuǎn)移過程。設初始狀態(tài)為S0,則reset有效后,直接進入S0狀態(tài),輸出為‘0’,如圖4(a)所示。當din=‘1’時,則跳轉(zhuǎn)到下一個狀態(tài)S1,輸出為0,如圖4(b)所示。在S1狀態(tài)之下,當din=‘0’時,狀態(tài)跳轉(zhuǎn)到S2狀態(tài),輸出為1,如圖4(c)所示,此時完成了主狀態(tài)轉(zhuǎn)移過程。然后,對每一個狀態(tài),根據(jù)檢測要求畫出在不同din條件下的狀態(tài)轉(zhuǎn)移過程,稱為輔狀態(tài)轉(zhuǎn)移過程。首先看S0狀態(tài),在該狀態(tài)下din=‘0’時,由于沒有‘1’出現(xiàn),直接在該狀態(tài)停滯,直到有din=‘1’出現(xiàn),才轉(zhuǎn)移到下一狀態(tài)S1。在S1狀態(tài),如果din=‘1’,則停滯在該狀態(tài),直到din=‘0’出現(xiàn),才轉(zhuǎn)移到下一狀態(tài)S2。此時已經(jīng)探測到“10”,輸出置為“1”。在S2狀態(tài),若din=‘0’,則等待檢測下一個“10”,從而跳轉(zhuǎn)到S0狀態(tài);若din=‘1’,則等待din=‘0’的出現(xiàn),從而跳轉(zhuǎn)到S1狀態(tài),完整的狀態(tài)轉(zhuǎn)移圖如圖4(d)所示。
下面講授三進程的編寫方法。注意,要跟學生講明的是,并行信號賦值語句實際上是隱式進程。
1)寫出程序?qū)嶓w
Library ieee;
Use ieee.std_logic_1164.all;
Entity detector10 is
圖4 Moore型FSM“10”檢測器狀態(tài)轉(zhuǎn)移圖的繪制過程
Port(din,clk,reset:in std_logic;
Dout:out std_logic));
End detector10;
2)描寫程序中用到的狀態(tài)及信號,并寫出主題框架:
Architecture behave of detector10 is Type state is(s0,s1,s2);
Signal currstate,nextstate:state;Begin
狀態(tài)轉(zhuǎn)移進程(din,currstate);
狀態(tài)寄存進程(clk,reset);
輸出進程(currstate);
End behave;
3)根據(jù)狀態(tài)轉(zhuǎn)換圖編寫狀態(tài)轉(zhuǎn)移進程。這里使用case語句結(jié)合if_then_else語句實現(xiàn),一個具體的例子如下:
4)編寫狀態(tài)寄存進程,這里使用異步復位,實現(xiàn)如下:
5)編寫輸出進程。該進程中,只有當前狀態(tài)currstate=S2時輸出dout=‘1’,其他狀態(tài)全為‘0’,因此可使用選擇信號賦值語句實現(xiàn),示例如下:
With currstate select dout>=‘1’when S2 else‘0’when others;將上述語句放在同一個architecture之內(nèi),即可實現(xiàn)“10”檢測器。
對于“10”檢測器,其Mealy型FSM的系統(tǒng)圖與圖3類似,只不過輸出組合邏輯輸入端多了din。其狀態(tài)轉(zhuǎn)移圖設計過程如下。Reset信號復位后,進入S0狀態(tài),如圖5(a)所示。
圖5 Mealy型FSM“10”檢測器狀態(tài)轉(zhuǎn)移圖的繪制過程
在S0狀態(tài),若din=‘1’,則進入S1狀態(tài),同時,輸出為‘0’。在S1狀態(tài),若din=‘0’,則進入S0狀態(tài),同時輸出為‘1’,實現(xiàn)了主狀態(tài)轉(zhuǎn)移過程,如圖5(b)。最后畫出輔狀態(tài)轉(zhuǎn)移進程,最終狀態(tài)轉(zhuǎn)移圖如圖5(c)所示。
從圖5可見,實現(xiàn)同樣的功能,Mealy型FSM比Moore型FSM少一個狀態(tài),因此描述起來相對簡單。對于Mealy型FSM,其狀態(tài)轉(zhuǎn)移進程可寫為
由于輸出與當前狀態(tài)和當前輸入有關(guān),因此輸出可寫為:
Dout<=‘1’when currstate=S1 and din=‘0’else‘0’;
在“10”狀態(tài)機的設計基礎(chǔ)上,我們引導學生練習“10”,“11”,“00”狀態(tài)機的畫法,并進一步拓展到三位碼的檢測電路設計中,例如“110”,“101”檢測等。學生經(jīng)過思考后都能準確畫出所要求的狀態(tài)轉(zhuǎn)移圖。
在我國高校電子類本科專業(yè)中,“可編程器件原理與實踐”通常作為一門專業(yè)選修課,雖然教師在課堂上強調(diào)了該門課的重要性,但學生由于對該領(lǐng)域內(nèi)的應用了解有限,且缺乏工作經(jīng)驗,因此難以引起學生的重視。再加上剛開始講課時很多概念陌生,學生難以理解而容易失去學習興趣。在該課程的教學過程中,我們采用實驗、課堂相結(jié)合的方法來逐步培養(yǎng)學生的學習興趣,獲得很好的效果。
在教學過程中,我們共設計了6次實驗,由簡單到復雜,由基礎(chǔ)到應用逐步深入。根據(jù)實驗情況和實驗報告,成績按照優(yōu)秀、良好、中等、及格、差五個檔次劃分。由于一開始學生對Altera Quartus II開發(fā)環(huán)境不熟悉,因此成績較差。但隨著課堂和實驗的逐步深入,實驗成績便逐步提升,其統(tǒng)計圖如圖6所示。FSM實驗是第5次實驗,從該圖中可以看出,在FSM實驗之后,優(yōu)秀和良好率有了大幅的增長,這說明學生對VHDL編程有了更深的認識和理解。
圖6 實驗成績統(tǒng)計
另外,在課程所布置的作業(yè)中,我們發(fā)現(xiàn)學生設計的程序明顯突出了模塊化的設計思維,程序設計思路更加清晰,程序更加易讀,說明“相互獨立、各盡其責”的思想已經(jīng)初步被學生所接受,并理解消化,提高了學生的學習興趣,編程能力得到逐步提高。
本文基于三段式方法總結(jié)了VHDL語言教學中的FSM編程方法,即將設計過程分為系統(tǒng)圖、狀態(tài)圖和編程三部分,并以信號檢測為例講述Moore型和Mealy型FSM狀態(tài)轉(zhuǎn)換圖的畫法,在此基礎(chǔ)上講述了程序設計過程。通過這種教學方法,可使學生分清強制控制信號和常規(guī)控制信號,并為這些信號找到合適的位置,從而使編程過程有條不紊,正確實現(xiàn)所要求的功能。
[1] 梁妙元,馬寧,朱福萌,段黎明,印敏.本科編程類課程教學改革探討[J] .南京:電氣電子教學學報,2015,37(1):35-36
[2] 羅杰,張林,謝世輝.可編程邏輯器件的教學實踐與思考[J] .南京:電氣電子教學學報,2000,22(2):32-38
[3] Stephen Brown.Fundamentals of digital logic with VHDL design[M] .New York:McGraw Hill,2009
[4] William Kleitz.Digital Electronics:a practical approach with VHDL[M] .New York:Pearson,2011
[5] 程云長.可編程邏輯器件與VHDL語言[M] .北京:科學出版社,2005年5月
[6] 文漢云.數(shù)字邏輯與數(shù)字系統(tǒng)設計-基于VHDL語言描述[M] .北京:清華大學出版社,2012年3月
[7] 邊計年,薛宏熙譯,Stefan Sjoholm,Lennart Lindh著.用VHDL設計電子線路[M] .北京:清華大學出版社,2000年4月