基于fpga_EP4CE6F17C8实现的呼吸灯

news2024/9/30 19:38:31

文章目录

  • 前言
  • 实验手册(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

九、板级验证效果

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[CrackMe]damn.exe的逆向及注册机编写

1. 脱壳过程 这个crackme有2个文件 发现加了壳 先来脱壳, 使用ESP守恒, pushad后立马下硬件访问断点 F9直接运行, 立马到popad处 接着走几步就到了OEP 下面使用LordPE来转储映像, 为了防止别人修改PE中的ImageSize, 先尝试修正下ImageSize, 然后dump full即可 接着用x6…

《重构的时机和方法》——让你的代码更健壮、更易维护

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小黄&#xff0c;独角兽企业的Java开发工程师&#xff0c;CSDN博客专家&#xff0c;阿里云专家博主&#x1f4d5;系列专栏&#xff1a;Java设计模式、Spring源码系列、Netty源码系列、Kafka源码系列、JUC源码…

简述IO(BIO NIO IO多路复用)

在unix网络变成中的五种IO模型: Blocking IO(阻塞IO) NoneBlocking IO (非阻塞IO) IO mulitplexing(IO多路复用) signal driven IO (信号驱动IO) asynchronous IO (异步IO) BIO BIO&#xff08;Blocking IO&#xff09;是一种阻塞IO模型&#xff0c;也是传统的IO操作模型之一…

不管如何吐槽,购买iPhone的用户依然义无反顾,苹果继续增长

市调机构IDC公布的二季度数据显示&#xff0c;苹果成为前五名之中除华为之外第二家取得增长的手机品牌&#xff0c;而其他国产手机品牌的出货量都在下滑&#xff0c;显示出国内的消费者仍然在热烈追捧iPhone。 二季度苹果在国内市场的手机出货量同比增长6%&#xff0c;虽然增速…

查看详细的退货信息!亚马逊在卖家中心推出新页面!

亚马逊欧洲站发布公告称亚马逊在卖家中心推出了一个新页面&#xff0c;为卖家提供详细的退货信息&#xff0c;以下是公告内容&#xff1a; 我们在卖家中心推出了一个新页面&#xff0c;为卖家提供详细的退货信息。 现在卖家可以查看每个退货订单&#xff0c;其中包含有关 ASI…

sky-notes-01

1、DTO类 DTO&#xff08;Data Transfer Object&#xff09;&#xff1a;数据传输对象&#xff0c;Service 或 Manager 向外传输的对象。 详见阿里巴巴Java开发手册中的DO、DTO、BO、AO、VO、POJO定义 当前端提交的数据和实体类中对应的属性差别比较大时&#xff0c;建议使用…

【信号去噪和正交采样】流水线过程的一部分,用于对L波段次级雷达中接收的信号进行降噪(Matlab代码实现)

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

信号的学习笔记二

文章目录 信号捕捉signal信号捕捉sigaction信号集未决信号集和阻塞信号集的工作过程 ![在这里插入图片描述](https://img-blog.csdnimg.cn/b896346af6f1462089779e513a7e237b.png)信号集相关函数sigemptysetsigfillsetsigaddsetsigdelsetsigismember应用 以下函数设置内核信号集…

上传图片到腾讯云对象存储桶cos 【腾讯云对象存储桶】【cos】【el-upload】【vue3】【上传头像】【删除】

1、首先登录腾讯云官网控制台 进入对象存储页面 2、找到跨越访问CIRS设置 配置规则 点击添加规则 填写信息 3、书写代码 这里用VUE3书写 第一种用按钮出发事件形式 <template><div><input type="file" @change="handleFileChange" /&…

[NLP]LLM高效微调(PEFT)--LoRA

LoRA 背景 神经网络包含很多全连接层&#xff0c;其借助于矩阵乘法得以实现&#xff0c;然而&#xff0c;很多全连接层的权重矩阵都是满秩的。当针对特定任务进行微调后&#xff0c;模型中权重矩阵其实具有很低的本征秩&#xff08;intrinsic rank&#xff09;&#xff0c;因…

labelme标签格式json转化成yolov8支持是数据集格式

我们用yolov8做实例分割时&#xff0c;需要制作标签&#xff0c;如果用labelme做&#xff0c;不能直接用模型训练&#xff0c;需要利用一个脚本文件进行转换。 import base64 import random import shutil from tqdm import tqdm import math import json import os import nu…

5.2.12.读写接口实践 copy_from_user copy_to_user

5.2.12.读写接口实践 5.2.12.1、完成write和read函数 (1)copy_from_user函数的返回值定义&#xff0c;和常规有点不同。返回值如果成功复制则返回0&#xff0c;如果 不成功复制则返回尚未成功复制剩下的字节数。 copy_from_user 函数&#xff1a;static inline unsigned long _…

【业务功能篇59】Springboot + Spring Security 权限管理 【下篇】

UserDetails接口定义了以下方法&#xff1a; getAuthorities(): 返回用户被授予的权限集合。这个方法返回的是一个集合类型&#xff0c;其中每个元素都是一个GrantedAuthority对象&#xff0c;表示用户被授予的权限。getPassword(): 返回用户的密码。这个方法返回的是一个字符…

第十二章:priority_queue类

系列文章目录 文章目录 系列文章目录前言priority_queue的介绍priority_queue的使用容器适配器什么是容器适配器STL标准库中stack和queue的底层结构 总结 前言 priority_queue是容器适配器&#xff0c;底层封装了STL容器。 priority_queue的介绍 priority_queue文档介绍 优先…

路由器工作原理

路由器原理 路由概述 路由&#xff1a;跨越从源主机到目标主机的一个互联网络来转发数据包的过程。&#xff08;为数据包选择路径的过程&#xff09; 作用&#xff1a;路由器是连接不同网段的。 转发依据&#xff1a; 路由表&#xff1a;路径选择全看路由表&#xff0c;根…

大数据课程D5——hadoop的Sink

文章作者邮箱&#xff1a;yugongshiyesina.cn 地址&#xff1a;广东惠州 ▲ 本章节目的 ⚪ 掌握Sink的HDFS Sink&#xff1b; ⚪ 掌握Sink的Logger Sink&#xff1b; ⚪ 掌握Sink的File Roll Sink&#xff1b; ⚪ 掌握Sink的Null Sink&#xff1b; ⚪ 掌握Si…

【前端知识】React 基础巩固(三十六)——RTK中的异步操作

React 基础巩固(三十六)——RTK中的异步操作 一、RTK中使用异步操作 引入RTK中的createAsyncThunk&#xff0c;在extraReducers中监听执行状态 import { createSlice, createAsyncThunk } from "reduxjs/toolkit"; import axios from "axios";export cons…

<MySQL> Centos 7环境安装MySQL

Centos 7环境安装MySQL 1.卸载不要的环境 停止MySQL服务 systemctl stop mariadb.service systemctl stop mysqld禁止MySQL服务开机自启 systemctl disable mysqld卸载MySQL软件包 yum remove mysql-server mysql-client删除MySQL数据目录 rm -rf /var/lib/mysql清理MySQ…

福特汽车在全球电动汽车市场的主导地位正在不断扩大

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 2023年7月27日&#xff0c;美国最大的汽车巨头之一福特汽车(F)公布了其2023年第二季度财报。 2023年7月6日&#xff0c;福特汽车宣布&#xff0c;第二季度美国市场的汽车销量已经较2023年第一季度增长了11.7%&#xff0c;令…

机器人状态估计:robot_localization 功能包高级参数详解

机器人状态估计&#xff1a;robot_localization 功能包高级参数详解 前言功能包简介相关参数高级参数 前言 移动机器人的状态估计需要用到很多传感器&#xff0c;因为对单一的传感器来讲&#xff0c;都存在各自的优缺点&#xff0c;所以需要一种多传感器融合技术&#xff0c;将…