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