05. 基于Verilog的呼吸灯程序设计

2024-05-06 08:20
文章标签 05 程序设计 呼吸 verilog

本文主要是介绍05. 基于Verilog的呼吸灯程序设计,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

05_led_breath_v0

一个基于Verilog的呼吸灯程序示例,该程序通过PWM(脉冲宽度调制)技术来模拟呼吸灯的效果,逐渐变亮再逐渐变暗的LED灯,给人一种灯光在“呼吸”的感觉。

原理解释:

  1. PWM(脉冲宽度调制):通过改变输出信号的占空比来模拟不同亮度的LED灯。

  2. 呼吸灯周期:呼吸灯的周期由breathing_cnt控制,这里假设周期为1/4秒钟。

  3. 呼吸灯亮度变化:呼吸灯的亮度变化通过改变占空比的值来模拟。

  • 当pwm_cnt小于当前pwm_duty时,LED亮;
  • 当pwm_cnt大于pwm_duty时,LED不亮。

知识点:

  • PWM(脉冲宽度调制)
  • Duty(占空比)
  • 位宽确定可表达的最大整数值
  • 位拼接语法 assign led = {6{led_breathing}};
module led_breath #(parameter CLK_FREQ = 50000000,parameter LED_ON = 1'b0
)(input wire clk,       input wire rst_n,     output wire [5:0] led      
);// 定义一个计数器用于产生PWM波形
reg [11:0] pwm_cnt;
reg [11:0] pwm_duty;reg [31:0] breath_cnt;// 呼吸灯周期,假设为1秒钟4个周期
localparam CYCLE = CLK_FREQ/4;always @(posedge clk) beginif (!rst_n) breath_cnt <= 0;else beginbreath_cnt <= breath_cnt + 1'b1;if (breath_cnt == CYCLE-1) breath_cnt <= 0;end
endwire breath_done = (breath_cnt == CYCLE-1);//PWM CNT
always @(posedge clk) beginif (!rst_n) pwm_cnt <= 0;else pwm_cnt <= pwm_cnt + 1'b1;
end//PWM Duty
//light to off
always @(posedge clk) beginif (!rst_n) pwm_duty <= 12'hFFF;else if(breath_done) beginif(pwm_duty == 0) pwm_duty <= 12'hFFF;else pwm_duty <= {1'b0,pwm_duty[11:1]};end//else pwm_duty <= pwm_duty;
end/*
//off to light on
always @(posedge clk) beginif (!rst_n) pwm_duty <= 12'b0;else if(breath_done) beginif(pwm_duty == 12'hFFF) pwm_duty <= 12'b0;else pwm_duty <= {pwm_duty[10:0],1'b1};end//else pwm_duty <= pwm_duty;
end
*/// 根据PWM计数器的值和呼吸灯的亮度变化来控制LED的亮度
reg led_breathing;
//parameter LED_ON = 1'b0; //led active low on our board
localparam LED_OFF = ~LED_ON;always @(posedge clk) beginif (!rst_n) led_breathing <= LED_OFF;else if (pwm_cnt < pwm_duty) beginled_breathing <= LED_ON;end else led_breathing <= LED_OFF;
endassign led = {6{led_breathing}};endmodule

扩展思维

  1. 学习了点亮LED、LED闪烁、LED跑马灯和LED呼吸灯这样多种模式LED效果,思考如何将这些不同的效果在一个工程里全部实现,并利用DIP开关选择不同的运行模式,呈现不同的效果。

  2. 尝试修改代码实现6个LED分为两组,每组以不同的频率呼吸。

这篇关于05. 基于Verilog的呼吸灯程序设计的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/963873

相关文章

忽略某些文件 —— Git 学习笔记 05

忽略某些文件 忽略某些文件 通过.gitignore文件其他规则源如何选择规则源参考资料 对于某些文件,我们不希望把它们纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。通常它们都是些自动生成的文件,比如日志文件、编译过程中创建的临时文件等。 通过.gitignore文件 假设我们要忽略 lib.a 文件,那我们可以在 lib.a 所在目录下创建一个名为 .gi

C语言程序设计(数据类型、运算符与表达式)

一、C的数据类型 C语言提供的数据类型: 二、常量和变量 2.1常量和符号常量 在程序运行过程中,其值不能被改变的量称为常量。 常量区分为不同的类型: 程序中用#define(预处理器指令)命令行定义变量将代表常量,用一个标识符代表一个常量,称为符合常量。 2.2变量 变量代表内存中具有特定属性的一个存储单元,用来存放数据,在程序运行期间,这些值是可以 改变的。 变

C语言程序设计(选择结构程序设计)

一、关系运算符和关系表达式 1.1关系运算符及其优先次序 ①<(小于) ②<=(小于或等于) ③>(大于) ④>=(大于或等于 ) ⑤==(等于) ⑥!=(不等于) 说明: 前4个优先级相同,后2个优先级相同,关系运算符的优先级低于算术运算符,关系运算符的优先级高于赋值运算符 1.2关系表达式 用关系运算符将两个表达式(可以是算术表达式或关系表达式,逻辑表达式,赋值表达式,字符

智能工厂程序设计 之1 智能工厂都本俱的方面(Facet,Aspect和Respect)即智能依赖的基底Substrate 之1

Q1、昨天分别给出了三个智能工厂的 “面face”(里面inter-face,外面outer-face和表面surface) 以及每个“面face” 各自使用的“方”(StringProcessor,CaseFilter和ModeAdapter)  。今天我们将继续说说三个智能工厂的“方面” 。在展开之前先看一下三个单词:面向facing,取向oriented,朝向toword。理解这三个词 和

数字电路专题:verilog 阻塞赋值和非阻塞赋值

verilog 阻塞赋值 和 非阻塞赋值 “=”阻塞赋值, ”<=”非阻塞赋值。阻塞赋值为执行完一条赋值语句,再执行下一条,可理解为顺序执行,而且赋值是立即执行; 非阻塞赋值可理解为并行执行,不考虑顺序,在 always 块语句执行完成后,才进行赋值。 如下面的阻塞赋值: //代码如下:module top(din,a,b,c,clk);input din;input clk;out

C++入门(05-2)从命令行执行C++编译器_GCC

文章目录 GCC编译器1. 下载MinGW-w64,安装(不推荐)2. 使用MSYS2安装MinGW-w64(推荐)2.1 安装MSYS22.2 初始化和更新2.3 安装MinGW-w64编译器2.3 在MSYS2 Shell中导航到代码目录2.4 使用 g++ 编译2.5 运行可执行文件 GCC编译器 GCC(GNU Compiler Collection)是一个开源编译器集

C++入门(05)从命令行执行C++编译器_MSVC

文章目录 1.C++ 编译器2. 常用 C++ 编译器MSVC(Microsoft Visual C++)GCC(GNU Compiler Collection)Clang 3. MSVC 编译器3.1 开发者命令提示符3.2 编译 C++ 代码 1.C++ 编译器 将C++源代码(扩展名为 .cpp )转换成计算机可以运行的可执行程序 编译器会检查代码的语法和语义,生成相应

C语言程序设计 笔记代码梳理 重制版

前言 本篇以笔记为主的C语言详解,全篇一共十章内容,会持续更新基础内容,争取做到更详细。多一句没有,少一句不行!  形而上学者谓之道,形而下学者谓之器 形而上学者谓之道,形而下学者谓之器 第1章 C语言的流程 1.C程序经历的六个阶段 编辑(Edit)预处理(Preprocess)编译(Compile)汇编(Assemble)链接(Link)执行(Execute)  2.

龙芯+FreeRTOS+LVGL实战笔记(新)——05部署主按钮

本专栏是笔者另一个专栏《龙芯+RT-Thread+LVGL实战笔记》的姊妹篇,主要的区别在于实时操作系统的不同,章节的安排和任务的推进保持一致,并对源码做了改进和优化,各位可以先到本人主页下去浏览另一专栏的博客列表(目前已撰写36篇,图1所示),再决定是否订阅。此外,也可以前往本人在B站的视频合集(图2所示)观看所有演示视频,合集首个视频链接为: 借助RT-Thread和LVGL

【SpringMVC学习05】SpringMVC中的异常处理器

SpringMVC在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常处理器可以实现一个系统的异常处理逻辑。 异常处理思路 我们知道,系统中异常包括两类:预期异常和运行时异常(RuntimeException),前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。系统的dao、service、controller出现异常都通过throws E