前言:
本文主要介紹了集成電路EDA這門(mén)課程的相關(guān)實(shí)驗(yàn)及代碼。使用的軟件是Quartus Ⅱ,該實(shí)驗(yàn)使用fpga芯片為cyclone IV EP4CE115F29C7。
(一)實(shí)驗(yàn)?zāi)康?/h2>
(1)熟悉流水燈的工作原理;
(2)了解設(shè)計(jì)中的優(yōu)化方案;
(3)進(jìn)一步掌握PWM信號(hào)的設(shè)計(jì);
(二)設(shè)計(jì)要求
利用FPGA板及4個(gè)LED發(fā)光二極管,設(shè)計(jì)一個(gè)亮度可調(diào)流水燈程序:
其中流水燈亮度使用PWM驅(qū)動(dòng),并且可以使用按鍵切換不同亮度。
(三)實(shí)驗(yàn)原理
流水燈的實(shí)質(zhì)是FPGA板各引腳在規(guī)定的時(shí)間逐個(gè)上電,使LED燈能逐個(gè)亮起來(lái)但過(guò)了該引腳通電的時(shí)間后便滅燈的過(guò)程,至于亮度可調(diào)則是使用PWM產(chǎn)生一定占空比的方波,實(shí)現(xiàn)輸出電壓變化,并可以通過(guò)調(diào)節(jié)占空比的大小改變輸出電壓值即LED燈的亮度。
實(shí)驗(yàn)中使用了單片機(jī)的P1端口和P4端口,對(duì)4個(gè)LED燈進(jìn)行控制,要實(shí)現(xiàn)逐個(gè)亮燈即將各端口逐一置零,中間使用延時(shí)函數(shù)調(diào)用隔開(kāi)各燈的亮滅。
本次實(shí)驗(yàn)先令四個(gè)燈全亮,延時(shí)500ms后再令四個(gè)燈全滅,之后點(diǎn)亮P4.7,P1.7兩個(gè)燈,延時(shí)500ms后熄滅,之后依次點(diǎn)亮P4.7,P4.6,P1.7,P1.6,(一個(gè)燈點(diǎn)亮500ms后熄滅,第二個(gè)燈再點(diǎn)亮),然后反向,按照P1.6,P1.7,P4.6,P4.7順序點(diǎn)亮一遍,如此往復(fù)循環(huán)。
(四)實(shí)驗(yàn)設(shè)備
(1)DE2-115型號(hào)FPGA板
(2)PC電腦
(五)實(shí)驗(yàn)結(jié)果
仿真圖:
PWM波形使用cnt_1ms與tim變量大小來(lái)產(chǎn)生,當(dāng)cnt_1ms<=tim時(shí)低電平否則高電平,圖中可以看到,初始值tim=0,此時(shí)當(dāng)cnt_1ms>tim時(shí)第一個(gè)燈亮,按下一次按鍵后,time自加8,此時(shí)當(dāng)cnt_1ms<=8時(shí),燈滅,否則第一個(gè)燈亮。
如上圖所示,可以看到當(dāng)cnt計(jì)數(shù)達(dá)到999時(shí),由第二個(gè)燈亮變成第三個(gè)燈亮,證明完成了燈的流水操作。
實(shí)物圖:
初始流水燈:
按下按鍵調(diào)節(jié)亮度后:
(六)結(jié)果分析
本次實(shí)驗(yàn)為了完成可調(diào)節(jié)亮度的流水燈的設(shè)計(jì),首先產(chǎn)生0.5s脈沖使得每0.5s更改亮燈的位置,之后通過(guò)按鍵更改PWM產(chǎn)生波形中的占空比,從而調(diào)節(jié)燈的亮度。
代碼:
1.頂層模塊water_led文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-762749.html
//4個(gè)led_out_reg燈,依次點(diǎn)亮,間隔0.5s 50Mhz-20ns 25000000次-25位
module water_led
(
input wire sys_clk ,
input wire sys_rst_n ,
input wire key1 ,
output reg [3:0] led_out
);
parameter CNT_MAX=25'd24_999_999 ; //0.5s
parameter CNT_1US_MAX=6'd49 ; //1個(gè)時(shí)鐘20ns,50個(gè)即1us
parameter CNT_1MS_MAX=10'd999 ; //計(jì)滿1000個(gè)即1ms
wire key1_flag;
reg cnt_flag;
reg [9:0] tim;
reg [24:0] cnt;
reg [5:0] cnt_1us;
reg [9:0] cnt_1ms;
reg [9:0] cnt_1s;
reg [3:0] i;
//0.5s間隔閃爍
always @(posedge sys_clk or negedge sys_rst_n)
if(!sys_rst_n)
cnt<=25'd0;
else if(cnt==CNT_MAX)
cnt<=25'd0;
else
cnt<=cnt+25'd1;
//計(jì)數(shù)滿0.5s標(biāo)志位
always @(posedge sys_clk or negedge sys_rst_n)
if(!sys_rst_n)
cnt_flag<=1'd0;
else if(cnt==CNT_MAX-1)
cnt_flag<=1'd1;
else
cnt_flag<=1'd0;
//亮度變量調(diào)整
always @(posedge sys_clk or negedge sys_rst_n)
if(!sys_rst_n)
tim <= 10'd0;
else if(tim >= 10'd999)
tim <= 10'd0;
else if(key1_flag)
tim <= tim + 10'd80;
else
tim <= tim;
//cnt_1us
always@(posedge sys_clk or negedge sys_rst_n)
if(!sys_rst_n)
cnt_1us<=6'd0;
else if(cnt_1us==CNT_1US_MAX)
cnt_1us<=6'd0;
else
cnt_1us<=cnt_1us+6'd1;
//cnt_1ms
always@(posedge sys_clk or negedge sys_rst_n)
if(!sys_rst_n)
cnt_1ms<=10'd0;
else if((cnt_1ms==CNT_1MS_MAX)&&(cnt_1us==CNT_1US_MAX))
cnt_1ms<=10'd0;
else if(cnt_1us==CNT_1US_MAX)
cnt_1ms<=cnt_1ms+10'd1;
else
cnt_1ms<=cnt_1ms;
//每0.5s,i自加1,即更改亮燈位置
always @(posedge sys_clk or negedge sys_rst_n)
if(!sys_rst_n)
i <= 3'd0;
else if((cnt_flag == 1'd1)&&(i == 3))
i <= 3'd0;
else if(cnt_flag == 1'd1)
i <= i + 1'd1;
else
i <= i;
//輸出控制
always @(posedge sys_clk or negedge sys_rst_n)
if(!sys_rst_n)
led_out <= 4'b0001;
else
begin
if(cnt_1ms<=tim)
led_out <= 4'b0000;
else
case(i)
3'd0: led_out <= 4'b0001;
3'd1: led_out <= 4'b0010;
3'd2: led_out <= 4'b0100;
3'd3: led_out <= 4'b1000;
default: led_out <= 4'b0000;
endcase
end
//按鍵濾波模塊,按下按鍵后模塊輸出一個(gè)時(shí)鐘周期的高脈沖
key_filiter key_filiter_inst
(
.sys_clk (sys_clk ) ,
.sys_rst_n (sys_rst_n) ,
.key_in (key1 ) ,
.key_flag (key1_flag)
);
endmodule
2.按鍵模塊key_filiter文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-762749.html
//按鍵濾波器,按下按鈕后即低電平輸入,經(jīng)過(guò)該模塊輸出一個(gè)系統(tǒng)時(shí)鐘周期的高脈沖
module key_filiter
(
input sys_clk ,
input sys_rst_n ,
input key_in ,
output reg key_flag
);
reg [19:0] cnt_20ms;
parameter CNT_MAX=20'd999999;
always@(posedge sys_clk or negedge sys_rst_n)
if(!sys_rst_n)
cnt_20ms<=20'd0;
else if(key_in)
cnt_20ms<=20'd0;
else if(cnt_20ms==CNT_MAX) //最大值保持
cnt_20ms<=CNT_MAX;
else
cnt_20ms<=cnt_20ms+1'd1;
always@(posedge sys_clk or negedge sys_rst_n)
if(!sys_rst_n)
key_flag<=1'b0;
else if(cnt_20ms==CNT_MAX-20'd1)
key_flag<=1'b1;
else
key_flag<=1'b0;
endmodule
到了這里,關(guān)于FPGA-DE2-115-實(shí)驗(yàn)一-亮度可調(diào)流水燈的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!