小梅哥和你一起深入學習FPGA之點亮LED燈(上)
在之前更新的目錄里面,并沒有安排這個實驗,第一個實驗應該是獨立按鍵的檢測與消抖。可是,當小梅哥來做按鍵消抖的實驗時,才發現沒有做基本的輸出設備,因此按鍵檢測的結果無法直觀的展示出來。也算是為后續實驗做鋪墊吧,第一個實驗就安排成了點亮LED燈。
本文引用地址:http://www.104case.com/article/270853.htm一、 實驗目的
實現4個LED燈的亮滅控制
二、 實驗原理
LED燈的典型電路如下2-1所示,我們控制led燈的亮滅,實質就是去控制FPGA的IO輸給LED負極一個低電平或者高電平。從圖中可知,我們給對應的led負極上一個低電平,就會有對應的電流通過 電阻,流過led燈,于是LED燈就會被點亮;當給led負極一個高電平時,led兩端電壓相等,因此沒有電流流過,led則呈熄滅狀態。

圖2-1 led燈典型電路
三、 硬件設計
本實驗的硬件電路即如圖2-1所示,讀者一看即懂,因此本節內容略。
四、 架構設計
雖然本實驗只是一個簡單的點亮led燈實驗,整個實驗代碼不過四五行,但是為了遵循小梅哥一直喜歡的那種模塊化的設計理念,因此本設計還是將led的驅動做成子模塊的形式。
本實驗由兩個模塊組成,分別為led驅動模塊和頂層例化模塊,可能看過其它開發板資料的同學會覺得這樣反而增加了系統的復雜程度,但是,小梅哥如此設計必定有我的道理,圖4-1為本實驗的模塊組織結構

圖4-1 led實驗模塊組織結構圖
由圖可知本實驗僅有n個輸出端口,對應了n個led燈(為了代碼的可移植性,這里并沒有將led的個數限定死,而是采用了參數化的設計,因此,在實際使用過程中,就可根據實際不同的需要,自由的調整led的個數)。在modelsim仿真過程中,所有信號必須要有復位初始值,因此復位信號(Rst_n)必不可少。可能讀者這里會發現,與我昨天所寫的端口命名規范有出入。如果按照我所出的規范中來命名的話,則應該將復位信號命名為Global_Rst,對于這個問題,暫時小梅哥不做深入解說,其實嚴格意義上來說,這里的這個Rst_n應該只能算是一個內部信號,該信號在實際工程應用中往往由鎖相環產生。這里因為為了配合仿真,因此該信號就暫時被引出來,做了全局復位信號。詳細的關于全局復位與內部復位信號的處理,小梅哥在后面涉及到鎖相環的使用的實驗中會詳細解說。
表4-1 led實驗端口說明
五、 代碼組織方式
本實驗中,每個模塊也就四五行的代碼,因此談不上代碼組織方式,因此本節從略。
六、 關鍵代碼解讀
以下是代碼片段:
module LED_Driver #(parameter Width = 1)/*定義位寬參數*/
(Rst_n,Sig,Led);/*定義模塊端口*/
input Rst_n;
input [Width-1:0] Sig;
output [Width-1:0] Led;
assign Led = (Rst_n)?Sig:{Width{1'b1}};/*復位輸出全1,否則按照Sig的值輸出*/
endmodule
以上為LED驅動模塊的代碼,第1行定義了一個參數“Width”,即位寬,因此在例化(調用)此模塊時,根據實際需要給Width賦予不同的值,則可實現不同的LED位寬的設置。第4至7行為輸入輸出端口定義,具體信號含義見表4-1。第9行為LED輸出賦值語句,有關該代碼的含義,請讀者自行閱讀夏宇聞老師的《Verilog數字系統設計教程》一書。小梅哥精力和時間實在太有限,沒辦法一一幫大家補充Verilog的知識,望見諒。總之,該語句實現了當復位信號為低電平時(系統處于復位狀態),所有LED全部熄滅;當復位信號為高電平(系統正常工作)時,led輸出對應的Sig信號各位的狀態。
以下是代碼片段:
module LED_TOP(Rst_n,Led);
input Rst_n;
output [3:0] Led;
LED_Driver
#( /*參數例化*/
.Width (4)
)
LED_Driver_inst(/*端口例化*/
.Rst_n(Rst_n),
.Sig(4'b1001),/*OFF ON ON OFF*/
.Led(Led)
);
endmodule
以上為LED實驗的頂層模塊,其中將位寬參數例化為了4,即4個LED。因為沒有其他模塊提供Sig信號,因此直接將該信號賦值為4’b1001。則如果下載到實驗板上,會看到4個led燈分別處于“滅 亮 亮 滅”的狀態。
fpga相關文章:fpga是什么
led燈相關文章:led燈原理
鎖相環相關文章:鎖相環原理
評論