ZYNQ_project:key_breath
[Synth 8-327] inferring latch for variable 'led_breath_reg' ["C:/Users/warrior/Desktop/ZYNQ/pl/key_breath/rtl/led_breath.v":66]
因为在组合逻辑中,用了非阻塞赋值的方式赋值信号。
组合逻辑自己给自己赋值会产生组合回环,输出不稳定。
模块框图:
代码:
/*电容按键的上升沿检测,拉高一个时钟周期作为控制标志信号。
*/
module key(input wire sys_clk ,input wire sys_rst_n ,input wire key_cup ,output reg key_flag
);// reg signal definereg key_cup_r1 ;reg key_cup_r2 ;wire key_flag_r ;always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) beginkey_cup_r1 <= 1'b0 ;key_cup_r2 <= 1'b0 ;endelse beginkey_cup_r1 <= key_cup ;key_cup_r2 <= key_cup_r1 ;endendassign key_flag_r = key_cup_r1 && ~key_cup_r2 ;// output key_flagalways @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) key_flag <= 1'b0 ;elsekey_flag <= key_flag_r ;end
endmodule
// 呼吸灯,控制信号来一次,切换灯呼吸。
module led_breath(input wire sys_clk ,input wire sys_rst_n ,input wire key_flag ,output reg [1:0] led_out
);parameter MAX_CNT_MS = 1000 ,MAX_CNT_US = 1000 ,MAX_CNT_NS = 50 ;// reg signal definereg [5:0] cnt_ns ;reg [9:0] cnt_us ;reg [9:0] cnt_ms ;reg led_mod;reg led_sel;//reg led_breath ;wire led_breath ;/*************************************************************/// reg [5:0] cnt_ns ;always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n)cnt_ns <= 6'd0 ;else if((cnt_ns == MAX_CNT_NS - 1) || (key_flag))cnt_ns <= 6'd0 ;elsecnt_ns <= cnt_ns + 1'b1 ;end// reg [9:0] cnt_us ;always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) cnt_us <= 10'd0 ;else if(((cnt_us == MAX_CNT_US - 1)&&(cnt_ns == MAX_CNT_NS - 1))||(key_flag))cnt_us <= 10'd0 ;else if(cnt_ns == MAX_CNT_NS - 1)cnt_us <= cnt_us + 1'b1 ;else cnt_us <= cnt_us ; end// reg [9:0] cnt_ms ;always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) cnt_ms <= 10'd0 ;else if(((cnt_ms == MAX_CNT_MS - 1)&&(cnt_us == MAX_CNT_US - 1)&&(cnt_ns == MAX_CNT_NS - 1))||(key_flag))cnt_ms <= 10'd0 ;else if((cnt_us == MAX_CNT_US - 1)&&(cnt_ns == MAX_CNT_NS - 1))cnt_ms <= cnt_ms + 1'b1 ;else cnt_ms <= cnt_ms ;end// reg led_mod ;always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) led_mod <= 1'b1 ;else if(key_flag)led_mod <= 1'b1 ;else if((cnt_ms == MAX_CNT_MS - 1)&&(cnt_us == MAX_CNT_US - 1)&&(cnt_ns == MAX_CNT_NS - 1))led_mod <= ~led_mod ;else led_mod <= led_mod ;end// led_breath// always @(posedge sys_clk or negedge sys_rst_n) begin// if(~sys_rst_n)// led_breath <= 1'b0 ;// else if((led_mod && (cnt_ms > cnt_us)) || (~led_mod && (cnt_ms < cnt_us)))// led_breath <= 1'b1 ;// else if(((led_mod) && (cnt_ms <= cnt_us)) || (~led_mod && (cnt_ms >= cnt_us)))// led_breath <= 1'b0 ;// else // led_breath <= led_breath ;// end// always @(*) begin// if(~sys_rst_n)// led_breath = 1'b0 ;// else if((led_mod && (cnt_ms > cnt_us)) || (~led_mod && (cnt_ms < cnt_us)))// led_breath = 1'b1 ;// else if(((led_mod) && (cnt_ms <= cnt_us)) || (~led_mod && (cnt_ms >= cnt_us)))// led_breath = 1'b0 ;// else // led_breath = led_breath ;// endassign led_breath = ((led_mod && (cnt_ms > cnt_us)) || (~led_mod && (cnt_ms < cnt_us))) ? 1'b1 : 1'b0 ;// reg led_sel ;always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) led_sel <= 1'b0 ;else if(key_flag)led_sel <= ~led_sel ;end// output reg [1:0] led_out always @(posedge sys_clk or negedge sys_rst_n) beginif(~sys_rst_n) led_out <= 2'b00 ;else if(led_sel == 0)led_out <= {1'b0,led_breath} ;else if(led_sel == 1)led_out <= {led_breath,1'b0} ;else led_out <= 2'b00 ;end endmodule
module top(input wire sys_clk ,input wire sys_rst_n ,input wire key_cup ,output wire [1:0] led_out
);// wire signal definewire key_flag ;key key_inst(.sys_clk ( sys_clk ) ,.sys_rst_n ( sys_rst_n ) ,.key_cup ( key_cup ) ,.key_flag ( key_flag )
);led_breath led_breath_inst(.sys_clk ( sys_clk ) ,.sys_rst_n ( sys_rst_n ) ,.key_flag ( key_flag ) ,.led_out ( led_out )
);endmodule
`timescale 1ns/1ns
module test_top();reg sys_clk ;reg sys_rst_n ;reg key_cup ;wire [1:0] led_out ;top top_inst(.sys_clk ( sys_clk ) ,.sys_rst_n ( sys_rst_n ) ,.key_cup ( key_cup ) ,.led_out ( led_out )
);parameter CYCLE = 20 ;defparam top_inst.led_breath_inst.MAX_CNT_MS = 100 ;defparam top_inst.led_breath_inst.MAX_CNT_US = 100 ;defparam top_inst.led_breath_inst.MAX_CNT_NS = 50 ;initial beginsys_clk = 1'b1 ;sys_rst_n <= 1'b0 ;key_cup <= 1'b0 ;#( CYCLE * 2 ) ;sys_rst_n <= 1'b1 ;#(CYCLE * 10) ;#(CYCLE * 1200000);key_cup <= 1'b1;#(CYCLE * 10) ;key_cup <= 1'b0 ;#(CYCLE * 1200000);$stop ;endalways #(CYCLE / 2) sys_clk = ~sys_clk;
endmodule
仿真:
忘记截图了
相关文章:
ZYNQ_project:key_breath
[Synth 8-327] inferring latch for variable led_breath_reg ["C:/Users/warrior/Desktop/ZYNQ/pl/key_breath/rtl/led_breath.v":66] 因为在组合逻辑中,用了非阻塞赋值的方式赋值信号。 组合逻辑自己给自己赋值会产生组合回环,输出不稳定。 …...
设计模式 (原则)
在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程序员要尽量根据6条原则来开发程序,从而提高软件开发效率、节约软件开发成本和维护成本 一、开闭原则 对扩展开放,对修改关闭。 案…...
LeetCode 每日一题 2023/11/6-2023/11/12
记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步 目录 11/6 318. 最大单词长度乘积11/7 2586. 统计范围内的元音字符串数11/8 2609. 最长平衡子字符串11/9 2258. 逃离火灾11/10 2300. 咒语和药水的成功对数11/11 765. 情侣牵手1…...
Linux 基于 LVM 逻辑卷的磁盘管理【简明教程】
一、传统磁盘管理的弊端 传统的磁盘管理:使用MBR先对硬盘分区,然后对分区进行文件系统的格式化最后再将该分区挂载上去。 传统的磁盘管理当分区没有空间使用进行扩展时,操作比较麻烦。分区使用空间已经满了,不再够用了ÿ…...
CTFHUB-WEB-SQL注入
sql学的太不好了,回炉重造 判断 Sql 注入漏洞的类型: 1.数字型 当输入的参 x 为整型时,通常 abc.php 中 Sql 语句类型大致如下:select * from <表名> where id x这种类型可以使用经典的 and 11 和 and 12 来判断ÿ…...
案例分享:某汽车企业通过龙智拓展Jira功能,实现高效项目管理
这家汽车行业的客户缺乏一套系统来支持产品研发过程的管理。他们一直在寻找一款可以覆盖从基本需求到产品开发,再到项目实施等各个阶段的研发管理工具,并且需要这款工具又一定的灵活性,更好地适应并提升现有的业务流程。 通过引入Atlassian的…...
【算法与数据结构】40、LeetCode组合总和 II
文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析:【算法与数据结构】39、LeetCode组合总和的基础之上,这道题变成了candidates中有重复元素&…...
Flink SQL -- 命令行的使用
1、启动Flink SQL 首先启动Flink的集群,选择独立集群模式或者是session的模式。此处选择是时session的模式:yarn-session.sh -d 在启动Flink SQL的client: sql-client.sh 2、kafka SQL 连接器 在使用kafka作为数据源的时候需要上传jar包到…...
asp.net core把所有接口和实现类批量注入到容器
要将所有接口和实现类批量注入到容器,可以使用反射和循环来实现自动批量注册。下面是一种示例方法: 创建一个扩展方法,用于批量注册接口和实现类。 public static class ServiceCollectionExtensions {public static IServiceCollection Re…...
SPSS曲线回归
前言: 本专栏参考教材为《SPSS22.0从入门到精通》,由于软件版本原因,部分内容有所改变,为适应软件版本的变化,特此创作此专栏便于大家学习。本专栏使用软件为:SPSS25.0 本专栏所有的数据文件请点击此链接下…...
软件之禅(七)面向对象(Object Oriented)
黄国强 2023/11/11 前文提到面向对象构建的模块控制器,根据第一性原理,从图灵机的角度,面向对象不是最基本的元素。那么面向对象是不是不重要呢? 答案是否定的,面向对象非常非常重要。当我们面对一个具体的领域…...
汽车之家车型_车系_配置参数数据抓取
// 导入所需的库 #include <iostream> #include <fstream> #include <string> #include <curl/curl.h> #include <regex>// 声明全局变量 std::string htmlContent; std::regex carModelRegex("\\d{4}-\\d{2}-\\d{2}"); std::regex ca…...
RabbitMQ的 五种工作模型
RabbitMQ 其实一共有六种工作模式: 简单模式(Simple)、工作队列模式(Work Queue)、 发布订阅模式(Publish/Subscribe)、路由模式(Routing)、通配符模式(Topi…...
原型制作神器ProtoPie的使用Unity与网页跨端交互
什么是ProtoPie? ProtoPie是一款面向设计师的软件原型设计工具,例如制作App界面交互展示,制作好的原型可以一键发布到Web服务器,就可以浏览器访问。由于其内置了大量常用交互类型,以及"程序化"模块…...
另辟奚径-Android Studio调用Delphi窗体
大家都知道Delphi能调用安卓SDK,比如jar、aar等, 但是反过来,能在Android Studio中调用Delphi开发的窗体吗? 想想不太可能吧, Delphi用的是Pascal,Android Studio用的是Java,这两个怎么能混用…...
SOLID 原则,程序设计五大原则,设计模式
SOLID 是让软件设计更易于理解、更加灵活和更易于维护的五个原则的简称。 单一职责(Single Responsibility Principle):修改一个类的原因只能有一个。开闭原则(Open/Closed Principle):对于扩展,类应该是“开放”的;对于修改&…...
Java基础——数组(一维数组与二维数组)
文章目录 一维数组声明初始化与赋值内存图解 二维数组声明初始化与赋值内存图解 数组练习 数组是多个相同类型的数据按一定顺序排列的集合。 说明: 数组是引用数据类型,数组的元素是同一类型的任何数据类型,包括基本数据类型和引用数据类型…...
Python爬虫抓取微博数据及热度预测
首先我们需要安装 requests 和 BeautifulSoup 库,可以使用以下命令进行安装: pip install requests pip install beautifulsoup4然后,我们需要导入 requests 和 BeautifulSoup 库: import requests from bs4 import BeautifulSou…...
Qt QTableWidget表格的宽度
默认值 QTableWIdget的表格宽度默认是一个给定值,可以手动调整每列的宽度,也不填满父窗口 MainWindow::MainWindow(QWidget *parent): QMainWindow(parent) {this->resize(800,600);QStringList contents{"11","111111111111",&…...
OpenCV(opencv_apps)在ROS中的视频图像的应用(重点讲解哈里斯角点的检测)
1、引言 通过opencv_apps,你可以在ROS中以最简单的方式运行OpenCV提供的许多功能,也就是说,运行一个与功能相对应的launch启动文件,就可以跳过为OpenCV的许多功能编写OpenCV应用程序代码,非常的方便。 对于想熟悉每个…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...
AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...

