使用verilog编写周期为4s的呼吸灯,基于quartues平台,并具有测试文件查看波形,适合新手入门
编写文件如下:
module breath_led(clk,rst_n,led);
input wire clk; //50MHZ时钟输出
input wire rst_n; //复位
output reg [3:0] led; //同时输出四位led
reg [6:0] cnt1; //20ns的时钟计数应该是0~99,共100次,位宽为7
reg [9:0] cnt2; //2us的时钟计数应该是0~999,共1000次,位宽为10
reg [9:0] cnt3; //2ms的时钟计数应该是0~999,共1000次,位宽为10
parameter CNT1_MAX = 7'd100; //定义参数,方便修改
parameter CNT2_MAX = 10'd1000;
parameter CNT3_MAX = 10'd1000;
wire flag1; //定义标志位
wire flag2; //定义标志位
wire wave; //定义输出波形
reg valid; //定义变量
//--------------------20ns计数器计数100次
always @(posedge clk)
begin
if(!rst_n)
cnt1<=7’d0;
else
if(cnt1<CNT1_MAX-1’b1)
cnt1<=cnt1+1’b1;
else
cnt1<=7’d0;
end
assign flag1=(cnt1<CNT1_MAX-1’b1)?1’b1:1’b0;//判断
//--------------------2us计数器计数1000次
always @(posedge clk)
begin
if(!rst_n)
cnt2<=10’d0;
else
if(flag1==1)
if(cnt2<CNT2_MAX-1’b1)
cnt2<=cnt2+1’b1;
else
cnt2<=10’d0;
else
cnt2<=cnt2;
end
assign flag2=(flag11’b1 && cnt2CNT2_MAX); //判断
//--------------------2ms计数器计数1000次
always @(posedge clk)
begin
if(!rst_n)
cnt3<=10’d0;
else
if(flag2==1’b1)
if(cnt3<CNT3_MAX-1’b1)
cnt3<=cnt3+1’b1;
else
cnt3<=10’d0;
else
cnt3<=cnt3;
end
assign wave = (cnt3>cnt2)?1’b0:1’b1; //输出的波形,通过计数器的数值比较输出占空比
always @(posedge clk)
begin
if(!rst_n)
valid<=1’b0;
else
if(flag21’b1 && cnt3CNT3_MAX-1’b1)//利用valid来判断满足三个条件
valid <= ~valid ;
else
valid <=valid;
end
always @(posedge clk) //利用此模块实现波形取反,从最暗到最亮到最暗
begin
if(!rst_n)
led<=1’b0;
else
if(valid ==1’b1)
led<=~{4{wave}};
else
led<={4{wave}};
end
endmodule
需要提醒的是wave为1时与led输出相同,否则相反,测试文件就比较简单了:
`timescale 1ns/1ps
module breath_led_tb();
reg clk;
reg rst_n;
wire [3:0] led;
//强制“订餐”(定参),方便观测波形
defparam breath_led_inst.CNT1_MAX= 7'd10;
defparam breath_led_inst.CNT2_MAX= 10'd10;
defparam breath_led_inst.CNT3_MAX= 10'd10;
breath_led breath_led_inst(
.clk(clk),
.rst_n(rst_n),
.led(led)
);
always #10 clk=~clk;
initial clk=1’b0;
initial
begin
rst_n=1’b0;
#200 @(posedge clk);
#2 rst_n=1’b1;
repeat(10101025)
begin
@(posedge clk);
end
$stop;
end
endmodule
这个生成的逻辑电路需要慢慢分析
可以看到一个周期的时间,和不同的占空比,因为led[3:0]四个灯 的状态是一样的,所以随便拿了led[3]来分析。再提醒一边的是wave为1时与led输出相同,否则相反。
本人小白入门,把学到的东西分享,希望在此查看的老铁批评指正,希望大家共同进步。