FPGA &&双按键控制&&LED呼吸灯实现

2023-05-16

FPGA &&双按键控制&&LED呼吸灯实现

文章目录

  • FPGA &&双按键控制&&LED呼吸灯实现
    • 1.按键脉冲设计
      • 1.1按键脉冲信号代码
      • 1.2.按键脉冲Testbench代码
      • 1.3.仿真波形:
    • 2. pwm脉宽调制
      • 1.1PWM信号简介:
      • 1.2时间比例换算:
      • 1.3.设计一个周期10KHZ,占空比40%的信号:
      • 1.3.1verilog代码
      • 1.3.2Testbench代码
      • 1.3.3仿真波形:
    • 3.双按键控制 LED灯亮度的实现
      • 1.3.1双按键控制 LED灯verilog代码

​ 首先本次设计要实现的目标: 一个按键控制led闪烁频率的增加,另一个按键控制led闪烁频率的减小

[工程链接:](https://pan.baidu.com/s/137NTleHZP8ss9jTRnAhMhQ
提取码:qb68)

1.按键脉冲设计

​ 众所周知,按键一般采取消抖程序作为按键开关控制使用,这一次我采用了,脉冲信号来作为开关信号使用,本次采取**寄存器打拍实现

1.1按键脉冲信号代码

/*
 * @Description: 按键脉冲信号产生
 * @Version: 1.0
 * @Author: Fangyeye
 * @Date: 2022-12-19 20:16:02
 * @LastEditors: Fangyeye
 * @LastEditTime: 2022-12-19 20:46:01
 */
module key_pulse#(
        parameter  integer  KEY_NUM = 2     //按键的数量
)
(
    input       wire                                clk             ,       //系统时钟频率50MHZ
    input       wire                                rst_n           ,
    input       wire  [KEY_NUM-1 :0]                key_in          ,       //按键输入信号
    output      wire  [KEY_NUM-1 :0]                key_pulse          
);

reg     key_r , key_rr  ;

// 寄存器打两拍的作用:1.同步时钟域 2.捕获按键按下的下降沿
always @(posedge clk , negedge rst_n) begin
    if(!rst_n)begin
        key_r <=  'b0;
        key_rr <= 'b0;
    end
    else begin
       key_r <= key_in;
       key_rr <= key_r; 
    end
end

assign key_pulse = (~key_r) & key_rr ;
    
endmodule

1.2.按键脉冲Testbench代码

// 按键脉冲测试tb
`timescale 1ns/1ns 
module tb_key_pulse();

reg clk;
reg rst_n;
wire pulse;
reg key;

key_pulse  u0(
    .clk(clk ),
    .rst_n(rst_n),
    .key_in(key),
    .key_pulse(pulse)
);

always #10 clk = ~ clk;

initial begin
    clk = 0;
    key = 0;
    rst_n = 1;
    #5 rst_n = 0;
    #5 rst_n = 1;
    #105 key = 0;
    #50 key = 1;
    #200 key = 0;
    #100 key = 1;
    #2000 $stop;
end

endmodule

1.3.仿真波形:

FPGA &&双按键控制&&LED呼吸灯实现

易知:当按键按下时,key为低电平时立马产生一个脉冲信号,实现开关作用

2. pwm脉宽调制

1.1PWM信号简介:

在这里插入图片描述

  • 什么是PWM:PWM简称脉冲宽度调制,即在一个周期内存在不同极性的电平状态。

  • PWM频率:是指一秒钟内从高电平时间在到低电平时间,再从低电平跳到高电平的瞬间次数,也就是一秒钟内有多少个PWM的周期。f = T / 1(HZ)。 基本单位为HZ(赫兹)

  • PWM周期:是指一秒钟内从高电平时间在到低电平时间,T = f / 1(s)。

  • PWM占空比:是指一个周期内高电平时间和总时间的比值。

1.2时间比例换算:

​ 1s(秒) =1000毫秒=1000 000 (微秒) =1000 000 000 (纳秒)

​ 上面图表表示:

​ T(周期) : 10ms/1s = 0.01s

​ f(频率) : 0.01/1 = 100HZ

​ 占空比 ;4/(4+6) *100% =40

1.3.设计一个周期10KHZ,占空比40%的信号:

按照上面的波形我们来设计个周期10KHZ,占空比40%的方波信号吧

1.3.1verilog代码

/*
 * @Description: 输出可调的PWM信号模块
    @function :    1.FPGA的可调PWM信号模块 
                    2.可调PWM信号的周期/占空比
                    3.默认占空比设置:DUTY
                    4.输出 10KHZ 40%占空比信号
 * @Version: 1.0
 * @Author: Fangyeye
 * @Date: 2022-12-19 21:39:47
 * @LastEditors: Fangyeye
 * @LastEditTime: 2022-12-20 13:35:50
 */
module led_gard#(
    parameter   integer         CLK_FREQ    =   50_000_000  ,   //输入的时钟频率 
    parameter   integer         PERIOD      =   1_000       ,   //PWM信号周期   Unit:HZ  
    parameter   integer         DUTY        =   40          
)
(
//系统接口
    input       wire                            clk     ,   //输入时钟50MHZ   
    input       wire                            rst_n   ,   //系统复位,低电平复位
//输出信号 
    output      reg                             out         //输出信号
);

//reg
reg     [31:0]               cnt    ;       //计数器 --用于时钟分频 到 1KHZ

localparam      integer     CNT_PERIOD      =  ( CLK_FREQ / PERIOD )  -1                ;   //周期计数值
localparam      integer     CNT_DUTY        =   CNT_PERIOD * (DUTY *1.0 / 100) - 1      ;   //占空比计数值 --高电平计数值

//计数器计数 
always @(posedge clk , negedge rst_n) begin
    if(!rst_n)begin
        cnt <= 32'b0;
    end
    else if(cnt == CNT_PERIOD ) begin
        cnt <= 32'b0;
    end
    else begin
        cnt <= cnt + 1'b1;
    end
end

// 根据占空比 动态调节进行电平翻转
always @(posedge clk  , negedge rst_n) begin
    if(!rst_n)begin
            out <= 1'b1;    //默认输出高电平
    end
    else if(cnt >= CNT_PERIOD) begin
            out <= 1'b1;
    end
    else begin
       if(cnt >=  CNT_DUTY)begin //开始低电平计数
            out <= 1'b0;
       end 
    end
end

endmodule



1.3.2Testbench代码

/测试实例
`timescale 1ns/1ns

module tb_led_gard();

//reg
    reg         clk     ;
    reg         rst_n   ;


//wire 
    wire         out     ;

    parameter   integer         CLK_FREQ    =   50_000_000  ;   //输入的时钟频率 
    parameter   integer         PERIOD      =   1_000       ;   //PWM信号周期   Unit:HZ
    parameter   integer         DUTY        =   40          ;    //PWM的占空比  

    //实例化输出可调的PWM信号模块
    led_gard #(
        .CLK_FREQ(CLK_FREQ) ,
        .PERIOD(PERIOD)     ,
        .DUTY(DUTY)   
    )
    led_gard_init(
        .clk(clk),
        .rst_n(rst_n),
        .out(out)
    );

    initial begin
        clk = 1'b0;
        rst_n = 1'b0;
        #20 //系统开始工作
        rst_n = 1'b1;

    end

    always #10 clk = ~clk;

endmodule

1.3.3仿真波形:

在这里插入图片描述

易知 输出信号周期10KHZ,占空比40%,与预期设计相符合

3.双按键控制 LED灯亮度的实现

​ 接下来让我们修改代码来达到预期的设计,实现本次设计吧!

1.3.1双按键控制 LED灯verilog代码

/*
 * @Description: 一个按键控制led亮度的增加,另一个按键控制led亮度的减小
 * @Version: 1.0
 * @Author: Fangyeye
 * @Date: 2022-12-20 11:59:10
 * @LastEditors: Fangyeye
 * @LastEditTime: 2022-12-20 14:13:12
 */
 module fpga_top#(
    parameter   integer         CLK_FREQ    =   50_000_000  ,   //输入的时钟频率 
    parameter   integer         PERIOD      =   1_000       ,   //PWM信号周期   Unit:HZ  
    parameter   integer         DUTY        =   40              //默认40%占空比
)
(
//系统接口
    input       wire                            clk     ,   //输入时钟50MHZ   
    input       wire                            rst_n   ,   //系统复位,低电平复位
//用户接口
    input       wire                            key_up  ,   //亮度增加按键 
    input       wire                            key_down,   //亮度减小按键
//输出信号 
    output      reg                             out         //输出信号
 );

//reg
reg     [31:0]              cnt             ;       //计数器 --用于将时钟分频 到 1KHZ
reg     [9:0]               pulse           ;       //电平翻转计数器

//wire
wire                        key_up_pluse        ;     //亮度增加按键按下脉冲信号
wire                        key_down_pluse        ;   //亮度减小按键按下脉冲信号

localparam      integer     CNT_PERIOD      =  ( CLK_FREQ / PERIOD )  -1                ;   //周期计数值
localparam      integer     CNT_DUTY        =   CNT_PERIOD * (DUTY *1.0 / 100) - 1      ;   //占空比计数值 --高电平计数值


//计数器计数 
always @(posedge clk , negedge rst_n) begin
    if(!rst_n)begin
        cnt <= 32'b0;
    end
    else if(cnt == CNT_PERIOD ) begin
        cnt <= 32'b0;
    end
    else begin
        cnt <= cnt + 1'b1;
    end
end

// 根据占空比 动态调节进行电平翻转
always @(posedge clk  , negedge rst_n) begin
    if(!rst_n)begin
            out <= 1'b1;    //默认输出高电平
    end
    else if(cnt >= CNT_PERIOD) begin
            out <= 1'b1;
    end
    else begin
       if(cnt >=  pulse )begin //开始低电平计数
            out <= 1'b0;
       end 
    end
end

// 2个按键实例化
    key_pulse #(
        .KEY_NUM(1)
    )
    key_down_pulse_init (
        .clk(clk),
        .rst_n(rst_n),
        .key_in(key_down),
        .key_pulse(key_down_pluse)
    );

     key_pulse #(
        .KEY_NUM(1)
    )
    key_up_pulse_init (
        .clk(clk),
        .rst_n(rst_n),
        .key_in(key_up),
        .key_pulse(key_up_pluse)
    );

// 按键功能实现 
always @(posedge clk , negedge rst_n ) begin
    if(!rst_n)begin
        pulse <= CNT_DUTY;
    end
    else begin
        if(key_down_pluse)begin
           if(cnt <= CNT_PERIOD)begin
                pulse <= pulse + 4'd10;
           end 
        end
        else if (key_up_pluse) begin
           if(cnt >= 'd10)begin
                pulse <= pulse - 4'd10;
           end 
        end
    end
end


 endmodule
### 1.3.2上板验证

​ 两个按键触发方式为下降沿触发

在这里插入图片描述

由硬件原理图确定 (本人硬件是按下IO读取低电平)

在这里插入图片描述

FPGA读到数据
在这里插入图片描述

亮度增加按键按下:+10 ,亮度减小按键按下:-10
在这里插入图片描述

在这里插入图片描述

发现实物上板子LED亮度也有相应的变化,说明设计正确✔

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FPGA &&双按键控制&&LED呼吸灯实现 的相关文章

  • 奇怪的一些

    1 请求200 但是请求回来的是html 网络里会写 200OK from disk cache 这个时候需要清除浏览器缓存 2 base64 引入失败 找一个js文件直接引入 require is not defined import B
  • 【u103】绘制二叉树

    Time Limit 1 second Memory Limit 128 MB 问题描述 二叉树是一种基本的数据结构 xff0c 它要么为空 xff0c 要么由根节点 xff0c 左子树和右子树组成 xff0c 同时左子树和右子树也分别是二
  • react子父组件传值&生命周期

    react子父组件 父子组件传值 create react app 新建react文件 文件夹assets components css main props 父组件通过refs获取子组件 新建components firstpage js
  • nodejs连接MongoDB(增删改查)/MySQL

    启动mongodb 启动服务器 运行mongo 两个cmd命令框 vscode新建项目mongodb 新建mongo js 安装mongodb cnpm install mongodb save 进入momgo js 引入mongodb 远
  • QWaitCondition 的正确使用方法(qt线程同步)

    简单用法 QWaitCondition 用于多线程的同步 xff0c 一个线程调用QWaitCondition wait 阻塞等待 xff0c 直到另一个线程调用QWaitCondition wake 唤醒才继续往下执行 为了描述方便 xf
  • boost入门指南(windows)

    什么是boost boost库是一个开源免费的第三方库 xff0c 它是一个非常优秀的库 xff0c 是C 43 43 标准的最好实践之一 xff0c 因此也经常被用于商业的开发 boost致力于建立 C 43 43 标准的 现有实践 和参
  • GET . POST . PUT . DELETE 请求方式

    请求类型一共8种 常用的4种 GET POST PUT DELETE 1 GET get请求是用来获取数据的 相当于数据库中的select操作一样 不对服务器的数据做任何的修改 新增 删除 只是用来查询数据 get请求参数会加在URL后面
  • Springboot整合mybatis+mybatis-plus+PageHelper

    Mybatis是在国内使用是最广泛的 xff0c 以前都是使用xml进行映射 xff0c 说实话真心不太好用 xff0c 维护起来也不太方便 从mybatis3 0后开始支持 64 Mapper注解 xff0c 极大方便了开发 xff0c
  • PHP操作mysql

    一 mysqli基础操作 xff1a 1 连接数据库 xff1a mysqli connect 函数 填写你连接数据库的账号密码 conn 61 mysqli connect 39 127 0 0 1 39 39 root 39 39 ro
  • Linux安装pytorch1.1.0+CUDA10.0

    1 创建虚拟环境 conda create span class token operator span n pytorch1 span class token punctuation span span class token numbe
  • 使用dd复制将乌班图系统(Ubuntu22.04)完整迁移到新硬盘并扩容

    我的折磨历程 开始的时候用乌班图的时候 xff0c 不懂事 xff0c 根目录太小了 xff0c 后来就满了 xff0c 就就感觉完全没法用 xff0c 看着现在硬盘贼便宜 xff0c 去狗东买了个新的硬盘 感觉挂载硬盘并不能解决我的问题
  • vue指令

    目录 一 vue 的指令 1 v text 2 v html 3 v show 4 v if v esle if v else xff08 1 xff09 v if xff08 2 xff09 v if 与 v show 5 v for x
  • C# switch语句

    一 C switch语句 if语句每次判断只能实现两种选择 xff0c 而switch语句每次判断可以实现多种选择 基本语法格式如下 xff1a switch controlling expression case constant exp
  • python pyinstaller打包教程(pycharm)

    PyInstaller简介 PyInstaller是一个跨平台的Python应用打包工具 xff0c 支持 Windows Linux MacOS三大主流平台 xff0c 能够把 Python 脚本及其所在的 Python 解释器打包成可执
  • Windows11更新后打不开Edge浏览器解决办法

    前几天吐槽win11更新版本后打不开Microsoft Edge浏览器了 xff0c 特别影响我使用 xff0c 然后找网上方法 xff0c 大多让去设置里 修复 xff0c 就这样 xff0c 然而没什么卵用 xff0c 这应该是win1
  • Ubuntu16.04下联想R720的无线网卡开启问题及信号不稳定

    问题一 1 1 问题描述 笔记本型号 xff1a Lenovo r720笔记本 xff08 i5 7300hq xff0c gtx1060 maxq 6g xff09 xff0c 默认装入Win10系统 xff0c 然而当装入Ubuntu1
  • 【Anaconda 故障排除】之 EnvironmentNotWritableError

    目录 前言1 Anaconda Prompt 报错2 IPython 报错3 管理员身份运行 Anaconda Powershell Prompt4 其他方法总结 前言 提示 xff1a 这里可以添加本文要记录的大概内容 xff1a 刚刚卸
  • 与WPF相关的几本不错的书籍

    其实现在说这个话题有点过时 xff0c 因为WPF问世也已经有很长一段时间了 但是最近自己在读 WPF揭秘 xff0c 因此就对 现在 可以找到的资料做了些查询 之所以说是 现在 xff0c 是因为半年多前 xff0c 我就得到了一些有关W
  • docker入门之一centos7系统+docker安装

    一 安装centos 7 1 下载rufus 3 3制作U盘系统启动盘 2 加载U盘启动后 xff0c 默认选择的是第二项 xff0c 这里我们需要按 键 xff0c 将选项调到第一项Install CentOS7 再按enter键 3 语
  • Docker入门之二Docker原理、常用命令

    一 底层原理 Docker是什么工作的 xff1f Docker是一个 Client Server 结构的系统 xff0c Docker的守护进程运行在主机上 通过 Socket 从客户端访问 xff01 Dockerserver接收到 D

随机推荐

  • Docker入门之三容器命令

    一 容器命令 说明 xff1a 有了镜像才能创建容器 xff0c 首先下载一个centos镜像测试 1 下载镜像 docker pull centos 2 新建容器并启动 docker run docker run span class t
  • 【stm32f103】认识GPIO

    认识GPIO 什么是GPIOGPIO基本结构保护二极管输出模式推挽输出开漏输出 输出数据寄存器 xff08 参考手册8 2 xff09 GPIOx ODRGPIOx BSRR 输入模式 GPIO工作模式输入模式 xff08 模拟 浮空 上拉
  • 【ubuntu】Windows10远程桌面连接ubuntu20.04【未完待续】【由于特别卡顿,不好用,不续了】

    先上结果 环境 硬件 xff1a Jetson Xavier NX 套件 系统 xff1a Ubuntu 20 04 43 Windows10 软件 xff1a Xorg xrdp xubuntu desktop 解决 0 问题 使用Jet
  • 5G的介绍与个人理解

    1 5G概念 移动通讯自20世纪80年代诞生以来 xff0c 经过了三十多年的爆发式增长 xff0c 已经成为连接人类社会的基础信息网络 随着4G进入规模商用阶段 xff0c 面向2020年及未来的第五代移动通讯 xff0c 已成为全球研发
  • Linux系统安装详解

    前言 xff1a 随着开源软件在世界范围内影响力日益增强 xff0c Linux服务操作系统在整个服务器操作系统市场格局中占据很大的市场份额 xff0c 已经形成大规模市场应用局面 xff0c 尤其在政府 金融 农业 交通 电信等国家关键领
  • Tomcat 服务器的部署

    前言 目录 前言 一 Tomcat介绍 二 Tomcat组件 三 Tomcat部署步骤 Tomcat各目录 四 Tomcat 优化 Tomcat服务器是一个免费的开放源代码的Web应用服务器 xff0c 属于轻量级应用服务器 xff0c 在
  • mysql数据库管理

    目录 一 数据库结构 二 常用的数据类型 三 查看数据库结构 1 查看当前服务器中的数据库 2 查看数据库中包含的表 3 查看表的结构 xff08 字段 xff09 四 SQL语句 xff08 一 xff09 DDL xff08 数据定义语
  • redis实战主从复制和搭建哨兵

    目录 前言 1 搭建主从复制 1 主msater配置 2 从slave配置 3 验证结果 二 搭建哨兵 1 在所有节点修改配置文件 2 启动哨兵 3 模拟故障 三 总结 前言 接着上回这次带来的实战主从复制和搭建哨兵 1 搭建主从复制 环境
  • ELK日志分析系统

    目录 一 ELK日志分析系统简介 1 日志服务器的优缺点 2 ELK是什么 xff1f 2 1 Logstash管理包含四种工具 2 2 日志处理步骤 二 Elasticsearch的基础核心概念 三 Logstash介绍 四 Kibana
  • Docker网络和数据卷

    目录 一 Docker 网络模式 1 docker容器的虚拟网关 2 Docker的网络模式 3 Docker自定义网络 二 Docker数据卷 1 数据卷 2 数据卷容器 3 容器互联 使用centos镜像 一 Docker 网络模式 1
  • C++ string的格式化

    lt sstream gt 库定义了三种类 xff1a istringstream ostringstream和stringstream xff0c 分别用来进行流的输入 输出和输入输出操作 可以利用它实现输入输出的格式化 xff0c 下面
  • nginx日志格式分析

    先随便截取一个nginx标准日志 xff1a 62 173 145 171 12 Jan 2020 17 23 54 43 0800 34 GET vvx 000000000000 cfg HTTP 1 1 34 404 169 34 34
  • Mybatis如何实现分页

    Mybatis如何实现分页 关键字limit实现分页 Interceptor Plugin实现分页 首先定一个拦截器 拦截器会拦截所有以ByPage结尾的方法 xff0c 然后拼接sql 语句的limit关键字实现分页 span class
  • 万用表蜂鸣档使用

    学习笔记 电路调试 万用表的使用 今天焊接 调试学校的51开发学习板 xff0c 真是个血汗的泪程 xff0c 不过知道一些东西 xff0c 现在分享出来 蜂鸣档 大宝贝 此位 xff0c 表示此时红黑表笔所接电路断路 xff08 个人理解
  • AD导出的Pdf原理图显示不全

    打开设置 按如图 操作 若打印出的 PDF字显示不全 按如下操作 61 61 双击TXT文档进入设置 xff0c 将字体改成宋体 xff0c 如下图所示
  • Proteus 网络名的添加

    1 首先先连接出一条线出来 2 接下来单机左边边框的键 xff1a 3 鼠标放入绿色直线上 xff0c 并单击它 xff08 注意 xff01 xff09 不要单击绿点 xff0c 否则线只会身长 然后在string下输入你的网络名即可
  • AD使用笔记1 原理图与PCB布局同步实现

    这里以AD20为例子 xff0c 单击AD上方的设置标件 选择出Sysetm下的Navigation 单击交互选择 xff0c 即可实现AD原理图与PCB同步布局实现
  • 按键消抖程序

    同步时钟域的应用 按键消抖程序 机械按键的抖动示意图 采用20ms按键消抖 FPGA 的晶振时钟一般为 50Mhz xff0c 也就是 每个时钟周期为 20ns xff08 1 50Mhz 61 20ns xff09 xff0c 那么计数值
  • FPGA &&双按键控制&&LED呼吸灯实现

    FPGA amp amp 双按键控制 amp amp LED呼吸灯实现 文章目录 FPGA amp amp 双按键控制 amp amp LED呼吸灯实现1 按键脉冲设计1 1按键脉冲信号代码1 2 按键脉冲Testbench代码1 3 仿真
  • 5.Flink对接Kafka入门

    Flink Connector Kafka 1 Kafka1 1 Kafka官网 http kafka apache org 1 2 Kafka 简述1 3 Kafka特性1 4 kafka的应用场景1 5 kafka manager的部署