我們最常見到的電子元器件是什么,無疑是LED,在我們的生活中它無處不在,比如手機的背光、汽車的頭燈、幾乎所有的照明也都是LED的了。

當然,對于我們做硬件的“板農”來講, 哪個板子通上電以后沒有倆LED在亮,你心里一定發毛 - 電源短路了?程序掛了?

只要電源燈亮了,心理就踏實了.....3.3V在正常工作。狀態指示燈只亮可能還不夠,因為它的表情應該非常豐富,不同的節奏可能代表不同的狀態,你需要根據其閃爍的節奏來判斷系統所處的狀態,用過樹莓派的同學都知道,在你插上電的那一刻起,樹莓派的狀態等就各種花式變換。。。。
簡單的一顆燈,一顆單色的燈,就能給你提供非常豐富的信息,像不像我們常用的示波器、電壓表?
是的,我就是這么看重它的 - LED就是相當于數字邏輯的“示波器”。
所以,我在每一個FPGA程序里面(無論多簡單的功能),邏輯體的頭4行必定是:
reg [23:0] cnt;always @(posedge clk_in)cnt = cnt + 1'b1;assign hb_led = cnt[23];
為何?看到燈按照我設定的頻率閃了,我心理踏實,就像聽到了電路的心跳(hb = heart beat:心跳),知道編譯對了、管腳分配對了、時鐘是有的...
所以,數字邏輯編程要先植入一個LED燈的程序。
當然,就像程序員學習任何一門語言,必然先打印出"Hello World"一樣,FPGA的學習要先從點亮LED開始!
點亮了燈,你也就有了探頭,也就能夠通過它一窺神秘的FPGA內部的脈搏。
同樣,在我們這個學期的“數字電路”學習的系列文章中,我們也先從點亮LED入手。
下面就是純技術的內容部分,原文見 : https://www.stepfpga.com/doc/one_led,你也可以點擊“閱讀原文”跳轉過去。或掃描下面的二維碼:

就像軟件編程里的“Hello World”,點燈是FPGA學習的第一步,不要小瞧這么一顆小小的燈,點燈的方式可以有多種。在本節,我們通過4個點燈的程序達到以下的目標:
體驗LED的工作原理;
了解Verilog代碼的結構和基本的語法規范
體會HDL語言中的bit和FPGA端口電信號的關系
體驗FPGA設計從創建工程 –》 輸入代碼 –》 邏輯綜合 –》 分配管腳 –》 生成可下載的JED文件 –》 配置FPGA整個過程(理論知識參見FPGA設計流程)
在本實例中,我們以Web IDE(www.stepfpga.com)為例,同樣的示例也可以通過Lattice的官方FPGA設計工具Diamond或Intel的官方設計工具quartus_prime來實現,只是要注意這些工具的使用方法和管腳的正確分配。
在這個實驗中,我們主要用到小腳丫FPGA開發板上的以下幾個外設:

這是開發板上的8個紅色LED,LED1~8信號連接到FPGA的引腳,作為FPGA輸出信號控制。當FPGA輸出低電平時LED變亮,當FPGA輸出高電平時LED熄滅。

這是開發板上的2個三色LED,(R_LED1, G_LED1, B_LED1), (R_LED2, G_LED2, B_LED2)信號連接到FPGA的引腳,作為FPGA輸出信號控制。當FPGA輸出低電平時,相應的LED變亮,當FPGA輸出高電平時LED熄滅。
所以我們可以用開關或者按鍵來控制LED的亮滅。
根據Web IDE的使用流程介紹,我們先創建一個叫one_led_on_off的工程,并在該工程里面創建一個叫one_led_on.v的代碼(代碼名字跟工程的名字不需要一致):
module one_led_on(led);
output led;
assign led = 1'b0;
endmodule
這段代碼可以說是最簡單的一段Verilog程序了,從這段程序中可以看出Verilog語言的基本結構
點擊Web IDE的第二個功能鍵“邏輯綜合”,系統會自動將你寫好的Verilog代碼進行綜合,如果沒有語法錯誤,則給你一個Success的信息,你就可以走到下一步 - “管腳分配”了。我們的Web IDE會根據你寫好的module自動提取輸入輸出管腳的名字,你只要使用鼠標,通過圖形化的界面將這些module里的端口信號的名字映射到相應的管腳上即可,在這里我們將led映射到板子上的第三個led,鼠標指向led3,其右側會彈出一個向下的箭頭,點擊該箭頭,就可以看到led的名字了(如果多個端口還沒有分配管腳,這些未分配的端口信號的名字會出現在列表中),選中led,完成映射

在“管腳分配”里將第三顆LED配置為亮 (ON),分配了管腳的地方會亮起來
點擊“FPGA映射”,系統會自動根據你分配好的管腳執行,生成JED文件,如果沒有錯誤,會列出一堆的信息后,告訴你生成了jed的文件,在這段信息中也會有詳細的資源使用報告,這些資源報告的信息也是很重要的,為完成同樣一個功能,不同的人寫出來的邏輯占用的資源也是不同的。
這時候您可以點擊“文件下載”,選擇第二個按鈕“下載JED文件”,鼠標右鍵 –》另存為。。。指向到StepFPGA的盤即可完成對FPGA的下載編程。

配置到FPGA以后的效果,第三顆LED燈亮
正如上所述,我們小腳丫FPGA板上有8顆LED和2顆3色LED,總計8+6=14顆,我們通過邏輯讓某些燈亮,某些燈滅,看看代碼如何寫,實際的效果如何?比如:
代碼如下:
module one_led_on(led, led_r1, led_g1, led_b1, led_r2, led_g2, led_b2);
output [8:1] led; // define 8 led signals to be output
output led_r1, led_g1, led_b1;
output led_r2, led_g2, led_b2;
assign led_r1=1'b1; // set signal of this pin = 1 to turn off the led connected to this pin
assign led_g1=1'b0; // make the green led on
assign led_b1=1'b1;
assign led_r2=1'b1;
assign led_g2=1'b1;
assign led_b2=1'b0; // make the blue led on
assign led = 8'b01001100; // set bit 8, 6, 5, 2, 1 = 0 to make led 8, 6, 5, 2, 1 on
endmodule
Verilog語法說明:
管腳分配圖如下:
8顆單色的LED和兩顆的3色LED都被分配了管腳
下載到小腳丫FPGA板子上,實際的效果驗證:
將JED文件下載到FPGA板子以后的效果
// ********************************************************************
// >>>>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<<
// ********************************************************************
// File name : LED_onoff_sw.v
// Module name : led_onoff_sw
// Author : STEP
// Description : control 8 leds on and off with 4 push buttons and 4 switchs
// Web : www.stepfpga.com
//
// --------------------------------------------------------------------
// Code Revision History :
// --------------------------------------------------------------------
// Version: |Mod. Date: |Changes Made:
// V1.0 |2021/09/15 |Initial ver
// --------------------------------------------------------------------
// Module Function: use external button to control leds
module LED (key,sw,led);
input [3:0] key; // 4 push buttons input
input [3:0] sw; // 4 switchs input
output [7:0] led; // output control signals to 8 leds
assign led = {key,sw}; //assign led signal values to 4 keys input + 4 switches input
endmodule
Verilog語法說明:
管腳分配如下:

將模塊端口的16個信號分別分配給8個LED和4個按鍵、4個開關
將生成的JED文件下載到FPGA板以后的效果:
用開關和按鍵可以控制LED的on/Off, 正常開關和按鍵的狀態都為高電平,8個LED都處于滅的狀態,改變開關和按鍵的裝填可以讓LED亮起來,按鍵、開關和LED一一對應。
從邏輯的角度,這段代碼跟第4節的代碼沒什么區別,用了一個三色LED燈代替8個單色的燈,目的是為了讓大家通過實際的效果體會一下三色燈的顏色搭配。
代碼見下:
// ********************************************************************
// >>>>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<<
// ********************************************************************
// File name : RGBLED.v
// Module name : RGBLED_SW
// Author : STEP
// Description : control RGB LED with 3 switchs
// Web : www.stepfpga.com
//
// --------------------------------------------------------------------
// Code Revision History :
// --------------------------------------------------------------------
// Version: |Mod. Date: |Changes Made:
// V1.0 |2021/09/15 |Initial ver
// --------------------------------------------------------------------
// Module Function: Use 3 switches to control one RGB LED's on/off and color change。
module RGBLED_SW (sw,led);
input [2:0] sw; //input control signals with 3 switchs
output [2:0] led; //output signals to 1 RGB LED
assign led = sw; //assign sw value to led
endmodule
分配一下管腳:

一顆RGB和3個開關被映射到端口信號上
下載到小腳丫FPGA板子上,實際的效果驗證
將JED文件下載到FPGA板子以后的效果
通過4段代碼,我們體驗了對LED的開關控制以及最基本的Verilog語法要求和代碼構成,以及開關和按鍵的控制差異,這為后期的輸入輸出控制、狀態輸出展示打下了基礎。
前期關于數字電路學習的文章:
淺談“數字電路”的學習(1)- 我們身處的“數字邏輯”世界
淺談“數字電路”的學習(2)- 在興趣和體驗中高效學習
淺談“數字電路”的學習(3)- 不需要安裝軟件、人人一學就會的FPGA學習板