StepFPGA有兩塊物美價廉的FPGA開發板:1. 基於Altra的MAX10,2. 基於Lattice的MachXO2。都比較合適於教學,現以后者為例介紹FPGA開發的入門步驟(后者的優勢是Lattice的Diamond是免費的,前者可能存在的優勢是該MAX10開發板有可能支持Simulink的FPGA在環(FIL)設計,有待進一步驗證)。這是一篇step-by-step的學習手冊,仿照即可學會。
第1部分 安裝Diamond——編程、綜合、仿真的集成環境
- 在Lattice官網注冊賬號登錄,下載Diamond(http://www.latticesemi.com/latticediamond)
- 獲取許可證(http://www.latticesemi.com/Support/Licensing#requestDiamond),選擇Request Node-locked License,該許可證支持MachXO2。在NIC一欄中輸入自己電腦的網卡物理地址(網卡物理地址查看方式:win+R -- cmd -- ipconfig /all)。隨后即可收到License郵件,該郵件附件為“license.dat”,保存好。
![]()
- 安裝Diamond
- 將之前收到郵件中的license.dat保存到"\lscc\diamond\3.xx\license"中
- 檢查設置環境變量,確保環境變量中存在下面一項內容:
key: LM_LICENSE_FILE
value: lscc\diamond\3.xx\license\license.dat
- 運行Diamond
第2部分 Diamond中的Verilog HDL設計——從編程到燒錄
參考“STEP-MXO2 軟件手冊”的15-29頁。期間涉及到管腳分配環節,這部分必須看懂所用FPGA(開發板)電路原理圖和芯片引腳圖,否則將會無從分配,除非僅作仿真,不燒錄程序。
tip: 應該仔細認真的閱讀廠家提供的電路原理圖,這一點對於電路原理的理解至關重要,要習慣於通過廠家的資料學習專業知識,從而消弭大學課堂學習的理論課知識和工程實踐之間的障礙。如果能夠指出產品設計或相關文檔不完善的地方就更好了,如此便產生了與廠家工程師交流的契機,快速提高自己的實操水平。比如該開發板在驅動板載數碼管時采用了直接驅動的方式,無論公共端還是各段碼端都沒有限流措施,可能設計者已經考慮到了核心芯片的引腳和所用數碼管的內阻,能夠保證安全(由於筆者沒有詳細查找datasheet,所以不敢妄下結論),但實際使用過程中,在靜態顯示時還是有一定熱度,問工程師,反饋是最好做一下限流。為了使用安全,只能自己想辦法,比如將公共端引腳設置為高阻狀態(assign C9 = 1'bz;)的同時外接限流電阻后接地。其實這只是簡單的電路知識,學過電子電路原理之后應該能夠理解。

第3部分 ModelSim中仿真
- 仿真工具不止一種,可以使用Active-HDL,也可以使用ModeSim,前者需要單獨下載安裝,后者可在Diamond 3.12中直接調用,這里以后者為例。(其實都差不多,入門先學會一種也可以了,甚至包括Xilinx ISE、Quartus和Diamond之間操作上也都大同小異)
- 正式進入ModelSim之前的工作流程可以繼續參考“STEP-MXO2 軟件手冊”的29-35頁,只是中途會有“Active-HDL”和“Modelsim”選項的差別
- 進入ModelSim之后的操作如下
1. 編譯所有文件,包括程序和測試文件

2. 進入仿真流程

3. 切換至Librabry選項卡,從庫中找到對應系列的芯片

4. 切換至Design選項卡,選擇相應的測試文件

5. 選中並添加所有將要參與仿真的信號

6. 設置單步仿真時間,並點擊Run圖標仿真

7. 觀察波形

程序:
module seg7 (bcd, leds, CC); input [3:0] bcd; output [1:7] leds; output CC; reg [1:7] leds; always @(bcd) case (bcd) 0: leds = 7'b1111110; 1: leds = 7'b0110000; 2: leds = 7'b1101101; 3: leds = 7'b1111001; 4: leds = 7'b0110011; 5: leds = 7'b1011011; 6: leds = 7'b1011111; 7: leds = 7'b1110000; 8: leds = 7'b1111111; 9: leds = 7'b1111011; default: leds = 7'bx; endcase assign CC = 1'b0; endmodule
測試程序:
`timescale 1ns/100ps module decoder_tb; reg [3:0] bcd; wire [1:7] leds; initial begin bcd = 4'b0000; #50 bcd = 4'b0010; #50 bcd = 4'b0110; #50 bcd = 4'b1001; #50; end seg7 seg7_u1
( .bcd (bcd), .leds (leds) ); endmodule
