本实验要实现的工程,旨在通过控制10位LED灯闪出不同的三种以上的花色。具体要求为:上电后,LED灯首先全灭,然后自动开始闪烁,完成设计的三种(或以上)花色后,又回到初始状态重新开始新一轮的闪烁。要求闪烁的频率为1s,可以增加频率可调的功能。
设计思路:由于10位LED灯要闪出3种及以上颜色,并且闪烁的频率为1s,并且频率可调。由此设计了3个计数器,计数器cnt0用于计数1s,cnt1用于控制频率可调,cnt3用于计数3种颜色。
设计代码:
module com_experiment(
clk,
rst_n,
led,
x //改变频率
);
input clk;
input rst_n;
input x;
output led;
parameter COUNTER=50;//计数1秒需要计数50_000_000次,因为仿真时间过长改为计数50次
reg [25:0] cnt0 ;
wire add_cnt0 ;
wire end_cnt0 ;
reg [1:0] cnt1 ;
wire add_cnt1 ;
wire end_cnt1 ;
reg [2:0] cnt2 ;
wire add_cnt2 ;
wire end_cnt2 ;
reg [9:0] led ;
wire [1:0] x ;
//计数1秒
always@(posedge clk or negedge rst_n) begin
if(!rst_n) begin
cnt0<=0;
end
else if(add_cnt0) begin
if(end_cnt0)
cnt0<=0;
else
cnt0<=cnt0+1;
end
end
assign add_cnt0=1;
assign end_cnt0=add_cnt0&&cnt0==COUNTER-1;
//控制闪烁的频率
always@(posedge clk or negedge rst_n) begin
if(!rst_n) begin
cnt1<=0;
end
else if(add_cnt1) begin
if(end_cnt1)
cnt1<=0;
else
cnt1<=cnt1+1;
end
end
assign add_cnt1=end_cnt0;
assign end_cnt1=add_cnt1&&cnt1==x-1;
//计数3次,每次闪烁一种颜色
always@(posedge clk or negedge rst_n) begin
if(!rst_n) begin
cnt2<=0;
end
else if(add_cnt2) begin
if(end_cnt2)
cnt2<=0;
else
cnt2<=cnt2+1;
end
end
assign add_cnt2=end_cnt1;
assign end_cnt2=add_cnt2&&cnt2==3-1;
//控制三种颜色的闪烁
always@(posedge clk or negedge rst_n) begin
if(rst_n==1'b0) begin
led<=10'b0000000000;//当满足此条件时,全灭
end
else if(add_cnt2 && cnt2==1-1) begin
led<=10'b0000000111;//当满足此条件时,前3个灯闪烁,第一种颜色
end
else if(add_cnt2 && cnt2==2-1) begin
led<=10'b0001111000;//当满足此条件时,中4个灯闪烁,第二种颜色
end
else if(add_cnt2 && cnt2==3-1) begin
led<=10'b1110000000;//当满足此条件时,后3个灯闪烁,第三种颜色
end
end
endmodule
仿真代码:
`timescale 1 ns/ 1 ns
module com_experiment_vlg_tst();
parameter CYCLE=20;
reg clk;
reg rst_n;
reg [1:0] x;
wire [9:0] led;
com_experiment i1 (
.clk(clk),
.led(led),
.rst_n(rst_n),
.x(x)
);
initial begin
clk=0;
forever#(CYCLE/2)begin
clk=~clk;
end
end
initial begin
x=1;
#200;
forever begin
x=1;
#600;
x=2;
#1200;
x=3;
#1800;
end
end
initial begin
#1;
rst_n=0;
#(CYCLE*10);
rst_n=1;
end
endmodule
仿真波形
上板
LEDG5~LEDG7显示的为一种颜色,LEDR6~LEDR9为第二种颜色,LEDR14~LEDR16为第三种颜色