【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@(*) begin
    out_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) begin
	if() begin
	end else begin
	end
end

1.3 比较

  • 代码: 从代码层面来看,时序逻辑即敏感列表里面带有时钟上升沿,如果是是带有“*”号的或者assign代码,为组合逻辑。
//--组合
reg a,b,c;
always @(*) begin
	c =a + b;
end
//--wire c;
//--assign c = a + b;

//--时序
always @(posedge clk or negedge rst_n) begin
	if(rst_n==1'b0) begin
		c <= 0;
	end else begin
		c <= 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) begin
    if(!rst_n) begin
        cnt_6ms <= 'd0;
    end
    else if(ov5640_pwdn == 1'b1) begin
        cnt_6ms <= cnt_6ms + 1'b1;
    end
end

assign ov5640_pwdn = (cnt_6ms >= T2_6MS) ? 1'b0 : 1'b1;

//==========================================================================
//==    ov5640_rst_n
//==========================================================================
always  @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        cnt_2ms <= 'd0;
    end
    else if(ov5640_rst_n == 1'b0 && ov5640_pwdn == 1'b0) begin
        cnt_2ms <= cnt_2ms + 1'b1;
    end
end

assign ov5640_rst_n = (cnt_2ms >= T3_2MS) ? 1'b1 : 1'b0;

//==========================================================================
//==    power_done
//==========================================================================
always  @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        cnt_21ms <= 'd0;
    end
    else if(power_done == 1'b0 && ov5640_rst_n == 1'b1) begin
        cnt_21ms <= cnt_21ms + 1'b1;
    end
end


assign 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) begin
	if(!rst_n) begin
		cnt <= 4'b0;
	end else if(!clear_n) begin
		cnt <= 4'b0;
	end else if(add_cnt_vld) begin
		if(end_cnt)begin
			cnt <= 4'b0;
		end else begin
			cnt <= cnt + 1'b1;
		end
	end
end

assign 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

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

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

相关文章

MySQL练习题-求连续、累计、环比和同比问题

目录 准备数据 1&#xff09;求不同产品每个月截止当月最近3个月的平均销售额 2&#xff09;求不同产品截止当月的累计销售额 3&#xff09;求环比增长率和同比增长率 准备数据 -- product 表示产品名称&#xff0c;ym 表示年月&#xff0c;amount 表示销售金额&#xff…

【K8S系列】Kubernetes Service 基础知识 详细介绍

在 Kubernetes 中&#xff0c;Service 是一种抽象的资源&#xff0c;用于定义一组 Pod 的访问策略。它为这些 Pod 提供了一个稳定的访问入口&#xff0c;解决了 Pod 可能频繁变化的问题。本文将详细介绍 Kubernetes Service 的类型、功能、使用场景、DNS 和负载均衡等方面。 1.…

react 总结+复习+应用加深

文章目录 一、React生命周期1. 挂载阶段&#xff08;Mounting&#xff09;补充2. 更新阶段&#xff08;Updating&#xff09;补充 static getDerivedStateFromProps 更新阶段应用补充 getSnapshotBeforeUpdate3. 卸载阶段&#xff08;Unmounting&#xff09; 二、React组件间的…

windows 训练yolov8官方数据集

第一步&#xff1a;安装Anaconda3-2024.06-1-Windows-x86_64.exe 下载地址&#xff1a;https://repo.anaconda.com/archive/ 第二步&#xff1a;创建环境 打开Anaconda Prompt 输入 conda info -e 打印&#xff1a; 已经安装了一些环境&#xff0c;然后我们创建新的环境&a…

大模型面试挺水的,面试官听到这些直接过

AI大模型600道面试总结(LLM) 1、目前主流的开源模型体系有哪些? 目前 主流的开源模型体系 分三种: 第一种:prefixDecoder系 介绍:输入双向注意力&#xff0c;输出单向注意力 代表模型:ChatGLM、ChaGLM2、U-PaLM 第二种:causal Decader系 介绍:从左到右的单向注意力 代表…

【状态机DP】力扣1186. 删除一次得到子数组最大和

给你一个整数数组&#xff0c;返回它的某个 非空 子数组&#xff08;连续元素&#xff09;在执行一次可选的删除操作后&#xff0c;所能得到的最大元素总和。换句话说&#xff0c;你可以从原数组中选出一个子数组&#xff0c;并可以决定要不要从中删除一个元素&#xff08;只能…

驱动-----LED

前面我们学习了demo1的驱动的编写,在写LED的时候,我们可以在demo1的基础上修改。 1.首先就是修改名字,把所有的demo改成led,使用一个字符串替换指令。 2.设备号要变 3.想操作硬件,LED的初始化,亮灭 LED的初始化,在open的时候实现。 亮灭在write的时候实现。 现在就是…

技术成神之路:设计模式(二十三)解释器模式

相关文章&#xff1a;技术成神之路&#xff1a;二十三种设计模式(导航页) 介绍 解释器模式&#xff08;Interpreter Pattern&#xff09;是一种行为设计模式&#xff0c;用于定义一种语言的文法表示&#xff0c;并提供一个解释器来处理这种文法。它用于处理具有特定语法或表达…

移远通信斩获两项车载大奖,引领全球智能网联汽车产业发展

10月24日&#xff0c;由盖世汽车主办的2024第六届金辑奖中国汽车新供应链百强颁奖盛典在上海隆重举行。 作为全球领先的物联网和车联网整体解决方案供应商&#xff0c;移远通信凭借智能座舱模组AG855G、车载5G模组AG59x系列&#xff0c;以及公司在海外市场的优异表现&#xff0…

Mac 上无法烧录 ESP32C3 的问题记录:A fatal error occurred:Failed to write to target RAM

文章目录 问题描述驱动下载地址问题解决&#xff1a;安装 CH343 驱动踩的坑日志是乱码 问题描述 我代码编译可以&#xff0c;但是就是烧录不上去 A fatal error occurred:Failed to write to target RAM(result was 01070000:Operation timed out) Uploaderror:上传失败&…

selenium脚本编写及八大元素定位方法

selenium脚本编写 上篇文章介绍了selenium环境搭建&#xff0c;搭建好之后就可以开始写代码了 基础脚本,打开一个网址 from selenium import webdriver driver webdriver.Chrome()#打开chrome浏览器 driver.get(https://www.baidu.com) #打开百度 打开本地HTML文件 上篇…

ctfshow(265->266)--反序列化漏洞--指针引用与php://input读取请求体

Web265 源代码&#xff1a; error_reporting(0); include(flag.php); highlight_file(__FILE__); class ctfshowAdmin{public $token;public $password;public function __construct($t,$p){$this->token$t;$this->password $p;}public function login(){return $this…

企业贷款大揭秘:税贷VS票贷,哪个更适合你?

在金融界&#xff0c;资金就像是现代经济的血液&#xff0c;特别是对于企业的发展来说&#xff0c;银行的资金支持简直是不可或缺的。最近&#xff0c;多家银行可是动作频频&#xff0c;加快了资金投放的步伐&#xff0c;尤其是制造业、小微企业、专精特新以及“三农”这些领域…

网络编程 Linux环境 C语言实现

进程间通信的延续 跨电脑进程间通信 一、远程通信方式 电路交换------老式有线电话通信 ​ 报文交换 ​ 分组交换 支持分时机制的(分片机制)报文交换 ​现行网络大部分都是采用分组交换形式 二、网络&互联网&因特网 网络Network&#xff1a;多台计算机通过某种传输…

Javaee---多线程(一)

文章目录 1.线程的概念2.休眠里面的异常处理3.实现runnable接口4.匿名内部类子类创建线程5.匿名内部类接口创建线程6.基于lambda表达式进行线程创建7.关于Thread的其他的使用方法7.1线程的名字7.2设置为前台线程7.3判断线程是否存活 8.创建线程方法总结9.start方法10.终止&…

微积分复习笔记 Calculus Volume 1 - 3.5 Derivatives of Trigonometric Functions

3.5 Derivatives of Trigonometric Functions - Calculus Volume 1 | OpenStax

西门子S7-200 SMART 多泵轮换功能库案例下载

通用描述 在现场使用多台风机水泵的场合&#xff0c;需要考虑对多台风机水泵进行轮换&#xff0c;因此如何合 理的对多台风机水泵进行轮换就成了一道难题&#xff0c;本文针对上述情况&#xff0c;专门开发了多 泵轮换的应用库&#xff0c;可以方便统计泵的运行时间&#xf…

Python print()输出颜色设置

标准格式 print("\033[显示方式&#xff1b;前景颜色&#xff1b;背景颜色m…\033[0m") 显示方式 前景颜色和背景颜色 print("\033[0;37;41m我是小杨我就这样\033[0m") print("\033[0;37;42m我是小杨我就这样\033[0m") print("\033[0;37;…

AI助理与知识库:企业新人培训的革新力量

在快速变化的商业环境中&#xff0c;企业新人培训模式的创新已成为提升组织效能的关键。特别是人工智能&#xff08;AI&#xff09;助理的引入&#xff0c;结合知识库的应用&#xff0c;为企业新人培训带来了革命性的变化。以下是对这一变革的深入探讨与前景展望&#xff0c;旨…

文本转语音工具 | Balabolka v2.15.0.880 便携版

Balabolka是一款功能强大的文本转语音&#xff08;TTS&#xff09;软件&#xff0c;它能够将文字转换成语音并保存为多种音频格式&#xff0c;如WAV、MP3、OGG或WMA。这款软件兼容多种文件格式&#xff0c;包括但不限于AZW、CHM、DjVu、DOC、EPUB、FB2、LIT、MOBI、ODT、PDF、P…