張慶平,郭玉祥
(安慶師范大學(xué)電子工程與智能制造學(xué)院,安徽安慶 246133)
FPGA全稱為現(xiàn)場可編程邏輯門陣列,是廣泛用于高速通訊和數(shù)字信號處理等領(lǐng)域的芯片[1]。該芯片使用硬件描述語言(HDL)進行編程,常用編程語言有Verilog和VHDL?!癋PGA原理及應(yīng)用”課程是電子類的專業(yè)課,主要內(nèi)容有[1-3]硬件編程語言介紹和FPGA硬件開發(fā)實操,兩者是循序漸進的關(guān)系,前者是后者的基礎(chǔ)。HDL語言的學(xué)習(xí)難度較大,相比于以C語言為代表的軟件編程語言,HDL這類硬件語言無論從編程思路還是開發(fā)流程上都有明顯不同。HDL是學(xué)習(xí)FPGA的基礎(chǔ),HDL代碼仿真、FPGA開發(fā)流程、開發(fā)軟件的使用、開發(fā)板的調(diào)試,這些實踐性很強的教學(xué)內(nèi)容,是課程的重點和難點。大量教學(xué)經(jīng)驗表明,學(xué)生親自走通整個實驗過程后,對書本理論的理解更透徹,處理實際編程中遇到的問題也更得心應(yīng)手。針對課程特點、學(xué)生實際情況以及現(xiàn)行教法的不足,個人總結(jié)了幾點教學(xué)經(jīng)驗和改進方法。
Verilog語言的初衷是描述硬件電路和進行電路仿真,所有語法的設(shè)計均圍繞這一目的展開。講解各類語法時,不僅要介紹其格式,還應(yīng)從硬件特性的角度分析為什么要這樣設(shè)計。這不僅有助于學(xué)生理解知識點,更能幫助學(xué)生領(lǐng)會Verilog編程的思想和方法。有了這層鋪墊,“綜合與不可綜合語法的區(qū)分”和“C語言與Verilog語言的異同”這些難點,學(xué)生更易理解和接受。下面舉兩個教學(xué)案例加以說明。
案例1不可綜合語法的總結(jié)歸納
這類語法之所以不可綜合,與硬件電路的特性直接相關(guān),主要有以下幾種。
1)形如$time、$display、$fopen、$readmemb等任務(wù)。很明顯,熟悉了FPGA的內(nèi)部結(jié)構(gòu)后就能看出,因為芯片沒有對應(yīng)的電路支持這些操作,此類語法只用于仿真,用途是輸入仿真數(shù)據(jù)或輸出仿真結(jié)果。
2)時間延遲。不同于單片機的時延函數(shù),Verilog的時延只能用于仿真。從硬件角度看,F(xiàn)PGA內(nèi)沒有現(xiàn)成的計時器等電路構(gòu)造,所以不可綜合。同時提醒學(xué)生,為達到可綜合的時延效果,應(yīng)采用變通的方案,如構(gòu)建高速時鐘驅(qū)動的移位寄存器來實現(xiàn)。
3)開關(guān)級MOS管。因FPGA的最小可編程單元的層次在MOS管之上,即Verilog代碼無法在FPGA內(nèi)配置出基于MOS管所搭建的電路,故無法綜合。
4)形如wait、forever、repeat、while 等高級語法。講解時,著重強調(diào)HDL 是硬件描述語言,而非硬件設(shè)計語言,高級語法難以直接對應(yīng)硬件電路,綜合工具基本都不支持。
5)initial初始化。這一語法用于仿真時給參數(shù)賦初值,無法直接對應(yīng)實際電路。課堂上可引導(dǎo)學(xué)生思考如何達到可綜合的初始化效果,給出兩種解決方法:狀態(tài)機和在代碼的復(fù)位if語句段內(nèi)給寄存器賦初值。由此提醒學(xué)生,可綜合的電路是通過變通的辦法實現(xiàn)寄存器初始化,而非直接使用initial語法。
6)循環(huán)次數(shù)不固定的for循環(huán)。教學(xué)時需強調(diào),for循環(huán)是個特例,循環(huán)次數(shù)固定的for循環(huán)可以被綜合成電路。課堂上結(jié)合硬件特征加以解釋,因為for循環(huán)的綜合,本質(zhì)是將循環(huán)體逐次展開成電路,若循環(huán)次數(shù)不固定,自然無法展開成確定的電路。
7)形如always@(posedge clk or negedge clk)的雙沿觸發(fā)。結(jié)合數(shù)字電路課程所學(xué)的DQ 觸發(fā)器的特點,觸發(fā)沿只能是上升沿和下降沿之一,不能同時觸發(fā),故不可綜合。
教學(xué)情況表明,加入硬件特性的分析后,相關(guān)知識點無需死記硬背。學(xué)生知其然更知其所以然,教學(xué)效果更佳。學(xué)生初學(xué)語法的第一印象就對是否可綜合有清晰明確的認知,實際編程時避免走彎路。
案例2Verilog與C語言執(zhí)行方式的差異
C語言代碼按書寫順序執(zhí)行(goto語句除外),而Verilog本質(zhì)上是并行化的,教學(xué)時需強調(diào)背后的硬件背景。C 語言編譯得到二進制指令碼,執(zhí)行機構(gòu)是CPU,硬件特點是逐個取指令-指令譯碼-執(zhí)行指令。而對于FPGA,其內(nèi)部不是CPU的構(gòu)造,各Verilog模塊綜合得到的電路,上電后同時運行,與書寫順序無關(guān)。教學(xué)實踐表明,不僅要在緒論部分講解這一要點,還要在后續(xù)講解各類語法時,對比Verilog和C語言語法的異同。這樣,學(xué)生初學(xué)時就有“軟件編程與硬件編程只是形式上類似,編程思路上截然不同”的觀念,寫代碼時從硬件電路的原理及工作方式的角度考慮,錯誤率會降低。
數(shù)字電路作為電子類專業(yè)的基礎(chǔ)課,極為重要,本課程是數(shù)字電路的延伸。教學(xué)中,穿插復(fù)習(xí)數(shù)字電路的相關(guān)知識點,既能鞏固前期所學(xué),查漏補缺,同時也為介紹Verilog或FPGA的相關(guān)知識點做鋪墊。在講解Verilog代碼的同步和異步復(fù)位寫法之前,簡要復(fù)習(xí)數(shù)字電路中的同步復(fù)位和異步復(fù)位概念,這照顧了遺忘相關(guān)知識點的學(xué)生。實踐表明,引入這一環(huán)節(jié)后,學(xué)生的學(xué)習(xí)效果更佳。
如前所述,Verilog語法與C語言的貌合神離,學(xué)生初學(xué)時容易混淆。除了必要的編程習(xí)題外,另設(shè)計了改錯題。此類題型,主體是一段完整的代碼,劃分為10段,每段為一小題,其中若干段的語法或注釋有誤,答題時,先判斷每段的對錯,若有誤則改正。這一新題型,不僅鍛煉學(xué)生代碼閱讀和理解能力,也能從側(cè)面提醒學(xué)生留意編程中的易錯點。作業(yè)效果顯示較理想。
Verilog語法較為繁瑣,知識點都零散分布于各個章節(jié)之中,需學(xué)生自行總結(jié)。結(jié)合本校學(xué)生情況,為達到更好的教學(xué)效果,在學(xué)完語法后,將重要的知識點做系統(tǒng)的歸納整理,幫助學(xué)生快速掌握要點。將學(xué)過的語法按可綜合與不可綜合分類,板書和課件中專門列出,學(xué)生一目了然。再如,Verilog語法格式中,哪些和C語言意義近似,哪些又有所區(qū)別,哪些是Verilog為描述硬件而特有的,都可以在學(xué)完語法后,以專題的形式總結(jié)。這對學(xué)生掌握硬件編程的難點大有幫助。
傳統(tǒng)課堂大多安排在多媒體教室,通過投影儀演示軟件操作,但教學(xué)經(jīng)驗表明這樣的方式收效不佳。原因是投影儀分辨率有限,軟件菜單文字和工具欄圖標(biāo)較小,學(xué)生不易看清楚。另外,學(xué)生只是走馬觀花地看了一遍操作,而等到動手實驗又隔了一段時間,課堂所講的操作要點已然淡忘。為此,直接將這類課時安排到機房,教師在投影儀上演示,學(xué)生同步上機跟進,邊學(xué)邊練手,效果更佳。
為提高學(xué)生的技能,拓展就業(yè)面,不僅要開設(shè)Verilog仿真類實驗,還需開設(shè)開發(fā)板調(diào)試的實驗。鑒于各高校學(xué)生的理解和接受能力不一,實驗教學(xué)不能照搬外校的內(nèi)容。本校以往的FPGA實驗,大多是上機做modelsim仿真,學(xué)生很少接觸開發(fā)板。新實驗的安排,一方面精簡仿真類實驗,一方面增設(shè)開發(fā)板綜合實驗。本著難易適中、兼顧趣味性和實驗條件的要求,設(shè)計了頻率計、簡易電子琴、奏樂電路、數(shù)字電壓表、象棋比賽計時電路等若干必做的綜合性實驗。這些實驗,代碼規(guī)模適度,突出了自頂向下的整體設(shè)計思路,全面覆蓋了重要的Verilog語法及知識點,且最終都上開發(fā)板調(diào)試,實驗完成后能明顯看出成果。
此外,為貼近實際應(yīng)用,設(shè)計了“數(shù)字濾波電路”、“matlab的HDL-Coder模塊使用”、“coordic算法求正弦和余弦值”等若干偏算法的選做實驗,供有興趣的學(xué)生完成。將綜合實驗分為必做和選做,更符合因材施教的方針。
針對FPGA課程的教學(xué),同仁已總結(jié)出一系列行之有效的教學(xué)方法[4-6]。結(jié)合本校學(xué)生的實際情況,為進一步提高教學(xué)質(zhì)量,有幾點值得改進和完善。一,強調(diào)和區(qū)分可綜合與不可綜合語法。根據(jù)編程及教學(xué)經(jīng)驗,只有明確區(qū)分了這兩類語法,才能寫出合乎要求的、可以綜合出硬件電路的代碼,否則寫出的代碼因無法綜合出電路而被開發(fā)軟件忽略,導(dǎo)致較隱蔽的錯誤。這類錯誤初學(xué)者較難排查,勢必影響學(xué)習(xí)效率和積極性。二,突出Verilog語言與C語言在語法及理解方式上的異同。