'''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;
另外,本博客使用的引脚如下
以上便是本博客的全部内容,只是实现了基本的三色灯的功能,还有许多拓展功能等待着开发,如果你有更多想法,欢迎交流学习。
按键等页面解释:
视频展示:
彩灯解释
欢迎批评指正,如果本文对你有帮助的话,尽量点赞收藏,谢谢。
本文仅供参考,引用请标注来源。