使用verilog编写周期为4s的呼吸灯,基于quartues平台,并具有测试文件查看波形,适合新手入门

使用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输出相同,否则相反。
在这里插入图片描述

本人小白入门,把学到的东西分享,希望在此查看的老铁批评指正,希望大家共同进步。

发布了18 篇原创文章 · 获赞 48 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weiyunguan8611/article/details/88317629