首页 > 编程语言 >Verilog编程学习之—呼吸灯

Verilog编程学习之—呼吸灯

时间:2024-07-27 23:17:36浏览次数:9  
标签:duty LED 编程 呼吸 sign Verilog rst reg

Verilog编程-呼吸灯

1.设计目标

用FPGA产生占空比变化的PWM波,控制LED灯由暗变亮的变化。

2.设计思路

设置PWM波的步长为2us,周期为2ms,每个周期内LED亮的时间由0增加至999,再从999减少至0,依次循环,就可以看到LED灯由暗变亮再由亮变暗的循环过程。可以设置一个占空比寄存器duty_r和一个标记寄存器sign_r:
1.duty_r在每个周期后都加1,加到999后置0;
2.当sign_r为1时,计数器小于duty_r时LED灯亮,当sign_r为0时,计数器大于duty_r时LED灯亮。

代码如下:


module led(
input       clk,
input       rst_in,

output reg  led
    );
    
reg     rst;
reg[6:0]    cnt_2us;
reg[9:0]    cnt_2ms;
reg[9:0]    cnt_2s;
reg         inc_dec_flag;

//异步复位
always@(posedge clk or negedge rst_in)begin
    if(!rst_in)
        rst <= 1'b1;
    else
        rst <= 1'b0;
end

//计数2us为一个step
always@(posedge clk)
begin
    if(rst == 1'd1)
        cnt_2us <= 7'd0;
    else if(cnt_2us == (7'd100 - 7'd1))  
        cnt_2us <= 7'd0;
    else
        cnt_2us <= cnt_2us + 7'b1;
end
    
//计数2ms为一个周期
always@(posedge clk)
begin
    if(rst == 1'b1)
        cnt_2ms <= 10'b0;
    else if((cnt_2ms == (10'd1000 - 10'b1)) &&(cnt_2us == (7'd100 - 7'b1)))
        cnt_2ms <= 10'b0;
    else if(cnt_2us == (7'd100 - 7'b1))
        cnt_2ms <= cnt_2ms + 10'b1;
end

//计数占空比变化
always@(posedge clk)
begin
    if(rst == 1'b1)
        cnt_2s <= 10'b0;
    else if((cnt_2s == (10'd1000 - 10'b1)) && (cnt_2ms == (10'd1000 - 10'b1)) && (cnt_2us == (7'd100 - 7'b1)))
        cnt_2s <= 10'b0;
    else if((cnt_2ms == (10'd1000 - 10'b1)) && (cnt_2us == (7'd100 - 7'b1)))
        cnt_2s <= cnt_2s + 10'b1;
end

//标志LED变化方向的flag
always@(posedge clk)
begin
    if(rst == 1'b1)
        inc_dec_flag <= 1'b0;
    else if((cnt_2s == (10'd1000 - 10'b1)) && (cnt_2ms == (10'd1000 - 10'b1)) && (cnt_2us == (7'd100 - 7'b1)))
        inc_dec_flag <= ~inc_dec_flag;
end

//输出led信号
always@(posedge clk)
begin
    if(rst == 1'b1)
        led <= 1'b0;
    else if( inc_dec_flag ^ (cnt_2ms < cnt_2s))
        led <= 1'b1;
    else
        led <= 1'b0;
end

endmodule



标签:duty,LED,编程,呼吸,sign,Verilog,rst,reg
From: https://www.cnblogs.com/qiugu-note/p/18327694

相关文章

  • C++模板——泛型编程
    目录1.什么是泛型编程2.函数模板2.1定义格式2.2实例化及原理 2.3参数匹配原则3.类模板 3.1定义格式3.2实例化 4.非类型模板参数 5.模板的特化 5.1概念5.2函数模板和类模板特化6.模板的分离编译 1.什么是泛型编程 如何实现一个通用的加......
  • 2024“钉耙编程”中国大学生算法设计超级联赛(3)复盘总结
    2024“钉耙编程”中国大学生算法设计超级联赛(3)本场我其实并没有给团队贡献是任何一个AC,连最简单的题都因为题目读错没有写出来。纯纯抱大佬大腿,然后赛后被嘲讽深度自同构-limie首先,先考虑对于一个有\(n\)个节点的树应该怎么做。设\(f_i\)表示\(i\)个节点的树中有多少个......
  • shell编程
    一、shell基础1.shell概念shell英文翻译过来是外壳的意思,作为计算机语言来理解可以认为它是操作系统的外壳。可以通过shell命令来操作和控制操作系统,比如Linux中的shell命令就包括ls、cd、pwd等等。shell在内核的基础上编写的一个应用程序,它连接了用户和Linux内核,......
  • FrameBuffer 应用编程-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板
    FrameBuffer应用编程什么是Framebuffer设备Framebuffer定义:Framebuffer是帧缓冲,指一块内存,用于保存一帧图像Linux系统中的Framebuffer:在Linux系统中,Framebuffer是一种显示驱动接口,抽象并屏蔽了不同显示设备的硬件细节,对应用层提供了一块显示内存(显存)Framebuf......
  • Linux系统编程——进程
    学习目标:学习内容:1.进程的含义?进程是一个程序执行的过程,会去分配内存资源,cpu的调度pcb  是一个结构体,process control block print circuit boardvim -ttask_struct PID,进程标识符当前工作路径   chdirumask  0002进程打开的文件列表  文件IO中......
  • Mojo AI编程语言(十二)高级特性:深入理解Mojo
    目录1.Mojo简介2.高级数据类型2.1数组与矩阵2.2多维数组2.3字符串操作3.并行计算3.1线程与协程3.2并行算法4.分布式系统4.1RPC与消息传递4.2分布式数据处理5.高级语言特性5.1泛型编程5.2函数式编程5.3元编程6.错误处理与调试6.1错误处理6.2......
  • QT网络编程(二)——TCP协议工作原理及实战
    目录引言一、TCP协议基础知识1.TCP协议特点2.TCP连接的三个阶段3.三次握手和四次挥手二、Qt中的TCP编程1.引入Qt网络模块2.QTcpServer类常用函数3.QTcpSocket类常用函数三、TCP网络通信流程TCP服务器TCP客户端四、实战示例UI界面核心代码运行结果......
  • 零基础STM32单片机编程入门(二十二) ESP8266 WIFI模块实战含源码
    文章目录一.概要二.ESP8266WIFI模块主要性能参数三.ESP8266WIFI模块芯片内部框图四.ESP8266WIFI模块原理图五.ESP8266WIFI模块与单片机通讯方法1.硬件连接2.ESP8266模块AT指令介绍六.STM32单片机与ESP8266WIFI模块通讯实验1.硬件准备2.软件工程3.软件主要代码4.实验......
  • Mistral新旗舰决战Llama 3.1,最强开源Large 2 123B,扛鼎多语言编程全能王
    【新智元导读】紧跟着Meta的重磅发布,MistralLarge2也带着权重一起上新了,而且参数量仅为Llama3.1405B的三分之一。不仅在编码、数学和多语言等专业领域可与SOTA模型直接竞争,还支持单节点部署。昨天正式发布的Llama3.1模型,让AI社区着实为之兴奋。但是仔细一想就能发现......
  • 2024“钉耙编程”中国大学生算法设计超级联赛(3)
    Preface徐神是我们的红太阳,最后2min切了一道极难的string使得在这场前期爆炸的局面最后没有崩得太难看这场前期的开题顺序有点问题导致前5题出的很慢,中后期开始三人一人写一题,然后经典三开三卡好在最后我在WA了五发后写对拍把B过了,徐神又压线过了string,但比较可惜的......