基于fpga_EP4CE6F17C8实现的呼吸灯

文章目录

  • 前言
  • 实验手册(EP4CE6F17C8)
  • 一、实验目的
  • 二、实验原理
    • 理论原理
  • 三、系统架构设计
  • 四、模块说明
    • 1.模块端口信号列表
    • 2.状态转移图
    • 3.时序图
  • 五、仿真波形图
  • 六、引脚分配
  • 七、代码实现
  • 八、仿真代码
  • 九、板级验证效果

前言

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

实验手册(EP4CE6F17C8)

一、实验目的

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

二、实验原理

理论原理

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

三、系统架构设计

请添加图片描述

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

四、模块说明

1.模块端口信号列表

端口信号信号类别信号名称信号作用
inputwireclk时钟信号
inputwirerst_n复位信号
outputregledled信号

2.状态转移图

请添加图片描述

3.时序图

请添加图片描述

该图是用time gen来画的

五、仿真波形图

请添加图片描述

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

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

六、引脚分配

请添加图片描述

七、代码实现

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

九、板级验证效果

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【论文阅读】Feature Inference Attack on Shapley Values

摘要 研究背景 近年来&#xff0c;解释性机器学习逐渐成为一个热门的研究领域。解释性机器学习可以帮助我们理解机器学习模型是如何进行预测的&#xff0c;它可以提高模型的可信度和可解释性。Shapley值是一种解释机器学习模型预测结果的方法&#xff0c;它可以计算每个特征对…

视频标注是什么?和图像数据标注的区别?

视频数据标注是对视频剪辑进行标注的过程。进行标注后的视频数据将作为训练数据集用于训练深度学习和机器学习模型。这些预先训练的神经网络之后会被用于计算机视觉领域。 自动化视频标注对训练AI模型有哪些优势 与图像数据标注类似&#xff0c;视频标注是教计算机识别对象…

springboot整合myabtis+mysql

一、pom.xml <!--mysql驱动包--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><!--springboot与JDBC整合包--><dependency><groupId>org.springframework.b…

hcip——路由策略

要求&#xff1a; 基础配置 AR1 [R1]int g 0/0/0 [R1-GigabitEthernet0/0/0]ip add 12.0.0.1 24[R1-GigabitEthernet0/0/0]int g 0/0/1 [R1-GigabitEthernet0/0/1]ip add 14.0.0.1 24[R1]int loop0 [R1-LoopBack0]ip add 1.1.1.1 24[R1]rip 1 [R1-rip-1]vers 2 [R1-rip-1]net…

基于扩展(EKF)和无迹卡尔曼滤波(UKF)的电力系统动态状态估计(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

k8s中强制删除pv

K8s 集群内有一个已经不再使用的 PV&#xff0c;虽然已经删除了与其关联的 Pod 及 PVC&#xff0c;并对其执行了删除命令&#xff0c;但仍无法正常删除&#xff0c;一直处于 Terminating 状态&#xff1a; 解决办法&#xff1a; 1. 获取pv信息 kubectl get pv 2. 解除pv锁定 …

2023/7/29总结

项目&#xff1a; 这几天主要实现了评论的功能点: 还是有点小bug&#xff0c;还在更改中…… 修改个人中心的界面 接下来是把收藏完善&#xff0c;因为收藏需要用户自己创建一个新的收藏夹

JAVA 正则表达式(heima)

JAVA 正则表达式&#xff08;heima&#xff09; public class RegexDemo01 {/** 正则表达式介绍&#xff1a;本质来说就是一个字符串&#xff0c;字符串中可以指定规则&#xff0c;来对其他字符串进行校验。* public boolean matches(String regex):根据传入的正则表达式&#…

matplotlib绘图中可选标记

文章目录 简介所有可用的绘图标记绘图函数标记绘制 简介 前面的博客简要介绍了matplotlib中的绘图标记&#xff0c;并列举出了部分可用标记点的类型&#xff0c;并画了个图作为示例&#xff0c;如下图下表所示。本文则将所有标记点的类型均绘制一遍 字符类型字符类型字符类型…

基于springboot+mybatis+thymeleaf+html产品销售与分析系统

基于springbootmybatisthymeleafhtml产品销售与分析系统 一、系统介绍二、功能展示1.下单(批发商)2.订单管理&#xff08;批发商&#xff09;3.首页(厂家管理员)4.订单管理&#xff08;厂家管理员&#xff09;5.商品管理&#xff08;厂家管理员&#xff09;6.统计分析&#xff…

【深度学习】InST,Inversion-Based Style Transfer with Diffusion Models,论文

代码&#xff1a;https://github.com/zyxElsa/InST 论文&#xff1a;https://arxiv.org/abs/2211.13203 文章目录 AbstractIntroductionRelated WorkImage style transferText-to-image synthesisInversion of diffusion models MethodOverview ExperimentsComparison with Sty…

记录每日LeetCode 141.环形链表 Java实现

题目描述&#xff1a; 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链…

【面试大题】决策树

决策树知识点 ID3 规则——信息增益&#xff08;基于熵&#xff09; 先计算根结点的信息熵 H ( D ) − ∑ k 1 ∣ Y ∣ p k log ⁡ p k H(D)-\sum_{k1}^{|Y|}{p_k\log{p_k}} H(D)−∑k1∣Y∣​pk​logpk​再计算根据某特征分割之后的条件熵 H ( D ∣ f e a t u r e ) ∑…

iOS - 解压ipa包中的Assert.car文件

项目在 Archive 打包后&#xff0c;生成ipa包 将 xxx.ipa文件修改为zip后缀即 xxx.zip &#xff0c;然后再双击解压&#xff0c;会生成一个 Payload 文件夹&#xff0c;里面一个文件 如下图&#xff1a; 然后显示改文件的包内容&#xff1a; 解压 Assets.car 文件的方式&…

Appium+python自动化(二十二)- 控件坐标获取(超详解)

简介 有些小伙伴或者是童鞋可能会好奇会问上一篇中的那个monkey脚本里的坐标点是如何获取的&#xff0c;不是自己随便蒙的猜的&#xff0c;或者是自己用目光或者是尺子量出来的吧&#xff0c;答案当然是&#xff1a;NO。获取控件坐标点的方式这里宏哥给小伙伴们分享和讲解三种方…

C#时间轴曲线图形编辑器开发2-核心功能实现

目录 三、关键帧编辑 1、新建Winform工程 &#xff08;1&#xff09;界面布局 &#xff08;2&#xff09;全局变量 2、关键帧添加和删除 &#xff08;1&#xff09;鼠标在曲线上识别 &#xff08;2&#xff09;键盘按键按下捕捉 &#xff08;3&#xff09;关键帧添加、删…

全面适配 | 走近openGauss数据库+鲲鹏欧拉操作系统

引入 全面适配 | openEuler操作系统 openGauss数据库 开篇 1、openEuler欧拉操作系统 百度百科&#xff1a;openEuler是覆盖全场景的创新平台&#xff0c;在引领内核创新&#xff0c;夯实云化基座的基础上&#xff0c;面向计算架构互联总线、存储介质发展新趋势&#xff0c;…

某渣渣平台APP登录

准备 APP有壳----360的好像是&#xff0c;懒得回头再看了加密参数sign、password 过程就略过吧&#xff01;此处只展示结果

win10 hadoop报错 unable to load native-hadoop library

win10 安装hadoop执行hdfs -namenode format 和运行hadoop的start-all报错 unable to load native-hadoop library 验证&#xff1a; hadoop checknative -a 这个命令返回都是false是错的 返回下图是正确的 winutils: true D:\soft\hadoop-3.0.0\bin\winutils.exe Native li…

STM32MP157驱动开发——按键驱动(定时器)

内核函数 定时器涉及函数参考内核源码&#xff1a;include\linux\timer.h 给定时器的各个参数赋值&#xff1a; setup_timer(struct timer_list * timer, void (*function)(unsigned long),unsigned long data)&#xff1a;设置定时器&#xff1a;主要是初始化 timer_list 结…