10位LED彩灯设计(verilog实现)

本文介绍了一项实验,通过3个计数器控制10位LED灯,实现不同颜色的闪烁,每秒一次,且支持频率调整。设计包括控制LED全灭、不同颜色轮换和循环启动过程。代码和仿真波形展示了LED灯按RGB顺序逐一亮起的实现过程。
摘要由CSDN通过智能技术生成

        本实验要实现的工程,旨在通过控制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为第三种颜色

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值