[米联客-安路飞龙DR1-FPSOC] FPGA基础篇连载-06 PWM呼吸灯实验

news/2024/11/15 19:39:38/文章来源:https://www.cnblogs.com/milianke/p/18329964

软件版本:Anlogic -TD5.9.1-DR1_ES1.1

操作系统:WIN10 64bit

硬件平台:适用安路(Anlogic)FPGA

实验平台:米联客-MLK-L1-CZ06-DR1M90G开发板

板卡获取平台:https://milianke.tmall.com/

登录"米联客"FPGA社区 http://www.uisrc.com 视频课程、答疑解惑!

 

1概述

小小呼吸灯在很多设备上我们可以看到,我们可以在FPGA的控制主板上也可以加入呼吸灯,指示我们的FPGA主板正在运行。一般呼吸灯的亮灭周期是2S,呼吸灯的亮度可以通过PWM来调节。本文实现一个实用的小程序,读者完全可以自己编写代码,并且通过仿真测试代码的正确性,然后下载到开发板看实际运行效果。

在完成本实验前,请确保已经完成前面的实验,包括已经掌握以下能力:

1:完成了TD软件安装

2:完成了modelsim安装以及TD库的编译

3:掌握了TD仿真环境的设置

4:掌握了modesim通过do文件启动仿真

1.1呼吸灯简介

呼吸灯,就是指灯光设备的亮度随着时间由暗到亮逐渐增强,再由亮到暗逐渐衰减。呼吸灯最早是被苹果公司开发出来的,一经面世,立刻吸引众多科技公司效仿并广泛应用于各类电子产品上。本章课程将通过PWM的方式实现呼吸灯效果。

脉冲宽度调制(PWM),是英文"Pulse Width Modulation"的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域。

PWM的频率f是指1秒钟内信号从高电平到低电平再回到高电平的次数(一个周期),单位为Hz

PWM的周期是指频率的倒数,T = 1/f,如果频率为50Hz,即一个周期是20ms,那么1s中有1s/20ms=50PWM周期;

占空比是指高电平在一个周期之内所占的时间比率。若信号的周期为T,每周期高电平时间为t1,低电平时间为t2,T=t1+t2,则占空比D=t1/T

呼吸灯采用PWM的方式,在固定的频率下,通过调整占空比的方式来控制LED 灯亮度的变化。一般人眼睛对于80Hz以上刷新频率则完全没有闪烁感。频率太小的话,LED灯看起来就会闪烁,当频率大于50Hz的时候,人眼就会产生视觉暂留效果,基本就看不到闪烁了,就是一个常亮的LED灯。如果高电平点亮LED灯,低电平熄灭LED灯,占空比为100%LED 灯最亮,占空比为0%LED 灯最暗。所以,在频率一定下,可以用不同占空比改变LED灯的亮度。

1.2硬件电路分析

参照"流水灯"硬件电路分析部分

2 PWM呼吸灯程序设计

2.1系统框图

本次实验目的为1LED实现呼吸灯的效果,LED变换间隔时间需要基于系统时钟来计数,实现间隔时间的计时,除此之外,添加系统复位使程序恢复至默认状态,输出结果由1LED灯显示。命名模块名为pwm_light,此模块需要两个输入的端口,分别为系统时钟和系统复位,输出为1位的LED 端口。

呼吸灯是由两个部分组成,一个是由亮到暗的过程,一个是由暗到亮的过程,再由简介可知我们是在固定的频率下通过调整高电平的占空比来调控 led 灯的亮度。第一个过程由亮到暗的过程为t=2s,如果高电平点亮LED灯,低电平熄灭LED灯,不同的占空比显示不同的亮度,占空比就要在2s之间逐渐由100%减小至0%,如果我们把2s划分成100份,那么每一个占空比就要保持t1=2s/100=20ms。由于占空比100%减小到0%一共变化了100次,占空比=高电平周期/整个周期t1,所以需要将一个占空比周期t1划分成100份,从而达到高电平周期每减小一个周期t2,占空比就减少1%t2=20ms/100=200us

PWM呼吸灯程序设计中包含了3个定时计数器:

20us定时器,作为本系统的基本定时器,产生时间基准。

20ms定时器,通过20us定时器,计数100次完成20ms定时计数

2s定时器,通过20ms定时器,计数100次完成2S定时计数

PWM每间隔2ms更新一次,共计更新100次即2S后切换PWM的占空比调整方向。因此PWM占空比的调整是和2ms定时计数器和2S定时计数器相关。系统框图如下:

2.2程序源码

`timescale 1ns / 1ns

 

modulepwm_light#

(

parameter REF_CLK      = 32'd100000000

)

(

input       I_sysclk,

input       I_rstn,

output      O_pwm

);

 

localparam T20US_SET     = REF_CLK/20000 - 1;  //set 200us

localparam T20MS_SET     = 100 - 1;           //set 20ms

localparam PWM_SET       = 100 - 1;           //Set PWM duty cycle adjustment times

 

reg [23:0] t20us_cnt;

reg [9 :0] t20ms_cnt;

reg [9 :0] pwm_cnt;

reg PWM_S;

 

wire t20us_done;

wire t20ms_done;

 

//设置20us计数,当计数条件达成时拉高

assign t20us_done = (t20us_cnt == T20US_SET);

///设置20ms计数,当计数条件达成时拉高

assign t20ms_done = t20us_done & (t20ms_cnt == T20MS_SET) ;

 

//1us base timer

always @(posedge I_sysclk ornegedge I_rstn)begin

    if(I_rstn == 1'b0)

        t20us_cnt <= 0;    

    elseif(t20us_cnt < T20US_SET)                                  //t20us_cnt寄存器用来计数,目标值是T20US_SET

        t20us_cnt <= t20us_cnt + 1'b1;                              //未达到目标值+1

    else

        t20us_cnt <= 24'd0;                                          //达到目标值清零

end

 

//1ms pwm compare timer,based on 1us base timer

always @(posedge I_sysclk ornegedge I_rstn)begin                  //系统时钟的上升沿以及复位的下降沿触发

    if(I_rstn == 1'b0)                                                //复位清零

         t20ms_cnt <= 0;    

    elseif(t20us_done)                                                  //t20us_done计数完成作为后续判断的大前提

         t20ms_cnt <= (t20ms_cnt < T20MS_SET) ? (t20ms_cnt + 1'b1) : 10'd0;   //判断语句,当t20ms_cnt < T20MS_SET满足时

    else                                                                            //t20ms_cnt计数器+1,否则就清零

         t20ms_cnt <= t20ms_cnt;

end

 

//PWM counter for generating duty cycle parameters as well as PWM adjustment count

always @(posedge I_sysclk ornegedge I_rstn)begin                              //系统时钟的上升沿以及复位的下降沿触发

    if(I_rstn == 1'b0)                                                             //复位清零

        pwm_cnt <= 0;

    elseif(t20ms_done)                                                           //t20ms_done计数完成作为后续判断的大前提

        pwm_cnt <= (pwm_cnt < PWM_SET) ? (pwm_cnt + 1'b1) : 10'd0;           //判断语句,当pwm_cnt < PWM_SET满足时

    else                                                                          //pwm_cntt计数器+1,否则就清零

        pwm_cnt <= pwm_cnt;                                                        

end

 

//switch breathing state

always @(posedge I_sysclk ornegedge I_rstn)begin                          //系统时钟的上升沿以及复位的下降沿触发

    if(I_rstn == 1'b0)

        PWM_S <= 0;                                                            //复位清零

    elseif(t20ms_done && (pwm_cnt == PWM_SET))                             //pwm_cnt == PWM_SET达成时,对PWM_S的状态进行翻转

        PWM_S <= ~PWM_S;                                                       //反应到LED灯上是LED灯的亮灭变换转换

    else

        PWM_S <= PWM_S;

end

 

//PWM wave generating

assign  O_pwm = PWM_S ? (pwm_cnt >= t20ms_cnt) : (pwm_cnt < t20ms_cnt);         //判断语句,通过PWM_S的变换,使O_pwm输出的

endmodule  

3 FPGA工程

fpga工程的创建过程不再重复,如有不清楚的请看前面实验。

米联客的代码管理规范,在对应的FPGA工程路径下创建uisrc路径,并且创建以下文件夹

01_rtl:放用户编写的rtl代码

02_sim:仿真文件或者工程

03_ip:放使用到的ip文件

04_pin:fpgapin脚约束文件或者时序约束文件

05_boot:放编译好的bit或者bin文件(一般为空)

06_doc:放本一些相关文档(一般为空)

4 Modelsim仿真

4.1准备工作

Modelsim仿真的创建过程不再重复,如有不清楚的请看前面实验

 

仿真测试文件源码如下,对于led这种低速仿真,仿真精度可以设置为1ns,另外仿真阶段可以把间隔时间设置小一些,这样仿真速度就快了:

`timescale 1ns / 1ns

 

modulesim_top_tb();

 

reg I_sysclk,I_rstn;

wire  O_pwm;

 

pwm_light#

(

.REF_CLK(100_000)

)

pwm_light_inst

(

.I_sysclk(I_sysclk),

.I_rstn(I_rstn),

.O_pwm(O_pwm)

);

 

initialbegin

   I_sysclk  <= 1'b0;

   I_rstn    <= 1'b0;

   #100;

   I_rstn    <= 1'b1;  

end

 

always#20 I_sysclk=~I_sysclk;

 

endmodule

 

4.2启动modelsim仿真

启动后,右击需要观察的信号,添加到波形窗口

设置restart

设置运行100ms(如果运行时间太长可以修改小一些)

从仿真结果可以看到PWM占空比的调整

5下载演示

下载程序前,先确保FPGA工程已经编译。

5.1硬件连接

(该教程为通用型教程,教程中仅展示一款示例开发板的连接方式,具体连接方式以所购买的开发板型号以及结合配套代码管脚约束为准。)

请确保下载器和开发板已经正确连接,并且开发板已经上电(注意JTAG端子不支持热插拔,而USB接口支持,所以在不通电的情况下接通好JTAG后,再插入USB到电脑,之后再上电,以免造成JTAG IO损坏)

5.2运行结果

(该教程为通用型教程,教程中仅展示一款示例开发板的上板现象,具体现象以所购买的开发板型号以及配套代码上板现象为准。)

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学成在线项目随笔

全局样式设定css阴影效果:使用flex布局时float:right不生效时flex布局等分方框,通过flex-grow实现,设置后通过text-align设置子元素位置

thinkphp: 安装fastadmin

一,官方地址: 1,官方站: https://www.fastadmin.net/ 2,文档地址: https://doc.fastadmin.net/docs/install.html二,安装: 1,下载: 下载地址: https://www.fastadmin.net/download.html 如图2, 解压fastadmin安装包到服务器,并解压: liuhongdi@lhdpc:/data/site/admin/fast$ …

windows编译ZLMediaKit流媒体服务webrtc

环境说明 ZLMediaKit编译需要的软件 visual studio 2022 cmake 3.29.0-rc2 OpenSSL 1.1.1w(不想踩坑的话安装这个版本) libsrtp 2.6.0 ZLMediaKit编译后运行需要 libsrtp 编译后且配置环境变量 ZLMediaKit 编译后文件cmake visual stuido 20222,自带cmake cmake可以到这两个地…

idea 删除项目

今天学习javadoc时在cmd命令提示符中总显示说“不是内部或外部命令,也不是可运行的程序或批处理文件”,因此上网查找解决办法,正所谓一顿操作猛如虎一看结果二百五。那些方法不仅没能解决问题,反而使原本好好的java class成为咖啡杯图标从而不能运行。 多次修改无果后,决定…

解决rust-analyzer加载时间过长等问题

若出现下述类似的问题,可以尝试使用本文的方法进行解决。vscode 一直卡在 fetching metadata 阶段出现报错 Blocking waiting for file lock on package cache出现报错 proc macro command not expanded: No proc-macros present for crate rust-analyzer(unresolved-proc-mac…

leetcode-8,真恶心

题目: 请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数。 推导:代码:1 class Automaton {2 public:3 int sign = 1; // 初始化默认符号4 long long ans = 0; // 初始化整数5 unordered_map<string, vector<string>&g…

论文阅读:Sequence to sequence learning for joint extraction of entities and relations

用以解决重叠关系问题 GGNNs模型 GGNNs(门控图神经网络,Gated Graph Neural Networks)是一种处理图结构数据的神经网络模型。它是图神经网络(GNN)的一个变体,使用了类似于长短时记忆网络(LSTM)中的门控机制来更有效地处理图中的信息流。 GGNNs的核心机制 GGNNs的核心思…

关于网站安全狗卸载了仍然能拦截的问题解决

关于网站安全狗卸载了仍然能拦截的问题解决如果你将所有safedog的文件删除的话,可能会导致Apache服务启动不了例如:这里没有提示相关安全狗的信息是因为我已经删除了Apache访问safedog的配置代码,只是提醒错误信息会如上图所示。 导致这种原因的结果大概率是因为Apache的con…

搭建自动化 Web 页面性能检测系统 —— 部署篇

我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品。我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值。本文作者:琉易 liuxianyu.cn这一篇是系列文章: 搭建自动化 Web 页面性能检测系统 —— 设计篇 搭建自动化 Web 页面性能检测系统 —— 实现…

如何根据Linux Kernel Mailing List打patch

Linux内核正在不断开发和改进。每天的补丁都会提交到Linux内核邮件列表(LKML)。其中一些补丁被接受并合并到主流Linux内核中,供用户使用,而其他补丁则永远无法使用。 有时从LKML获取补丁是有用的,例如,如果你在内核中开发,或者只是因为你想保持在前沿。另一个原因可能是…

基于Drone实现CI/CD【0到1架构系列】

CI/CD是持续性集交和持续性部署,简单来讲就是自动化构建和自动化部署。目前有很多集成方案,也有很多组装方案,只要能实现自动化构建出制品,再自动部署到生产环境就行。 目前很多源代码都集成了CI/CD功能,drone也是目前比较流行的一个方案,简单易用,高性能。 前提条件 已…

Django项目快速上手:从安装到创建应用

Django项目快速上手:从安装到创建应用 安装Django 首先,确保你已经安装了 Python 和 pip。然后,使用以下命令来安装 Django : pip install django安装成功后,你就可以开始创建Django项目了。 创建Django项目 打开你的终端或命令提示符,然后使用 django-admin 命令来创建一…