呼吸灯——FPGA

文章目录

  • 前言
  • 一、呼吸灯是什么?
    • 1、介绍
    • 2、占空比调节示意图
  • 二、系统设计
    • 1、系统框图
    • 2、RTL视图
  • 三、源码
  • 四、效果
  • 五、总结
  • 六、参考资料


前言

环境:
1、Quartus18.0
2、vscode
3、板子型号:EP4CE6F17C8
要求:
将四个LED灯实现循环从亮到灭、灭到亮的过程。下面我使用了两种方法供大家阅读。


一、呼吸灯是什么?

呼吸灯其实是在微处理器的控制下,由暗渐亮、然后再由亮渐暗,模仿人呼吸方式的 LED 灯。

1、介绍

呼吸灯采用 PWM 的方式,在固定的频率下,通过调整占空比的方式来控制 LED 灯亮度的变化。PWM(Pulse Width Modulation),即脉冲宽度调制,它利用微处理器输出的 PWM 信号,实现对模拟电路控制的一种非常有效的技术,广泛应用于测量、通信、功率控制等领域。

在由计数器产生的固定周期的 PWM 信号下,如果其占空比为 0,则 LED 灯不亮;如果其占空比为100%,则 LED 灯最亮。所以将占空比从 0 到 100%,再从 100%到 0 不断变化,就可以实现 LED 灯的“呼吸”效果。

2、占空比调节示意图

在这里插入图片描述

二、系统设计

1、系统框图

在这里插入图片描述

2、RTL视图

  • 方法一:
    在这里插入图片描述
  • 方法二:
    在这里插入图片描述

三、源码

  • 方法一:
module BREATH_LED(
    input   sys_clk , //时钟信号 50Mhz
    input   sys_rst_n , //复位信号
    
    output  [3:0] led //LED
);
 
 //reg define
reg [15:0] period_cnt ; //周期计数器频率:1khz 周期:1ms 计数值:1ms/20ns=50000
reg [15:0] duty_cycle ; //占空比数值
reg inc_dec_flag ; //0 递增 1 递减
 
 //*****************************************************
 //** main code
 //*****************************************************
 
 //根据占空比和计数值之间的大小关系来输出 LED
 assign led = (period_cnt >= duty_cycle) ? 4'b1111 : 4'b0000;
 
 //周期计数器
 always @(posedge sys_clk or negedge sys_rst_n) begin
 if(!sys_rst_n)
    period_cnt <= 16'd0;
 else if(period_cnt == 16'd50000)
    period_cnt <= 16'd0;
 else
    period_cnt <= period_cnt + 1'b1;
 end
 
 //在周期计数器的节拍下递增或递减占空比
 always @(posedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n) begin
        duty_cycle <= 16'd0;
        inc_dec_flag <= 1'b0;
    end
 else begin
    if(period_cnt == 16'd50000) begin //计满 1ms
        if(inc_dec_flag == 1'b0) begin //占空比递增状态
            if(duty_cycle == 16'd50000) //如果占空比已递增至最大
                inc_dec_flag <= 1'b1; //则占空比开始递减 else //否则占空比以 25 为单位递增
                
            else
                duty_cycle <= duty_cycle + 16'd25;
        end
        else begin //占空比递减状态
            if(duty_cycle == 16'd0) //如果占空比已递减至 0
                inc_dec_flag <= 1'b0; //则占空比开始递增
            else //否则占空比以 25 为单位递减
                duty_cycle <= duty_cycle - 16'd25;
        end
    end
  end
 end
 endmodule
  • 方法二:
module BREATH #(
parameter 
TIME_US = 6'd49,
TIME_MS = 10'd999,
TIME_S  = 10'd999)
(
    input  clk,
    input  rst_n,

    output reg [3:0]led
);

// parameter TIME_US = 6'd49;
// parameter TIME_MS = 10'd999;
// parameter TIME_S  = 10'd999;

reg [5:0] cnt_us;
reg [9:0] cnt_ms;
reg [9:0] cnt_s;
reg flag;

wire add_cnt_us;
wire end_cnt_us;

wire add_cnt_ms;
wire end_cnt_ms;

wire add_cnt_s;
wire end_cnt_s;

always @(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        cnt_us <= 6'd0;
    end
    else if(add_cnt_us)begin
        if(end_cnt_us)begin
            cnt_us <= 6'd0;
        end
        else begin
            cnt_us <= cnt_us + 1'd1;
        end
    end
    else begin
        cnt_us <= cnt_us;
    end
end

assign add_cnt_us = 1'b1;
assign end_cnt_us = add_cnt_us && cnt_us == TIME_US;

always @(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        cnt_ms <= 10'd0;
    end
    else if(add_cnt_ms)begin
        if(end_cnt_ms)begin
            cnt_ms <= 10'd0;
        end
        else begin
            cnt_ms <= cnt_ms + 1'd1;
        end
    end
    else begin
        cnt_ms <= cnt_ms ;
    end
end

assign add_cnt_ms = end_cnt_us;
assign end_cnt_ms = add_cnt_ms && cnt_ms == TIME_MS;

always @(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        cnt_s <= 10'd0;
    end
    else if(add_cnt_s)begin
        if(end_cnt_s)begin
            cnt_s <= 10'd0;
        end
        else begin
            cnt_s <= cnt_s + 1'd1;
        end
    end
    else begin
        cnt_s <= cnt_s ;
    end
end

assign add_cnt_s = end_cnt_ms;
assign end_cnt_s = add_cnt_s && cnt_s == TIME_S;

always @(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        flag <= 1'b0;
    end
    else if(end_cnt_s)begin
        flag <= ~flag;
    end
    else begin
        flag <= flag;
    end
end
//通过比较秒与毫秒的计数大小实现占空比的变化
//因为毫秒在秒每加一后,都会重新开始,使得高低电平的占比不同
//实际上呼吸灯周期就是秒计数周期,变换的占空比大小就是循环加1或减一
always @(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        led <= 4'b0000;
    end
    else if(!flag)begin
        led <= (cnt_s > cnt_ms)?4'b0000:4'b1111;
    end
    else if(flag)begin
        led <= (cnt_s > cnt_ms)?4'b1111:4'b0000;
    end
    else
        led <= led;
end
endmodule

实际上我更喜欢第一种,代码简洁易懂。

四、效果

呼吸灯


五、总结

呼吸灯的实现过程并不难,在原有的stm32实现呼吸灯的理解下更加透彻,就是通过控制周期里占空比的变化来实现。但值得一提的是第一种实现方法确实比较精简。

六、参考资料

以上资料均来自正点原子的教学视频或开拓者2开发教程:
原子官方

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/42530.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis源码篇 - Ziplist数据结构

Ziplist是一种内存优化的list存储结构&#xff0c;通过使用连续的内存空间存储&#xff0c;来减少内存碎片化&#xff0c;同时和链表的不同还有&#xff0c;它不存储前后指针&#xff0c;而是通过变长的字节存储前节点元素长度&#xff0c;通过计算长度来实现节点的查找。它是一…

Google 登录支付,Firebase 相关设置

登录sdk: https://developers.google.com/identity/sign-in/android/start?hlzh-cn 支付sdk: https://developers.google.com/pay/api/android/overview?hlzh-cn Firebase sdk: https://firebase.google.com/docs/android/setup?hlzh-cn 登录设置&#xff1a; 创建凭据&…

机器学习-线性代数-5-空间中的向量投影与最小二乘法

空间中的向量投影与最小二乘法 文章目录 空间中的向量投影与最小二乘法一、引入二、投影和投影的描述1、投影描述最近2、利用矩阵描述投影(1)向一维直线投影(2)向二维平面投影(3)向n维子空间投影的一般情况 三、最小二乘法1、重要的子空间(1)互补的子空间(2)正交的子空间(3)相互…

12.面板问题

面板问题 html部分 <h1>Lorem ipsum dolor sit, amet consectetur adipisicing.</h1><div class"container"><div class"faq"><div class"title-box"><h3 class"title">Lorem, ipsum dolor.<…

(转载)神经网络遗传算法函数极值寻优(matlab实现)

本博客的完整代码获取&#xff1a; https://www.mathworks.com/academia/books/book106283.html 1案例背景 对于未知的非线性函数,仅通过函数的输入输出数据难以准确寻找函数极值。这类问题可以通过神经网络结合遗传算法求解,利用神经网络的非线性拟合能力和遗传算法的非线性…

make/makefile的使用

make/makefile 文章目录 make/makefile初步认识makefile的工作流程依赖关系和依赖方法make的使用 总结 make是一个命令&#xff0c;是一个解释makefile中指令的命令工具&#xff0c;makefile是一个文件&#xff0c;当前目录下的文件&#xff0c;两者搭配使用&#xff0c;完成项…

数据预处理matlab

matlab数据的获取、预处理、统计、可视化、降维 数据的预处理 - MATLAB & Simulink - MathWorks 中国https://ww2.mathworks.cn/help/matlab/preprocessing-data.html 一、数据的获取 1.1 从Excel中获取 使用readtable() 例1&#xff1a; 使用spreadsheetImportOption…

【AutoSAR 架构介绍】

AutoSAR简介 AUTOSAR是Automotive Open System Architecture&#xff08;汽车开放系统架构&#xff09;的首字母缩写&#xff0c;是一家致力于制定汽车电子软件标准的联盟。 AUTOSAR是由全球汽车制造商、部件供应商及其他电子、半导体和软件系统公司联合建立&#xff0c;各成…

npm link 实现全局运行package.json中的指令

packages.json "name":"testcli","bin": {"itRun": "index.js"},执行命令 npm link如果要解绑定 npm unlink testcli 现在你可以输入 itRun试一下

MySQL高阶语句之二

目录 一、子查询 1.1语法 1.2select 1.3insert 1.3update 1.4delete 1.5 exists 1.6别名as 二、MySQL视图 2.1功能 2.2区别 2.3联系 2.4 创建视图(单表) 2.5 创建视图(多表) 2.6修改原表数据 2.7修改视图数据 三、NULL值 四、连接查询 4.1内连接 4.1.1语法 4.1.…

LangChain+LLM大模型问答能力搭建与思考

1. 背景 最近&#xff0c;大模型&#xff08;LLMs&#xff0c;Large Language Models&#xff09;可谓是NLP领域&#xff0c;甚至整个科技领域最火热的技术了。凑巧的是&#xff0c;我本人恰好就是NLP算法工程师&#xff0c;面临着被LLMs浪潮淘汰的窘境&#xff0c;决定在焦虑…

配置jenkins 服务器与目标服务器自动化部署

在配置完远程构建后可以通过添加post-build step 执行shell脚本的方式将包传到远程服务器等一系列操作。 通过scp传输打包好的项目到目标服务器 按照链接 方式配置免密操作&#xff0c;需要注意的是要在jenkins 用户目录下配置生成私钥密钥&#xff0c;配置jenkins 的免密&…

我的踩坑记录!!!积累中......

bug记录&#xff1a; 解决 nodejs安装后&#xff0c;在安装目录下【nodejs】创建两个文件夹【node_global】及【node_cache】用来配置全局环境变量。 之后&#xff0c;打开cmd命令窗口&#xff0c;输入 npm config set prefix ”D:\Program Files\nodejs\node_global” npm con…

YOLO-V5分类实战系列 —— 调优自己的数据集+RK1808部署

YOLO-V5分类实战系列 —— 调优自己的数据集 1、保存训练和测试图片2、数据归一化3、数据增强3.1、数据增强库&#xff1a;albumentations3.2、数据增强库&#xff1a;torchvision 4、ONNX CPU 推理4.1、Pt 模型转为 ONNX4.2、ONNX 推理验证4.3、 ONNX CPU推理&#xff08;C&am…

蓝桥杯专题-真题版含答案-【生命之树】【消除尾一】【密码脱落】【生日蜡烛】

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

使用GGML和LangChain在CPU上运行量化的llama2

Meta AI 在本周二发布了最新一代开源大模型 Llama 2。对比于今年 2 月发布的 Llama 1&#xff0c;训练所用的 token 翻了一倍&#xff0c;已经达到了 2 万亿&#xff0c;对于使用大模型最重要的上下文长度限制&#xff0c;Llama 2 也翻了一倍。 在本文&#xff0c;我们将紧跟趋…

回归预测 | MATLAB实现TCN-LSTM时间卷积长短期记忆神经网络多输入单输出回归预测

回归预测 | MATLAB实现TCN-LSTM时间卷积长短期记忆神经网络多输入单输出回归预测 目录 回归预测 | MATLAB实现TCN-LSTM时间卷积长短期记忆神经网络多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.Matlab实现TCN-LSTM时间卷积神经网络结合长…

pytorch学习——第二个模型(逻辑回归)

参考该博客系统学习Pytorch笔记二&#xff1a;Pytorch的动态图、自动求导及逻辑回归 c l a s s { 0 0.5 > y 1 0.5 ≤ y class\left\{ \begin{array}{rcl} 0 & & {0.5 > y}\\ 1 & & {0.5 \le y}\\ \end{array} \right. class{01​​0.5>y0.5≤y​ 根…

伦敦金投资仓位控制的方法

留意本栏目过去的文章的朋友都会发现&#xff0c;其实小编认为资金管理很重要&#xff0c;甚至重要性超过技术分析找到入场机会。在资金管理中&#xff0c;关于仓位的控制是一门很大的学问&#xff0c;在伦敦金投资中&#xff0c;仓位的控制关系到我们盈亏的多少&#xff0c;甚…

数据仓库设计理论

数据仓库设计理论 一、数据仓库基本概念 1.1、数据仓库介绍 数据仓库是一个用于集成、存储和分析大量结构化和非结构化数据的中心化数据存储系统。它旨在支持企业的决策制定和业务分析活动。 1.2、基本特征 主题导向&#xff1a;数据仓库围绕特定的主题或业务领域进行建模…