1.学习要求
目标:实现8个LED灯(LED 0~LED 7)间隔100ms依次点亮,然后全部熄灭,再依次点亮。
2.仿真分析
clk是50Mhz时钟,那么一个周期为(1X10^9)/(50X10^6)=20ns,1秒对应50000000个时钟周期,100ms=5000000个时钟周期。
复位时,LED灯全部熄灭 :led=8'hff
点亮第1个LED灯 :led=8'hfe 点亮第1,2两个LED灯 :led=8'hfc
点亮第1,2,3三个LED灯 :led=8'hf8 点亮第1,2,3,4四个LED灯 :led=8'hf0
点亮第1,2,3,4,5 五个LED灯 :led=8'he0
点亮第1,2,3,4,5 ,6 六个LED灯 :led=8'hc0
点亮第1,2,3,4,5,6,7 七个LED灯 :led=8'h80
点亮第1,2,3,4,5,6,7,8 八个LED灯 :led=8'h00
这种用状态机来实现
3.代码编写
时钟计数器为led0_cnt,led1_cnt,led2_cnt,led3_cnt,led4_cnt,led5_cnt,led6_cnt,led7_cnt。
该ledn_cnt计数器用于计算100ms的时钟个数,ledn_cnt=ledn_cnt+1表示一直在计数,数到5000000下,则表示数到100ms的时间了。
计数器代码:
always@(posedge clk or negedge rst_n)begin
if(rst_n==0)
ledn_cnt<=0;
else if(curr_st==Sn)
ledn_cnt<=ledn_cnt+1;
else
ledn_cnt<=0;
end
状态机代码
复位时,处于空闲状态,led所有灯都是熄灭的文章来源:https://www.toymoban.com/news/detail-421002.html
然后当ledn_cnt计数到到5000000-1时,就可以跳转到下一个状态。文章来源地址https://www.toymoban.com/news/detail-421002.html
always@(posedge clk or negedge rst_n)begin
if(rst_n==0)
curr_st<=IDLE;
else case(curr_st)
IDLE:curr_st<=S0;
S0:begin
if(led0_cnt==time_100ms-1)//当led0_cnt等于time_500ms-1时,跳转到S1状态
curr_st<=S1;
else;
end
S1:begin
if(led1_cnt==time_100ms-1)
curr_st<=S2;
else;
end
S2:begin
if(led2_cnt==time_100ms-1)
curr_st<=S3;
else;
end
S3:begin
if(led3_cnt==time_100ms-1)
curr_st<=S4;
else;
end
S4:begin
if(led4_cnt==time_100ms-1)
curr_st<=S5;
else;
end
S5:begin
if(led5_cnt==time_100ms-1)
curr_st<=S6;
else;
end
S6:begin
if(led6_cnt==time_100ms-1)
curr_st<=S7;
else;
end
S7:begin
if(led7_cnt==time_100ms-1)
curr_st<=S8;
else;
end
S8:begin
if(all_off_cnt==time_100ms-1)
curr_st<=S0;
else;
end
default:;
endcase
end
到了这里,关于Quartus II使用——3 LED流水灯的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!