一、实验任务
本节实验任务是使用开发板上的 LED,实现呼吸灯的效果,即由灭渐亮,然后再由亮渐灭。(呼吸频率为2S)
二、程序设计
2.1 呼吸灯模块设计
module breath_led(
input sys_clk,
input sys_rst_n,
output reg [3:0] led
);
parameter CNT2US_MAX = 7'd100;
parameter CNT2MS_MAX = 10'd1000;
parameter CNT2S_MAX = 10'd1000;
reg [6:0] cnt_2us; //100个时钟周期
reg [9:0] cnt_2ms; //1000个cnt_2us
reg [9:0] cnt_2s; //1000个cnt_2ms
reg [3:0] led_flag;
//2us
always @(posedge sys_clk or negedge sys_rst_n) begin
if(!sys_rst_n)
cnt_2us <= 7'd0;
else if(cnt_2us == CNT2US_MAX - 7'd1)
cnt_2us <= 7'd0;
else
cnt_2us <= cnt_2us + 7'd1;
end
//2ms
always @(posedge sys_clk or negedge sys_rst_n) begin
if(!sys_rst_n)
cnt_2ms <= 10'd0;
else if(cnt_2ms == CNT2MS_MAX - 7'd1)
cnt_2ms <= 10'd0;
else if(cnt_2us == CNT2US_MAX - 10'd1)
cnt_2ms <= cnt_2ms + 10'd1;
else
cnt_2ms <= cnt_2ms;
end
//2s
always @(posedge sys_clk or negedge sys_rst_n) begin
if(!sys_rst_n) begin
cnt_2s <= 10'd0;
led_flag <= 4'b1111;
end
else if(cnt_2s == CNT2S_MAX - 10'd1) begin
cnt_2s <= 10'd0;
led_flag <= ~led_flag;
end
else if(cnt_2ms == CNT2MS_MAX - 10'd1)
cnt_2s <= cnt_2s + 10'd1;
else
cnt_2s <= cnt_2s;
end
//控制灯
always@(posedge sys_clk or negedge sys_rst_n) begin
if(!sys_rst_n)
led <= 4'b0000;
else if(cnt_2ms < cnt_2s)
led <= led_flag;
else
led <= ~led_flag;
end
endmodule
2.2 仿真
`timescale 1ns / 1ns //仿真单位/仿真精度
module tb_breath_led();
//parameter define
parameter CLK_PERIOD = 20; //时钟周期 20ns
parameter CNT2US_MAX = 7'd2;
parameter CNT2MS_MAX = 10'd10;
parameter CNT2S_MAX = 10'd10;
//reg define
reg sys_clk;
reg sys_rst_n;
//wire define
wire [3:0] led;
//信号初始化
initial begin
sys_clk <= 1'b0;
sys_rst_n <= 1'b0;
#200
sys_rst_n <= 1'b1;
end
//产生时钟
always #(CLK_PERIOD/2) sys_clk = ~sys_clk;
//例化待测设计
breath_led #(
.CNT2US_MAX (CNT2US_MAX),
.CNT2MS_MAX (CNT2MS_MAX),
.CNT2S_MAX (CNT2S_MAX)
)u_breath_led(
.sys_clk (sys_clk),
.sys_rst_n (sys_rst_n),
.led (led)
);
endmodule
仿真结果如下图所示: