【IC每日一题】

IC每日一题

  • 1 组合逻辑VS时序逻辑
    • 1.1 组合逻辑
      • 1.1.1 竞争冒险
      • 1.1.2 解决方法
    • 1.2 时序逻辑
    • 1.3 比较
    • 1.4 场景
  • 2 计数器
    • 2.1 代码片段法
    • 2.2 实现计数器--异步复位,带clear端,计10则归0;

1 组合逻辑VS时序逻辑

1.1 组合逻辑

组合逻辑:使用各种组合逻辑门(逻辑计算+数值运算)来设计,可以理想理解没有时延,瞬时输出;组合逻辑输出结果仅仅取决于当前的输入信号;
问题:组合逻辑容易产生竞争冒险现象;

//一般实现方式
//--way-1
wire  out_1;
assign out_1 = a & b | c;//--way-2
reg out_2;
always@(*) beginout_2 = a & b | c;
end

上述两种实现方式最后在综合都是等价的,都是wire型;

1.1.1 竞争冒险

竞争冒险概念:在组合逻辑电路中,由于门输入信号的不同延迟,导致输入信号变化有先有后,从而任何一个门电路只要有两个输入信号同时向相反方向变化,因为传输延迟,输出端就可能产生干扰脉冲的现象;
延迟产生原因:逻辑门改变状态时经历的一段极短的过渡时间;输入信号传输路径path不同在汇合后导致的传输延迟;这两者造成了信号的延迟;
危害:由于竞争冒险现象的存在,会造成后续逻辑的误动作–比如计数器错误计数,寄存器误操作等;
 

1.1.2 解决方法

尤其是有竞争冒险存在的情况下,负载端是对脉冲敏感的电路;
-------->常用解决方法:函数代数法增加冗余项、滤波电容、格雷码代替二进制、(引入封锁脉冲、选通脉冲);

  • 代数法增加冗余项:通过在函数表达式中“加”上多余的“与”项或“乘”上多余的“或”项,使原函数避免化成X+X或X·X的形式,从而消除可能产生的竞争冒险,冗余项的选择可用代数法或卡诺图法。
  • 格雷码:因为格雷码每一次的输出变化只有一个跳变,从而减少两个信号及以上的变化来传给下一个输入端;
  • 同步电路:在关键路劲上使用边沿出发来存储中间结果,通过时钟沿来同步输入信号的变化,避免竞争冒险;
    

解释:加了一级寄存器后,毛刺信号不会被寄存器采样到,因为寄存器只在时钟的跳变沿变化,毛刺信号是组合逻辑产生的,实际电路里面组合逻辑的信号变化一般也是由寄存器变化引起的信号变化,所以一般发生在时钟跳变之后,而寄存器只在时钟的跳变沿对输入信号采样,所以毛刺信号一般不会被采样到

  • 输出端并联电容:是因为竞争冒险产生的干扰脉冲一般很窄;

1.2 时序逻辑

概念:时序逻辑的输出不仅取决于当前的输入信号,还依赖于过去的状态;时序逻辑电路的设计是由触发器和组合逻辑门的组合来实现;
实现:

//--时序逻辑
always @(posedge clk or negedge rst_n) beginif() beginend else beginend
end

1.3 比较

  • 代码: 从代码层面来看,时序逻辑即敏感列表里面带有时钟上升沿,如果是是带有“*”号的或者assign代码,为组合逻辑。
//--组合
reg a,b,c;
always @(*) beginc =a + b;
end
//--wire c;
//--assign c = a + b;//--时序
always @(posedge clk or negedge rst_n) beginif(rst_n==1'b0) beginc <= 0;end else beginc <= a + b;	end
end
  • 电路:时序逻辑相当于在组合逻辑的基础上多了一个D触发器;
     

  • 波形图:波形图层面,组合逻辑的波形是即刻反映变化的,与时钟无关;但是时序逻辑的波形不会立刻反映出来,只有在时钟的上升沿发生变化;
    

组合逻辑任意时刻的输出仅仅取决该时刻的输入,与时钟无关;时序逻辑先算好当前输入信号的结果,但还不影响输出,只有等到时钟上升沿的一瞬间,才把结果给了输出。

1.4 场景

根据上述来区分组合逻辑和时序逻辑,来讨论其使用场景;
一般来说:首先我们需要保证信号的结果是正确的,只要满足目标需求,这时使用时序逻辑还是组合逻辑都是可以的;但是在这里也要防止关键路径过长,从而时序违例;
模块的输出一般都要求是时序逻辑输出的;
状态机是需要时序逻辑的;
在后续在出同步逻辑和时序逻辑典型的代码;

2 计数器

2.1 代码片段法

设计范式:代码片段法;----有助于代码逻辑表达清晰;从代码中可以明显看出;
在这里,计数器是计满保持;以这个例子来,主要是感受module代码的写法;
时序图如下:
在这里插入图片描述

实现代码如下:

//====写的代码逻辑太清楚了,逻辑清楚方便review,也相信后续方便进行debug;
module power_ctrl
//========================< 端口 >==========================================
(
//system --------------------------------------------
input   wire                clk                     , // 50MHz
input   wire                rst_n                   ,
//ov5640 --------------------------------------------
output  wire                ov5640_pwdn             , // ov5640上电
output  wire                ov5640_rst_n            , // ov5640复位
output  wire                power_done                // power_ctrl全面有效,SCCB可以开始工作
);
//========================< 参数 >==========================================
localparam T2_6MS           = 30_0000               ; // T2>5ms
localparam T3_2MS           = 10_0000               ; // T3>1ms
localparam T4_21MS          = 105_0000              ; // T4>20ms
//========================< 信号 >==========================================
reg     [18:0]              cnt_6ms                 ;
reg     [16:0]              cnt_2ms                 ;
reg     [20:0]              cnt_21ms                ;//==========================================================================
//==    ov5640_pwdn
//==========================================================================
always @(posedge clk or negedge rst_n) beginif(!rst_n) begincnt_6ms <= 'd0;endelse if(ov5640_pwdn == 1'b1) begincnt_6ms <= cnt_6ms + 1'b1;end
endassign ov5640_pwdn = (cnt_6ms >= T2_6MS) ? 1'b0 : 1'b1;//==========================================================================
//==    ov5640_rst_n
//==========================================================================
always  @(posedge clk or negedge rst_n) beginif(!rst_n) begincnt_2ms <= 'd0;endelse if(ov5640_rst_n == 1'b0 && ov5640_pwdn == 1'b0) begincnt_2ms <= cnt_2ms + 1'b1;end
endassign ov5640_rst_n = (cnt_2ms >= T3_2MS) ? 1'b1 : 1'b0;//==========================================================================
//==    power_done
//==========================================================================
always  @(posedge clk or negedge rst_n) beginif(!rst_n) begincnt_21ms <= 'd0;endelse if(power_done == 1'b0 && ov5640_rst_n == 1'b1) begincnt_21ms <= cnt_21ms + 1'b1;end
endassign power_done = (cnt_21ms >= T4_21MS) ? 1'b1 : 1'b0;endmodule

2.2 实现计数器–异步复位,带clear端,计10则归0;

题目:如上所示,这是常规的cnt计数,但是注意在这里使用到的设计思想;
要求:代码片段法

module cnt(
//==========================< 端口 >=========================
input wire clk,
input wire rst_n,
input wire clear_n,
output reg[3:0] cnt
);
//==========================< 参数 >=========================
parameter CNT_MAX = 10;//==========================< 信号 >=========================
wire 	add_cnt_vld;
wire       end_cnt_vld;//=========================================================
//--  0到10循环
//=========================================================
always @(posedge clk or negedge rst_n) beginif(!rst_n) begincnt <= 4'b0;end else if(!clear_n) begincnt <= 4'b0;end else if(add_cnt_vld) beginif(end_cnt)begincnt <= 4'b0;end else begincnt <= cnt + 1'b1;endend
endassign add_cnt_vld = 1'b1;
assign end_cnd_vld = add_cnt_vld && cnt==10 -1;endmodule

【REF】
https://fpga.eetrend.com/content/2022/100562812.html
https://hui-shao.com/digital-circuits-race-and-hazard/
https://fpga.eetrend.com/content/2022/100562812.html
https://www.cnblogs.com/xianyuIC/p/10908740.html
https://mp.weixin.qq.com/s?__biz=Mzg4NzcyMzU2Mg==&mid=2247484281&idx=1&sn=44fedaa86a7f5ffc47579d3a990bb429&chksm=cf87403cf8f0c92a863226c85b4a8af9d667d8ffe0013c873edc74fe666279669e4aac63a4b1&token=172677512&lang=zh_CN#rd

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SSM-Springboot笔记(2)- SpringBoot常用开发技能

1 SpringBoot常用开发技能 1.1 项目架构 创建项⽬配置启动类建⽴对应的包&#xff0c;先建⽴这些包&#xff0c;其他⽤到再补充 controller service mapper domain utils1.2 开发HTTP接⼝GET请求 GET请求 场景&#xff1a;⼀般的查询接⼝就是get请求 注解&#xff1a;GetMappin…

Android在kts中使用navigation及Args

Android在kts中使用navigation及Args 前言&#xff1a; ​ 之前在项目中使用过navigation&#xff0c;但都是以Groory的方式&#xff0c;最近一年多使用kts后忍不住把项目都改成kts的方式&#xff0c;不过其中也遇到不少坑&#xff0c;今天就讲解一下如何在kts中使用navigati…

MyBatis缓存详解(一级缓存、二级缓存、缓存查询顺序)

固态硬盘缺陷&#xff1a;无法长时间使用&#xff0c;而磁盘只要不消磁&#xff0c;只要不受到磁影响&#xff0c;就可以长期使用&#xff0c;因此绝大多数企业还是使用磁盘来存储数据 像mysql这种关系型数据库中的数据存储在磁盘中&#xff0c;为方便查询&#xff0c;减少系统…

springboot襄阳华侨城奇幻度假区服务平台-计算机毕业设计源码93560

目 录 摘要 1 绪论 1.1 研究背景 1.2 研究意义 1.3 开发技术 1.3.1 B/S架构 1.3.2 Spring Boot框架 1.3.3 Java语言 1.3.4 MySQL数据库 1.4论文章节安排 2系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 登录流程 2.2.2数据删除流程 2.3 系统…

2024年好用不踩雷的8款图纸加密软件推荐!CAD图纸加密软件!

在2024年&#xff0c;随着信息安全需求的提升&#xff0c;特别是对于设计、建筑、制造等行业的CAD图纸保护&#xff0c;图纸加密软件的选择尤为重要。以下推荐了8款优质的CAD图纸加密软件&#xff0c;这些软件不仅提供了强大的加密功能&#xff0c;还在易用性和兼容性方面表现出…

创新业态下金融头部机构在 FICC 平台建设上的思考与实践

近年来&#xff0c;FICC 投资交易呈现活跃多元态势&#xff0c;创新转型稳步推进。FICC 平台电子化方兴未艾&#xff0c;是机构提升服务效率和质量的一大着力点。因此&#xff0c;在 FICC 平台建设上&#xff0c;许多机构都进行了深入研究&#xff0c;积累了丰富的实践经验。 …

MongoDB快速入门

MongoDB 概念 什么是 MongoDB MongoDB 是在2007年由DoubleClick公司的几位核心成员开发出的一款分布式文档数据库&#xff0c;由C语言编写。 目的是为了解决数据大量增长的时候系统的可扩展性和敏捷性。MongoDB要比传统的关系型数据库简单很多。 在MongoDB中数据主要的组织…

Spring boot 配置文件的加载顺序

Spring Boot 在启动时会扫描以下位置的 application.properties 或者 application.yml 文件作为全局配置文件&#xff1a; –file:./config/–file:./–classpath:/config/–classpath:/以下是按照优先级从高到低的顺序&#xff0c;如下所示&#xff1a; Spring Boot 会全部扫…

医院信息化与智能化系统(10)

医院信息化与智能化系统(10) 这里只描述对应过程&#xff0c;和可能遇到的问题及解决办法以及对应的参考链接&#xff0c;并不会直接每一步详细配置 如果你想通过文字描述或代码画流程图&#xff0c;可以试试PlantUML&#xff0c;告诉GPT你的文件结构&#xff0c;让他给你对应…

自由学习记录(15)

Java注解 else if的省略问题&#xff08;可能看花&#xff09; else if也是取最近的if连通&#xff0c;看上去加了{}就可以正常执行了&#xff0c;缩进要命&#xff0c;不提示真容易看错&#xff0c; 组合数公式和数组参数 在 C 中&#xff0c;数组作为函数参数时&#xff0c;…

【课件分享】蓝光光盘及光驱团标解读

关注我们 - 数字罗塞塔计划 - 10月26日&#xff0c;非常感谢陶光毅老师携特邀嘉宾许斌老师和游泳总能够在百忙之中抽空莅临数字罗塞塔计划直播间&#xff0c;为大家带来蓝光光盘及光驱团标解读。作为标准的起草者&#xff0c;你们的专业见解和宝贵经验&#xff0c;让我们对T/CE…

Lucas带你手撕机器学习——SVM支持向量机

#1024程序员节&#xff5c;征文# 支持向量机&#xff08;SVM&#xff09;的详细讲解 什么是SVM&#xff1f; 支持向量机&#xff08;Support Vector Machine&#xff0c;SVM&#xff09;是一种用于分类和回归的监督学习算法。它的主要任务是从给定的数据中找到一个最佳的决策…

Windows/Linux(服务器)查看显卡的名称

文章目录 1. 使用 nvidia-smi&#xff08;适用于 NVIDIA 显卡&#xff09;2. 使用 wmic 命令&#xff08;Windows&#xff09; 1. 使用 nvidia-smi&#xff08;适用于 NVIDIA 显卡&#xff09; 如果服务器上安装了 NVIDIA 驱动程序&#xff0c;可以使用 nvidia-smi 工具来查看…

vue使用xlsx以及file-saver进行下载xlsx文件以及Unit8Array、ArrayBuffer、charCodeAt的使用

先说Unit8Array、ArrayBuffer、charCodeAt的使用下面会用到这三个 Unit8Array&#xff1a;数组类型表示一个 8 位无符号整型数组&#xff0c;创建时内容被初始化为 0。创建完后&#xff0c;可以以对象的方式或使用数组下标索引的方式引用数组中的元素。 new Uint8Array(); //…

Docker中如何控制服务启动顺序实现探讨

文章目录 一、Docker概述二、Docker三剑客1. Compose2. Machine3. Swarm 三、简要需求1. 样例工程2. 代码模块3. 调用方向4. 期望启动顺序 四、思路分析1.各走各路1.&#xff09;docker-compose -f指定不同配置文件2.&#xff09;docker-compose up -d service-name指定服务名3…

【CSS in Depth 2 精译_055】8.3 伪类 :is() 和 :where() 的正确打开方式

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 【第三部分 现代 CSS 代码组织】 ✔️【第八章 层叠图层及其嵌套】 ✔️ 8.1 用 layer 图层来操控层叠规则&#xff08;上篇&#xff09; 8.1.1 图层的定义&#xff08;上篇&#xff09;8.1.2 图层的…

巡飞单机多旋翼无人机技术详解

巡飞单机多旋翼无人机技术是一种集成了多种先进技术的无人机系统&#xff0c;它具备自主飞行、长续航、高精度控制以及多任务负载能力等特点。以下是对巡飞单机多旋翼无人机技术的详细解析&#xff1a; 一、机架与结构设计 1.材料选择&#xff1a;为了确保无人机能够承载足够…

cmake命令使用

有关cmake的入门简介可参见 CMake入门教程_cmake静态test.c编译-CSDN博客 本文是进一步对cmake常用命令做进一步详述 配置项目 cmake_minimum_required 作用 配置cmake最低版本 用法 cmake_minimum_required(VERSION 3.0) project 作用&#xff1a;设置预设变量 PROJEC…

深度学习(一)基础:神经网络、训练过程与激活函数(1/10)

深度学习基础&#xff1a;神经网络、训练过程与激活函数 引言&#xff1a; 深度学习作为机器学习的一个子领域&#xff0c;近年来在人工智能的发展中扮演了举足轻重的角色。它通过模仿人脑的神经网络结构&#xff0c;使得计算机能够从数据中学习复杂的模式和特征&#xff0c;…

dmsql日志分析工具部署与使用DM8/DM7

dmsql日志分析工具部署与使用DM8/DM7 1 环境介绍2 JAVA 环境变量配置2.1 Os Kylin 10 JAVA 环境变量配置2.2 Windos7 JAVA环境变量配置 3 数据库配置3.1 数据库初始化参数3.2 数据库创建表 4 配置DMLOG日志分析工具4.1 Kylin v10 配置DMLOG日志分析工具4.2 执行日志分析4.3 Win…