FPGA教學:通過Mojo研發板介紹FPGA – 第1部分

fpga tutorial

引言

迄今為止,我們的嵌入式系統教學和專案已經使用了多塊微控制器研發板,比如不同型號的Arduino微控制器板。使用微控制器時,用戶將微控制器上的數位和類比介面引腳連至受控週邊電子裝置,然後,使用者上傳包含一系列指令的軟體,微控制器會迴圈執行這些指令。運行時,微控制器的核心處理器按照微控制器模組的時脈速率讀取並執行這些指令。因此,我們可以看到,在某一時刻,微控制器通常只運行一條指令。

對於許多嵌入式系統專案來說,尤其是那些在入門微控制器模組(比如Arduino研發板)上實現的專案,這種單獨的指令執行並不影響性能。這是因為時脈速度足夠快,以至於人類感官無法區分後續運行。然而,許多大型應用可能需要不同的操作並行運行,這就使得微控制器實現變得非常複雜或完全不可能。現場可程式設計閘陣列(簡稱FPGA)是一種不同的計算平台,由於其固有的不同功能方式,能夠實現微控制器無法實現的功能。

fpga tutorial

圖1:一塊Arduino微控制器研發板(左)和一塊Altera FPGA研發板(右)/ ©RobotShop & ©Waveshare

FPGA和微控制器的主要區別在於配置方法。使用者不需要像處理微控制器那樣上載一系列指令讓板載晶片解釋執行,而是直接配置FPGA的硬體。這意味著使用者為FPGA編寫的程式不是重複執行的一系列指令,而是如何配置內部硬體以執行不同任務的規劃。硬體以內部邏輯門和存儲單元的形式出現,最基本的級別就是多電晶體電路組合。

由於FPGA的專案實現實際上只是硬體連接,所以FPGA可以並行運行多個操作!想像一下,如果系統任務如下:讀取光敏電阻上的電壓降;讀取霍爾效應感測器的輸入;並通過UART連接與另一個裝置進行通信。微控制器方案的程式流程圖可能如下所示:

fpga tutorial

請注意不同任務是序列完成的。而FPGA則可以使用不同電路分別執行三個任務,因此允許系統並存執行所有三個操作。因此,FPGA方案的項目實現原理將如下所示:

fpga tutorial

上述例子只是很簡單地解釋了微控制器方案與運行和FPGA方案與運行之間的區別,這一點很重要。實際上,FPGA的內部專案實現取決於專案本身,微控制器可能通過並行化執行指令來提高性能。關鍵的一點是這兩種架構實現相同任務的方式不同:微控制器序列執行指令,而FPGA則通過路由內部硬體實現功能行為。


許多FPGA研發板都可以當作入門模組使用,比如Digilent和Xilinx出售的ArtyBasys研發板。在本教學中,我們將使用Embedded Micro的Mojo V3。這是一款低成本板卡,也可用作入門模組。我個人比較喜歡Mojo研發板,比如Basys 3,因為它帶有大量可與外部電路連接的插頭引腳!此外,Embedded Micro還提供許多很棒的教學,幫助研發人員使用FPGA(請參考附錄中的連結)!

fpga tutorial

圖2:Mojo V3研發板/ ©Embedded Micro

在本教學中,我們從一個基本的輸入/輸出示例開始,向您介紹Mojo研發板的程式設計過程。在第2部分中,我們會為您準備一個更複雜的項目:硬體PWM實現!

本教學演示了如何使用Verilog硬體描述語言(稍後我們將詳細討論該語言)來配置Mojo!Verilog及其變體已經成為業界常用軟體,所以您通過 Mojo項目學到的知識也能應用到其他更高級的研發板上!

 

所需軟硬體如下:

硬體:

  • Mojo V3 研發板
  • Micro USB 電纜
  • Windows 或 Linux 電腦(不幸的是,目前不支援Mac作業系統)
  • 紅色 LED
  • 1 x 150Ω 或類似電阻(用於LED限流)
  • 2 x 10kΩ 電阻(用於按鈕下拉)
  • • 麵包板和跳線

軟體:

  • Mojo Loader (將設計實現上傳至FPGA)
  • ISE Design Suite(編寫和綜合Verilog代碼的IDE)
    • 在下載頁面上向下滾動,直到看到標有“ISE Design Suite”的部分
  • Mojo Base Project(所有項目都將以Mojo提供的該項目骨架為基礎)

比如說,我們想只有當兩個外部按鈕都按下時,才能點亮一個外部LED。首先,我們注意到這是一個數位系統,因為按鈕輸入電壓和LED輸出電壓只能取兩個值中的一個:0伏或3.3伏。我們可以用邏輯0表示0伏,用邏輯1表示3.3伏,從而對輸入端和輸出端的所有可能電壓值進行二進位編碼。實際上,1和0是“高”和“低”數位電壓訊號的另一種表達方式。

下表總結了按鈕輸入的所有值和對應的LED輸出值:

 

輸入 1 (按鈕 1) 輸入 2 (按鈕 2) 輸出 (LED)
0 0 0
0 1 0
1 0 0
1 1 1

 

熟悉布林代數(研究二進位值和二進位值的不同運算)的人會把這個雙輸入單輸出系統看作與(AND)門。及閘的工作原理是只有當兩個輸入都是1時輸出才是1,這正是我們想要的按鈕和LED配置!許多邏輯門將輸出值定義為輸入值的函數。要查看所有邏輯門的資訊,請點擊附件中的連結!

我們首先按下圖所示將按鈕和LED連至Mojo研發板:

fpga tutorial

圖3:Mojo研發板連接一個LED和兩個按鈕的接線圖(通過Fritzing創建;Mojo Fritzing文件由Michael Earls製作)

我們現在可以對Mojo進行程式設計。啟動ISE並打開您下載的基礎項目。螢幕應該如下所示:

fpga tutorial

在視窗左側,您應該看到一個含有不同檔的層次結構。按兩下文件mojo_top.v。該檔中的Verilog代碼應該在螢幕右側彈出。

fpga tutorial

現在,我們簡單介紹一下Verilog語言及其檔結構。首先需要注意的是,Verilog不是傳統意義上的程式設計語言。如前所述,FPGA的內部硬體是可配置的。而Verilog語言則是設計人員和FPGA實現軟體(本文為ISE Design Suite)之間的介面。更具體地說,實現軟體讀取Verilog代碼並通過內部演算法將其轉換成一系列邏輯門,從而實現代碼指定的功能。因此,Verilog被稱為硬體描述語言,簡稱HDL。

Verilog代碼分為相互作用的多個不同模組——這些模組類似於其他程式設計語言的函數。這些模組可以有多個輸入和輸出,模組內部的代碼會指定如何根據不同的輸入值驅動輸出。您可能會注意到,不同模組可以分佈在多個Verilog .v文件中。Mojo基礎項目包含幾個.v文件:AVR、SPI和序列功能。mojo_top.v檔是中心Verilog模組,該模組指定FPGA的主要行為。ISE足夠智慧,能識別這是程式的中心(“主”)模組。在螢幕左側的檔層次結構中,您會看到mojo_top.v文件位於列表頂部。

fpga tutorial

除Verilog .v檔外,您還會看到一個副檔名為.ucf的檔,該檔代表用戶約束檔(User Constraints File)。在這個檔中,用戶在他或她的項目中為輸入和輸出(I / O)連接指定名稱,並確定與這些訊號相關的引腳和I/O標準。我們開始編輯這個檔。在左側流覽器中按兩下檔案名,該檔會在右側的新選項卡中打開。

fpga tutorial

您會看到這個檔中已經存在幾條指令。這些指令指定了板上連接的名稱,比如板載LED和不同通信匯流排的連接。向下滾動至檔末尾,按鍵盤上的“Enter”鍵創建一個新行。我們要添加三條指令,分別對應兩個按鈕輸入引腳和一個LED輸出引腳。 我們要做的就是按照檔中其他指令的格式編寫新指令即可!

您可以複製檔中以“NET”開頭的任何一條指令,然後在檔底部粘貼三次,修改行首引號內的字串以及“P”後面的數位。在本教學中,我們將使用14和21腳作為按鈕輸入,26腳作為LED輸出,因此我們應在檔底部添加以下指令:

NET “button_a” LOC = P14 | IOSTANDARD = LVTTL;

NET “button_b” LOC = P21 | IOSTANDARD = LVTTL;

NET “led_external” LOC = P26 | IOSTANDARD = LVTTL;

請確保您選擇的引腳不與UCF檔指定的引腳衝突。

現在您的UCF檔應該是這樣的:

fpga tutorial

現在我們已經指定專案的具體訊號名稱及其關聯連接,我們可以編寫代碼,將LED輸出描述為按鈕輸入訊號的函數。您可能已經猜到了,這需要修改mojo_top模組。

模組聲明部分的頂部是單詞“module”(模組),然後是模組名稱(本例中模組名稱為mojo_top)以及模組將要使用的輸入和輸出訊號清單。我們需要將兩個按鈕訊號名稱和LED訊號名稱添加到該連接清單中,使得訊號能夠成為輸入和輸出。要做到這一點,我們可以在訊號清單末尾添加以下程式:

input button_a,

input button_b,

output led_external

現在,模組頭應該是這樣的:

fpga tutorial

至此,我們已經為按鈕和外部LED聲明了訊號名稱,並為這些訊號分配了Mojo研發板I/O引腳,並且在Verilog中指定這些訊號分別是輸入和輸出。現在,我們所要做的就是定義LED點亮的條件!更具體地說,我們需要指定發光二極體開啟(二進位1)和斷路(二進位0)的情況。

回想之前的討論,我提到LED的操作行為與布林與(AND)函數完全相同。在Verilog中,我們用符號&&表示布林與(AND)運算。我們想要將按鈕輸入的與函數結果分配給LED。實現此功能的Verilog代碼如下:

assign led_external = button_a && button_b;

將這行指令添加到模組末尾就可以實現我們所需的行為。打開基礎專案時,我們會看到這行程式上方本來就存在許多程式列,這些程式設定了其他不同訊號,比如板上SPI和板載LED訊號,在本專案中我們不會使用這些訊號。

現在,完整模組應該是這樣的:

fpga tutorial

要對FPGA進行程式設計以實現我們指定的行為,我們必須生成一個程式設計檔,其格式為.bin文件。發出命令之後,ISE會綜合我們的設計(檢查錯誤並運行測試),然後實現設計(定義實現指定行為所需的內部門結構),並生成這個程式設計檔。要運行此過程,請按兩下左下視窗中的“Generate Programming File”(生成程式設計檔)按鈕。

fpga tutorial

在程式設計檔生成的過程中,ISE會發出幾條丟失網路和/或未路由網路的警告。這些警告對於此實現並不重要,不會影響我們對FPGA的程式設計。我們沒有使用UCF中指定的所有訊號,所以ISE才會發出這些警告。

程式設計檔生成完成後,ISE會在我們剛才按兩下的按鈕旁邊添加一個綠色對號。

fpga tutorial

現在,我們所要做的就是將程式設計檔上傳到Mojo研發板上。首先,請確保按上圖所示將按鈕和LED連至Mojo的引腳。

其次,打開Mojo Loader軟體並選擇與Mojo相對應的USB埠。然後,選擇ISE生成的.bin文件。您必須導航至專案目錄下的/syn/資料夾。在Mojo Loader內打開.bin檔後,請點擊窗口右下方的“Load”(載入)按鈕。程式設計檔就開始向Mojo研發板上傳。

fpga tutorial

該過程完成後,您就可以測試您的設計了!只有按下兩個按鈕時,LED燈才會點亮。恭喜,您已經完成了您的第一個FPGA項目!我們還為您準備了一個更複雜的硬體PWM專案,敬請查看本教學的第2部分!

 

附錄

Embedded Micro 教學: https://embeddedmicro.com/tutorials/mojo

邏輯門: https://en.wikipedia.org/wiki/Logic_gate