基於Verilog HDL和Diamond/ModelSim的FPGA開發入門——以顯示譯碼器為例


StepFPGA有兩塊物美價廉的FPGA開發板:1. 基於Altra的MAX10,2. 基於Lattice的MachXO2。都比較合適於教學,現以后者為例介紹FPGA開發的入門步驟(后者的優勢是Lattice的Diamond是免費的,前者可能存在的優勢是該MAX10開發板有可能支持Simulink的FPGA在環(FIL)設計,有待進一步驗證)。這是一篇step-by-step的學習手冊,仿照即可學會。

第1部分 安裝Diamond——編程、綜合、仿真的集成環境

    

  • 安裝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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM