項目簡介
該項目包括6個部分:
第一部分: LED閃爍
第二部分: LED是怎樣工作的(發(fā)光二極管的工作原理)
第三部分: 改變發(fā)光二極管的亮度
第四部分: 7段數(shù)碼管顯示
第五部分: LED復(fù)用
第六部分: LED點陣顯示
鏈接
引腳復(fù)用 - 減少LED顯示時使用的引腳數(shù)量.
LED閃爍
你有一個帶LED的FPGA板嗎?
試試下面這個簡單的設(shè)計
==========================================================
module LEDglow(clk, LED);input clk;output LED;reg [23:0] cnt;always @(posedge clk) cnt<=cnt+1;wire [3:0] PWM_input = cnt[23] ? cnt[22:19] : ~cnt[22:19];reg [4:0] PWM;always @(posedge clk) PWM <= PWM[3:0]+PWM_input;assign LED = PWM[4];endmodule
==========================================================
否則的話,LED閃爍得可能會太快或太慢。
LED是怎樣工作的
用FPGA控制LED
FPGA的輸出引腳是電壓源,簡單的解決辦法是添加一個串聯(lián)電阻到LED,通
常電阻的大小取100到1K歐姆。
?
LED基礎(chǔ)
LED (發(fā)光二極管) 是一個當有點流流經(jīng)它時會發(fā)光的半導體器件。
其符號看起來像二極管,有一個陰極和一個陽極。

?
LED允許電流從一個方向?qū)ǎ硪粋€方向截至,這點跟二極管是一樣的
跟所有二極管一樣,LED也有一個導通電壓,大約在2.0V左右。
低于 2.0V 時, 不發(fā)光(沒有電流流過LED).
高于 2.0V 時, LED導通,發(fā)光強度隨著流經(jīng)LED電流的大小而變化。
LED有兩個極限參數(shù):
最大正向電流(最大發(fā)光強度).通常在10 mA量級.
最大反向電壓(盡管LED被反向偏置時沒有電流流過它,但是也不要
加太大的反向電壓).通常反向電壓限制在5V,比通常的二極管低得多!
改變發(fā)光二極管的亮度
點亮或熄滅LED
下面是如何讓LED閃爍的代碼(開/關(guān)).
====================================================
module LEDblink(clk, LED);input clk; // clock typically from 10MHz to 50MHzoutput LED;// create a binary counterreg [32:0] cnt;always @(posedge clk) cnt<=cnt+1;assign LED = cnt[22]; // blink the LED at a few Hz (change
// the bit index to change the blinking rate)endmodule====================================================
使LED半亮
一種辦法是增大串聯(lián)在LED的電阻的阻值一倍。
另一種辦法是通過FPGA驅(qū)動LED一半的時間。如果切換的速度足夠快的話,LED看
起來就是半亮的。
====================================================
module LEDhalflit(clk, LED);input clk; // clk should be at least 200Hz. Anything above
//is fine (most FPGA boards have adequate clocks,
// running at a few 10's of MHz)output LED;reg toggle;always @(posedge clk) toggle<=~toggle;
// toggles at half
//the clk frequency
// (at least 100Hz)assign LED = toggle;endmodule====================================================
平滑的改變LED的亮度
對于LED亮度控制。PWM信號是一個理想的解決辦法。
下面是使用4位數(shù)字來控制LED產(chǎn)生16個亮度等級的例子。
====================================================
module LED_PWM(clk, PWM_input, LED);input clk;input [3:0] PWM_input;
???????????????????????????????????????????????????????? // 16 intensity levelsoutput LED;reg [4:0] PWM;always @(posedge clk) PWM <= PWM[3:0]+PWM_input;assign LED = PWM[4];endmodule=====================
LED呼吸閃爍
通過連續(xù)的改變LED的亮度,使得LED看起來像是在呼吸。
====================================================
module LEDglow(clk, LED);input clk;output LED;reg [23:0] cnt;always @(posedge clk) cnt<=cnt+1;wire [3:0] PWM_input = cnt[23] ? cnt[22:19] : ~cnt[22:19];
// ramp the PWM input up and downreg [4:0] PWM;always @(posedge clk) PWM <= PWM[3:0]+PWM_input;assign LED = PWM[4];endmodule====================================================
這跟我們在第一節(jié)展示的例子的HDL代碼是一樣的.
評論