【FPGA基础】基于PWM脉宽调制的呼吸灯设计(Vivado)

这篇具有很好参考价值的文章主要介绍了【FPGA基础】基于PWM脉宽调制的呼吸灯设计(Vivado)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.开发环境

软件:Vivado2019.1
硬件:Zynq7010
仿真:Vivado Simulator

2.预备知识

众所周知,灯的亮度和加在其两端的电压有关。电压越高,亮度越亮,反之越暗。
于是,设计一个呼吸灯就变得很简单了。让IO的输出电平由低到高,再有高到底有规律的变化,就能达到呼吸效果。
现在问题来了,IO的输出电平只有0和3.3V的区别,那么如何让其输出0-3.3V之间的任意电压呢?这就需要用到PWM脉宽调制计数。通俗来讲,就是通过控制一个PWM周期内高电平和低电平的时间来控制其电压。比如一个周期内,高电平时间占50%,那么输出电压为1.65v。

总结:PWM就是在合适的信号频率下,通过一个周期里改变占空比的方式来改变输出的有效电压。

【FPGA基础】基于PWM脉宽调制的呼吸灯设计(Vivado)

3.思路介绍

一般人眼睛对于80Hz 以上刷新频率则完全没有闪烁感。

举个例子:

如果在1秒内,高电平0.5秒,低电平0.5秒,(频率1Hz)如此反复,那么你看到的电灯就会闪烁,
但是如果是10毫秒内,5毫秒打开,5毫秒关闭,(频率100Hz) 这时候灯光的亮灭速度赶不上开关速度(LED灯还没完全亮就又熄灭了),由于视觉暂留作用 人眼不感觉电灯在闪烁,而是感觉灯的亮度少了。

既然如此,那我们就采用频率为100hz的PWM波形对电压进行调制。对应的周期为10ms,也就是说10ms内灯的亮度不变(占空比不变),每隔10ms占空比变化一次。如果我们设定满占空比为100,那么整个呼吸灯的周期为2×10ms×100=2s。换句话说,从暗-亮-暗的时间为2s。

ZYNQ的PL端的板载晶振为50mhz,按照以上的思路,我们需要设计一个周期为10ms的定时器,来更新占空比

设计模块的常量如下:

    parameter CLOCK_FREQ = 50000000;//周期20ms,也就是说20ms内比较值不变
    parameter PWM_FREQ = 100;//100hz 
    parameter PERIOD = CLOCK_FREQ / PWM_FREQ - 1;//10ms定时计数
    parameter FULL_DUTY = 100;//满占空比
    parameter STEP = PERIOD / FULL_DUTY;//步长5000

4.verliog代码

module breath_led(
    input clk,
    input rst,
    output reg [3:0] led
    );
    parameter CLOCK_FREQ = 50000000;//周期20ms,也就是说20ms内比较值不变
    parameter PWM_FREQ = 100;//100hz 
    parameter PERIOD = CLOCK_FREQ / PWM_FREQ - 1;//10ms定时计数
    parameter FULL_DUTY = 100;//满占空比
    parameter STEP = PERIOD / FULL_DUTY;//步长5000
    
    reg [19:0] compare;
    reg [19:0] counter;//10ms定时
    reg [6:0] now_duty;//占空比计数
    reg flag = 1'b1;//方向标志
    
    always@(posedge clk or negedge rst) begin
        if(!rst) begin
            compare <= 20'd0;
            counter <= 20'd0;
            now_duty <= 7'd0;     
        end
        else begin
            counter <= counter + 1'b1;
            if(counter == PERIOD) begin
                if(flag) begin
                    now_duty <= now_duty + 1'b1;
                    compare <= compare + 14'd5000;
                    counter <= 20'd0;
                end
                else begin
                    now_duty <= now_duty - 1'b1;
                    compare <= compare - 14'd5000;
                    counter <= 20'd0;           
                end
            end    
        end   
    end
    
    always@(counter) begin
        if(counter < compare) begin
            led <= 4'b1111;      
        end
        else begin
            led <= 4'b0000;           
        end
    end
    
    always@(now_duty) begin
        if(now_duty == FULL_DUTY) begin
            flag = 1'b0;
        end
        if(now_duty == 0) begin
            flag = 1'b1;
        end
    end
       
endmodule

5.仿真

testbench文件如下:

`timescale 1ns / 1ps

module breath_led_tb();

reg clk_reg;
reg rst_reg;
wire [3:0] led;

wire clk;
wire rst;

initial begin
clk_reg = 0;
rst_reg = 0;
#10
rst_reg = 1;
end

always #1 clk_reg=~clk_reg;
assign rst = rst_reg;
assign clk = clk_reg;

breath_led test
(
.clk(clk),
.rst(rst),
.led(led)
);
endmodule

【FPGA基础】基于PWM脉宽调制的呼吸灯设计(Vivado)
可以看到占空比由小变大的过程,说明我们的逻辑是正确的。文章来源地址https://www.toymoban.com/news/detail-465214.html

到了这里,关于【FPGA基础】基于PWM脉宽调制的呼吸灯设计(Vivado)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FPGA实验六:PWM信号调制器设计

    目录 一、实验目的 二、设计要求 三、实验代码 1.顶层文件代码

    2024年02月12日
    浏览(65)
  • 单片机中的PWM(脉宽调制)的工作原理以及它在电机控制中的应用。

    目录 工作原理 在电机控制中的应用 脉宽调制(PWM)是一种在单片机中常用的控制技术,它通过调整信号的脉冲宽度来控制输出信号的平均电平。PWM常用于模拟输出一个可调电平的数字信号,用于控制电机速度、亮度、电压等。   产生PWM信号: 单片机内部的定时器/计数器通

    2024年01月23日
    浏览(48)
  • 基于 VIVADO 的 FM 调制解调(上)设计篇

            本文先简要介绍了频率调制(frequency modulation,FM,简称调频)的原理,然后对其进行方案设计,最后基于 VIVADO 2018.3 使用 Verilog 进行实现。         角度调制(angle modulation)是已调波的总相角  随着基带信号  作某种变化的调制方式,它包括频率调制和相位调制。

    2023年04月09日
    浏览(24)
  • 基于 VIVADO 的 AM 调制解调(1)方案设计

    常规调幅(conventional AM)信号(简称 AM 信号)的时域表达式为: 其中, 是载波幅度, 是调制信号(基带消息信号)。 是已调信号,它的包络直接对应着信号  的变化规律。 定义调幅指数(modulation index),或调制深度,为:

    2024年02月09日
    浏览(29)
  • PWM呼吸灯+流水灯设计

    完成任务: 在流水灯基础上加入pwm呼吸灯设计,关于pwm呼吸灯设计可以看博主上一篇博客PWM呼吸灯设计 ,开发板上灯每两秒进行一次切换,每一个的亮灭间隔为一秒。 代码参考: 测试文件: 我们通过modelsim仿真结果如下: 结果展示:

    2024年02月16日
    浏览(26)
  • fpga_pwm呼吸灯(EP4CE6F17C8)

    呼吸灯是指灯光在微电脑的控制之下完成由亮到暗的逐渐变化,使用开发板上的四个led灯实现1s间隔的呼吸灯。

    2024年02月15日
    浏览(27)
  • 基于FPGA的脉冲压缩设计(Matlab+vivado)

    前言: 本科学了四年机械,后面转头去了电子信息读研,以FPGA的脉压入手,在从零开始的路上CSDN对我的帮助很大,现整理所学,与诸君共勉。本文不少代码均是参考CSDN上的前辈们一步一步理解做出来的,如有冒犯之处,烦请谅解。 目录 一:脉冲压缩原理介绍 1.我们简单了

    2024年01月19日
    浏览(30)
  • 【FPGA教程案例73】基础操作3——基于FPGA的Vivado功耗估计

    FPGA教程目录 MATLAB教程目录 -------------------------------------------------------------------------------------------------------------------------------- 目录 1.软件版本 2.FPGA工程的功耗分析步骤

    2023年04月24日
    浏览(25)
  • 基于STM32利用PWM完成呼吸灯的实现

    1.高级控制定时器功能实现框图 其中分为6个板块:①时钟源②控制器 ③时基单元 ④输入捕获 ⑤输出比较 ⑥断路功能 2.pwm的定义 pwm是​​​​​​​一种模拟控制方式,根据相应载荷的变化来调制晶体管栅极或基极的偏置,来实现开关稳压电源输出晶体管或晶体管导通时间

    2024年02月03日
    浏览(26)
  • 【Vivado】基于FPGA的出租车计价表设计

    学校FPGA设计结课课设 主要做了出租车计价表,一个比较旧的课题,代码如下: 分模块编程,按照价目表写代码,具体注释见代码。 在module里新加一个 input 变量 key_stage ,用 key_stage 表示不同车流量段,用以计数 在module里新增一个变量 state 来限定是在白天还是夜间

    2024年02月04日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包