verilog实现,流水灯,彩灯闪烁,变速,自定义颜色等功能

'''24.1.31更新,加入了按键介绍和视频讲解,放在了末尾'''

'''24.4.11更新,项目的工程文件,报告,演示视频已放在百度网盘,大家自行取用

链接:https://pan.baidu.com/s/1Kfp_-r5jPcVTLo9NBL3bjg?pwd=6666 
提取码:6666

'''

最近接触FPGA,使用的为如图的STEP-MAX10小脚丫开发板

 此块开发板上有两个RGB三色LED;2路用户LED;4路拨码开关;2路按键;

我们希望使用其中的三色灯部分进行扩展,需要知道的是,这里的灯的亮状态是逻辑低电平有效的,且四个按键开关,都是低电平有效的,按下后才是低电平,平时高电平。

废话不多说,我们开始

首先初始化输入输出

module flu(
  input wire clk,//时钟信号
  input wire [1:0] A,//工作方式
  input wire toggle_switch,  // 速度
  input wire B,  // 选择灯
  input wire [3:0] push_button,    // 按键开关
  output wire [2:0] rgb0,
  output wire [2:0] rgb1,
  output wire [8:0] work,//数码管
  output wire [8:0] led//数码管
);

然后定义一些中间变量

reg [8:0]speed;
reg direction;  // 闪烁方向,00: 顺序,01: 逆序
reg [32:0] counter0;
reg [32:0] counter1;     // 闪烁计数器,用于调节闪烁速度
reg [2:0] color0;  
reg [2:0] color1;   
reg [8:0] seg[3:0];//数码管中间变量
reg [8:0] seg1[1:0];//数码管中间变量

需要注意的是reg寄存器变量都是二进制的,对于某些变量还是尽量多几位,免得因为溢出导致bug而不自知。

进行简单的初始化,对数码管的输出和一些基本状态的初始赋值

initial begin 
   seg[2'b00]=9'h3f;
   seg[2'b01]=9'h06;
   seg[2'b10]=9'h5b;
   seg[2'b11]=9'h4f;
	seg1[1'b0]=9'h06;
   seg1[1'b1]=9'h5b;
	speed<=1;
	direction<=1'b1;  // 闪烁方向,00: 顺序,01: 逆序
	counter0<=0;
	counter1<=0;     // 闪烁计数器,用于调节闪烁速度
	color0<=3'b000;  
	color1<=3'b000;   
end

后续always段根据时钟变量的上升沿检测执行

我们定义第三个按钮为复位键

if (push_button[3] == 0) begin
    // 软件复位
    direction <= 1'b1;
	 color0<=3'b000;
	 color1<=3'b000;
	 counter0<=0;
	 counter1<=0;  
  end 

后续根据A的输入判断工作方式,这里主要说一下我们的自动闪烁是怎么实现的

使用定义的counter变量进行计数,每一次时钟信号上升便进行一些计数,计数达到设定值后清0然后三色灯输出加一

当然每一次信号上升时counter自增是由输入的speed决定的,使用toggle_switch进行控制

注意这里只展示实现代码过程,而不是全部详细代码

case (toggle_switch)
	 1'b1: speed<=10;
	 1'b0: speed<=1;
    endcase
    // 检测按键开关
    if (push_button[0] == 0) begin
      // 切换闪烁方向
      direction <= ~direction;
    end
	 color0<=color0;
	 color1<=color1;
	 if(B==1'b0)//选中led0
	 begin 
	 if (direction)begin//变化方向
	 counter0 <= counter0 + speed;
    if (counter0 > 25000000) begin
        color0 <= color0 + 1;
        counter0 <= 0;
    end
	 end
    else begin
		 counter0 <= counter0 + speed;
	 if (counter0 > 25000000) begin
        color0 <= color0 - 1;
        counter0 <= 0;
    end
	 end
	 end

再讲一下可以手动调颜色的原理,使用三个按钮控制三个原色灯的亮灭,进而实现三原色的搭配

begin
  color1<=color1;
  color0<=color0;
  if (push_button[0] == 0)begin
  color0[0]<=~color0[0];
  end
  if (push_button[1] == 0)begin
  color0[1]<=~color0[1];
  end
  if (push_button[2] == 0)begin
  color0[2]<=~color0[2];
  end
  end

大体思路便是如上所讲述的内容

在模块末尾还需对输出进行赋值

assign work=seg[A],led=seg1[B],rgb0=color1,rgb1=color0;

另外,本博客使用的引脚如下

 

 以上便是本博客的全部内容,只是实现了基本的三色灯的功能,还有许多拓展功能等待着开发,如果你有更多想法,欢迎交流学习。

按键等页面解释:

视频展示:

彩灯解释

欢迎批评指正,如果本文对你有帮助的话,尽量点赞收藏,谢谢。

本文仅供参考,引用请标注来源。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值