基于fpga_EP4CE6F17C8实现的呼吸灯

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

前言

网上找资料时一般出现的是led灯1s从暗到亮,下一个1s从亮到暗,所以在此记录一篇2s的呼吸灯,也为日后自己复习提供一点帮助,结尾有源码。

实验手册(EP4CE6F17C8)

一、实验目的

四个LED灯2s从暗到亮,下一个2s从亮到暗,循环显示。

二、实验原理

理论原理

在fpga中,呼吸灯的实现是通过控制占空比的多少,输出两段,第一段:由暗到亮,占空比由0%到100%逐步递增,第二段:由亮到暗,占空比由100%到0%逐步递减

三、系统架构设计

ep4ce6f17c8,fpga开发

  • 呼气和吸气,周期为4秒。考虑呼气的过程,就是让led灯要有亮灭的变化,从暗到亮,再从亮到暗。
  • 为了led的亮度变化比较流畅,也就是每隔2ms我们给led灯一个新的亮度,我们将2秒拆分为1000份的2ms,为了实现led灯亮度变化,每一份2ms波形的占空比都不能相同,且必须是连续增加或减小的。
  • 2ms的时间内,我们一共有1000个状态,每一个状态就是一个占空比时间为2us。所以我们需要三个计数器。最后利用后面两个计数器cnt_2ms和cnt_2s的大小进行比较,来改变一个时钟周期内的占空比。

四、模块说明

1.模块端口信号列表

端口信号 信号类别 信号名称 信号作用
input wire clk 时钟信号
input wire rst_n 复位信号
output reg led led信号

2.状态转移图

ep4ce6f17c8,fpga开发

3.时序图

ep4ce6f17c8,fpga开发

该图是用time gen来画的

五、仿真波形图

ep4ce6f17c8,fpga开发

  • 这部分是从暗到亮的仿真波形,在breath_led一行我们可以很明显的看到从一开始基本看不见1111,到后面1111的占空比逐步扩大。
    ep4ce6f17c8,fpga开发

  • 这部分则是从亮到暗,breath_led一行,0000的占空比逐步扩大

六、引脚分配

ep4ce6f17c8,fpga开发文章来源地址https://www.toymoban.com/news/detail-784176.html

七、代码实现

module breath_led (
    input   clk         , 
    input   rst_n       ,

    output reg [3:0] breath_led  
);

parameter MAX_2us = 10'd99 ;    //2us
//之所以2ms和2s都是999,这是因为这两个的开始信号我分别设置为cnt_2us的结束信号、cnt_2ms的结束信号
//记了1000次的us信号就等于2ms,2s也是这个道理
parameter MAX_2ms = 19'd999;    //2ms = 1000 * 2us
parameter MAX_2s  = 19'd999;    //2s  = 1000 * 2ms  

reg [9:0] cnt_2us;
reg [18:0] cnt_2ms;
reg [18:0] cnt_2s;
reg [1:0] flag;     //状态转变标志,判断是从暗到亮还是从亮到暗

wire add_cnt_2us;   //计数器开始信号
wire end_cnt_2us;   //计数器结束信号

wire add_cnt_2ms;   
wire end_cnt_2ms;   

wire add_cnt_2s;    
wire end_cnt_2s;    

always @(negedge rst_n or posedge clk) begin
    if (!rst_n) begin
        cnt_2us <= 6'd0;
    end
    else if (add_cnt_2us) begin
        if (end_cnt_2us) begin
            cnt_2us <= 6'd0;
        end
        else begin
            cnt_2us <= cnt_2us + 6'd1;
        end
    end
    else begin
        cnt_2us <= cnt_2us;
    end
end
    assign add_cnt_2us = 1'd1;
    assign end_cnt_2us = add_cnt_2us && cnt_2us == MAX_2us; 

always @(negedge rst_n or posedge clk) begin
    if (!rst_n) begin
        cnt_2ms <= 6'd0;
    end
    else if (add_cnt_2ms) begin
        if (end_cnt_2ms) begin
            cnt_2ms <= 6'd0;
        end
        else begin
            cnt_2ms <= cnt_2ms + 6'd1;
        end
    end
    else begin
        cnt_2ms <= cnt_2ms;
    end
end
    assign add_cnt_2ms = end_cnt_2us;
    assign end_cnt_2ms = add_cnt_2ms && cnt_2ms == MAX_2ms; 

always @(negedge rst_n or posedge clk) begin
    if (!rst_n) begin
        cnt_2s <= 6'd0;
    end
    else if (add_cnt_2s) begin
        if (end_cnt_2s) begin
            cnt_2s <= 6'd0;
        end
        else begin
            cnt_2s <= cnt_2s + 6'd1;
        end
    end
    else begin
        cnt_2s <= cnt_2s;
    end
end
    assign add_cnt_2s = end_cnt_2ms;
    assign end_cnt_2s = add_cnt_2s && cnt_2s == MAX_2s; 

//每隔两秒,信号翻转,进入下一状态
always @(posedge clk or negedge rst_n)begin 
    if(!rst_n)begin
        flag <= 1'b0;
    end 
    else if(end_cnt_2s)begin 
        flag <= ~flag;//1s取反
    end 
    else begin 
        flag <= flag;
    end 
end


always @(negedge rst_n or posedge clk) begin
    if (!rst_n) begin
        breath_led <= 4'b0000;
    end
    //状态一:从暗到亮
    else if (!flag)begin
        breath_led <= (cnt_2s > cnt_2ms)?4'b1111:4'b0000;
    end
    //状态二:从亮到暗
    else if (flag) begin
        breath_led <= (cnt_2s > cnt_2ms)?4'b0000:4'b1111;
    end
    else begin
        breath_led <= breath_led;
    end
end
endmodule

八、仿真代码

`timescale 1ns/1ns
module breath_led_tb ();
//激励信号
    reg clk;
    reg rst_n;
//响应信号
    wire  [3:0] breath_led;

parameter CYCLE = 20;
//完整代码中的计数时间长,故在此重新赋予短时的参数,以便观察结果
parameter MAX_2us = 10;
parameter MAX_2ms = 20;
parameter MAX_2s  = 20;

//产生时钟信号
always #(CYCLE/2) clk = ~clk;

//产生激励
initial begin
    clk = 1'b0;
    rst_n = 1'b0;
    #(CYCLE);
    rst_n = 1'b1;
    #(2*(MAX_2us)*(MAX_2ms)*(MAX_2s)*CYCLE);//检测一个大周期:从暗到亮,从亮到暗
    $stop;
end
//实例化
breath_led #(
    .MAX_2us(MAX_2us),
    .MAX_2ms(MAX_2ms),
    .MAX_2s(MAX_2s)
)
u_breath_led(
    .clk(clk),
    .rst_n(rst_n),
    .breath_led(breath_led)
);

endmodule

九、板级验证效果

到了这里,关于基于fpga_EP4CE6F17C8实现的呼吸灯的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【技术分享】Altera FPGA EP4CGX22CF19C8详解:原理图、PCB图纸、源代码及PCIe二次开发驱动和代码全解析

    altera fpga ep4cgx22cf19c8,有原理图,PCB图纸,源代码,PCIe二次开发驱动和代码等。 ID:313000 681436451614 小明子555 《基于Altera FPGA EP4CGX22CF19C8的硬件开发与PCIe驱动开发》 摘要:本文基于Altera FPGA EP4CGX22CF19C8芯片,探讨了硬件开发和PCIe驱动开发的相关技术。首先介绍了EP4CGX22CF19C8芯片

    2024年04月25日
    浏览(26)
  • 【FPGA基础】基于PWM脉宽调制的呼吸灯设计(Vivado)

    软件:Vivado2019.1 硬件:Zynq7010 仿真:Vivado Simulator 众所周知,灯的亮度和加在其两端的电压有关。电压越高,亮度越亮,反之越暗。 于是,设计一个呼吸灯就变得很简单了。让IO的输出电平由低到高,再有高到底有规律的变化,就能达到呼吸效果。 现在问题来了,IO的输出电

    2024年02月07日
    浏览(60)
  • 【FPGA】用Verilog语言实现呼吸灯实验

    包含两个输入信号:系统时钟(sys_clk)以及复位信号(sys_rst_n)。 一个输出信号:led_out 通过PWN来控制呼吸灯的亮、灭程度 前一周期为:完全熄灭 —— 完全点亮 后一周期为:完全点亮 —— 完全熄灭 完全熄灭 —— 完全点亮 、 完全点亮 —— 完全熄灭 时间均为1s 由板子频

    2024年02月11日
    浏览(44)
  • FPGA综合设计实验:基于PWM脉宽调制的呼吸流水灯设计

    目录 一、引言 二、项目准备 1.项目预期目标 2.项目原理及总体实现思路

    2024年02月13日
    浏览(51)
  • 基于STM32利用PWM完成呼吸灯的实现

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

    2024年02月03日
    浏览(31)
  • 呼吸灯——FPGA

    环境: 1、Quartus18.0 2、vscode 3、板子型号:EP4CE6F17C8 要求: 将四个LED灯实现循环从亮到灭、灭到亮的过程。下面我使用了两种方法供大家阅读。 呼吸灯其实是在微处理器的控制下,由暗渐亮、然后再由亮渐暗,模仿人呼吸方式的 LED 灯。 呼吸灯采用 PWM 的方式,在固定的频率

    2024年02月16日
    浏览(24)
  • 【FPGA笔记系列13】呼吸灯电路设计

    常规的 LED 灯只有亮(高电平) 及暗(低电平) 两种状态。 如果产生一个周期性的脉冲信号用于驱动 LED 灯, 则 LED 灯会出现闪烁状态。 如果脉冲信号的频率足够高(大于人眼的分辨频率 24Hz),则由于人眼的分辨率问题, 看起来 LED 灯仍然是恒亮的。此时, 只要控制脉冲

    2024年02月13日
    浏览(32)
  • RoboMaster EP 实用功能开发(三): 基于树莓派的ROS2机器人系统搭建

    功能: 在树莓派4b上安装ros2系统,引入robomaster sdk,搭建一个基于ROS2的机器人系统,用于ROS系统的学习、开发和实践。 硬件: RobotMaster EP、树莓派4b 系统平台: Ubuntu 20.04、ROS2(Foxy) 开发语言及主要库函数版本:p ython == 3.8,robomaster == 0.1.1.62 一、树莓派4b安装ubuntu20.04  

    2024年02月09日
    浏览(36)
  • PCIE那些事之linux下EP驱动实现方式二

    EP设备驱动,主要运行在RC侧,用于控制总线地址上的数据传输使用, 提供给应用层接口,应用层调用此接口完成数据传输,主要的分层结构如下 RC侧包含RC控制器驱动 和EP设备驱动 EP侧包含EP控制器驱动和EP端口驱动 (无需关心,一般厂商提供) 实现的主要是EP设备驱动 主要分

    2023年04月08日
    浏览(22)
  • 北邮22级信通院数电:Verilog-FPGA(12)第十二周实验(2)彩虹呼吸灯(bug已解决 更新至3.0)

    北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章,请访问专栏: 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 目录 一.代码部分 1.1一些更新和讲解 1.2改正后的代码  二.管脚分配 三

    2024年02月04日
    浏览(38)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包