【IC每日一题】

IC每日一题

  • 1:锁存器(latch)、触发器(flip-flop)、寄存器的概念及区别
    • 1.1 概念
    • 1.2 锁存器的危害
    • 1.3 如何避免产生锁存器
  • 2 手撕题:边沿检测
    • 2.1 边沿检测(上升沿、下降沿、双边沿)
      • 2.1.1 波形图
      • 2.1.2 算法步骤
      • 2.1.3 代码
    • 2.2 序列模三检测器
      • 2.2.1 描述
      • 2.2.2 波形图
      • 2.2.3 代码

本文主要介绍:锁存器/寄存器概念以及锁存器的危害和避免方法、边沿检测和序列模三检测;

1:锁存器(latch)、触发器(flip-flop)、寄存器的概念及区别

1.1 概念

锁存器latch:锁存器是电平出发的存储单元,数据存储的动作(状态转换)取决于输入(或使能)的信号的电平值,仅当锁存器处于使能状态时,输出才会随着数据输入发生变化;
常见的锁存器包括三个端口:数据输入口、数据输出口、使能端。当使能端为高电平时,输入口的数据直接送到输出口,此时输入输出口可以看成是直接连通的;当使能端为低电平时,输出口的数据保持之前的数据不变,无论输入口的数据怎么变化,输出都保持不变,就是把原来的状态锁存下来了(所以才叫锁存器)。
触发器(flip-flop):触发器是边沿敏感的存储单元,数据存储的动作(状态转换)只在时钟的上升沿或下降沿的到来发生;
锁存器和触发器是底层具体的物理单元

寄存器(register):是用于暂时存放参与运算的数据和运算结果值。具体来说:在实际的数字系统中,通常把能够用来存储一组二进制代码的同步时序逻辑电路称为寄存器。寄存器常用触发器来构建;一个触发器能够存储一位二进制码,因此N个触发器的时钟端口连接起来能构成存储N位二进制的寄存器;

从寄存功能角度看:寄存器和锁存器的功能是相同的;

锁存器和寄存器区别:锁存器是电平触发,而触发器(寄存器)是clk边沿触发。锁存器在不锁存数据时,输出随输入变化;但一旦数据锁存时,输入对输出不产生任何影响。在设计中,基本是要绝对的避免综合产生锁存器

1.2 锁存器的危害

1.对毛刺敏感:使能信号有效时,输出状态随输入多次变化,容易产生空翻,不能异步复位;在上电后处于不确定状态;
2.STA静态时序分析复杂:锁存器没有时钟参与,无法做STA,综合工具会将latch优化掉,造成前仿后仿结果不一致,因此静态时序分析困难;
3.资源消耗:在FPGA中,由于FPGA是由查找表和触发器组成的,生成锁存器需要消耗更多资源;但是在IC中,若是锁存器和寄存器都是由与非门搭建的话,锁存器消耗资源更少;在ASIC设计中,除了CPU(高速电路)或者RAM(面积敏感)这类电路,一般绝不提倡使用锁存器;

1.3 如何避免产生锁存器

1.组合逻辑:若是组合逻辑,组合逻辑的语句完全不适用always语句块,就可以保证综合器不会综合出锁存器;
2.基于always语句块(类wire型和真reg型):信号必须要求是reg型,但是综合后是否是reg型还是latch型,是不一定的;
不可简单看if-else,缺少else; case-default,缺少default;
在这里插入图片描述

Vivado综合电路
在这里插入图片描述

修改如下,避免产生latch:
在这里插入图片描述

可以把右边形式的称为"类wire"形;类wire型
–类wire型:要想避免产生latch,就一定要避免“自己等于自己”这种情况;
–真reg型:即使if没有else,case没有default,也是不会产生latch;在else缺失的情况下,寄存器的值保持不变,相当于缺省"q<=q",reg是不怕自己等于自己的;
所以下面这种情况也会产生latch;

always @(*) beginif(~enable) beginout1 = 1'b0;end else beginout1 = out1;end
end

总结:无论是真reg型还是wire型,都心里有意识:if-else,case-default都要写全,这也是一个良好的代码意识,但同时也意识到当review别人代码时,缺省也是对的
组合逻辑中,不完整的 if - else 结构及case-default,会产生 latch

2 手撕题:边沿检测

2.1 边沿检测(上升沿、下降沿、双边沿)

2.1.1 波形图

在这里插入图片描述

2.1.2 算法步骤

边沿检测的核心思想是“打拍子+逻辑运算”;
上升沿检测:din & ~din_r
下降沿检测:din_r & ~din;
双边沿检测:上面两个做或运算;

2.1.3 代码

//=======================================
//--Author  : colonel
//--Date    :11—29
//--Module  : edge_check
//--Function: check a edge including: posedge,negedge,both clk
//=======================================
module edge_check (
//==========================< 端口 >=========================input wire clk,input wire rst_n,input wire din,output wire edge_pos,output wire edge_neg,output wire edge_both
);
//==========================< 信号 >=========================
reg     din_r;//=========================================================
//-- din_r: flip_flop
//=========================================================
always @(posedge clk or negedge rst_n) beginif (!rst_n) begindin_r <= 1'b0;end else begindin_r <= din;end
end//=========================================================
//-- edge_pos,edge_neg,edge_both
//=========================================================
assign edge_pos = din & ~din_r;
assign edge_neg = ~din & din_r;
assign edge_both= edge_pos | edge_neg;endmodule

2.2 序列模三检测器

2.2.1 描述

描述:输入口是1bit,每次进来一位数据,检查当前序列是否能整除3,能则输出1,否则输出0.
例如:
序列=1,out=0;
序列=11,out=1;
序列=110,out=1;
序列=1101,out=0;
输入表:
在这里插入图片描述

2.2.2 波形图

在这里插入图片描述

2.2.3 代码

//=======================================
//--Author  : colonel
//--Date    :11—29
//--Module  : sequence_modulo3_detector
//--Function: Detect if the input signal sequence din is a multiple of 3
//=======================================
module seq_mod3_detec(
//==========================< 端口 >=========================input wire clk,input wire rst_n,input wire din_vld,input wire din,output wire detect
);
//==========================< 参数 >=========================
localparam IDLE = 3'b000;
localparam S0 = 3'b001;
localparam S1 = 3'b010;
localparam S2 = 3'b100;//==========================< 信号 >=========================
reg[4-1:0] sta_cur;
reg[4-1:0] sta_nxt;//=========================================================
//-- FSM-1: state transiate
//=========================================================
always @(posedge clk or negedge rst_n) beginif (!rst_n) beginsta_cur <= IDLE;end else beginsta_cur <= sta_nxt;end
end//=========================================================
//-- FSM-2: state jump condition
//=========================================================
always @(*) begincase (sta_cur)IDLE: begin if(!din_vld) beginsta_nxt = IDLE;end else beginif(din) beginsta_nxt = S0;end else beginsta_nxt = S1;endendendS0: beginif(!din_vld) beginsta_nxt = S0;end else beginif (din) beginsta_nxt = S1;end else beginsta_nxt = S0;endendendS1 : beginif(!din_vld) beginsta_nxt = S1;end else beginif(din) beginsta_nxt = S0;end else beginsta_nxt = S2;endendendS2: beginif(!din_vld) beginsta_nxt = IDLE;end else beginif(din) beginsta_nxt = S2;end else beginsta_nxt = S1;endendenddefault: sta_nxt = IDLE;endcaseend//=========================================================
//-- FSM-3: state action
//=========================================================
reg mod3_res;always @(posedge clk) beginif(!rst_n)beginmod3_res <= 1'b0;end else begincase (sta_cur)IDLE: mod3_res <= 1'b0; S0: mod3_res <= 1'b1; S1: mod3_res <= 1'b0; S2: mod3_res <= 1'b0;default: mod3_res <= 1'b0;endcaseend
end//=========================================================
//-- detect
//=========================================================
assign detect = mod3_res;endmodule

注意:以上代码已经过编译无error,但未经过testcase测试

[ref]
1.https://blog.csdn.net/aa666888io89/article/details/119646663
2.https://www.runoob.com/w3cnote/verilog-latch.html
3.https://blog.csdn.net/qq_42622433/article/details/138186418

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

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

相关文章

使用 Docker Compose 将数据版 LobeChat 服务端部署

LobeChat 是一个基于 TypeScript 的开源聊天机器人项目&#xff0c;支持本地部署和接入多个大语言模型。本文介绍如何使用 Docker Compose 将 LobeChat 服务端及其数据库部署到生产环境&#xff0c;让您拥有一个私有化的、可定制的 AI 聊天助手。 一、部署前准备 服务器&…

DICOM标准:DICOM服务类详解,了解存储服务类、查询/检索服务类(Q/R Service Class)和工作流管理服务类等原理

目录 一、概述 二、存储服务类&#xff08;Storage Service Class&#xff09; 存储操作&#xff08;C-STORE&#xff09; 确认操作&#xff08;C-STORE-RSP&#xff09; 三、查询/检索服务类&#xff08;Query/Retrieve Service Class&#xff09; 查询操作&#xff08;C…

八,Linux基础环境搭建(CentOS7)- 安装Mysql和Hive

Linux基础环境搭建&#xff08;CentOS7&#xff09;- 安装Mysql和Hive 大家注意以下的环境搭建版本号&#xff0c;如果版本不匹配有可能出现问题&#xff01; 一、Mysql下载及安装 MySQL是一个关系型数据库管理系统&#xff0c;由瑞典MySQL AB 公司开发&#xff0c;属于 Orac…

Virtuoso使用layout绘制版图、使用Calibre验证DRC和LVS

1 绘制版图 1.1 进入Layout XL 绘制好Schmatic后&#xff0c;在原理图界面点击Launch&#xff0c;点击Layout XL进入版图绘制界面。 1.2 导入元件 1、在Layout XL界面左下角找到Generate All from Source。 2、在Generate Layout界面&#xff0c;选中“Instance”&#…

Spring事务的实现方式

前言 Spring的spring-tx模块提供了对事务管理支持&#xff0c;使用Spring事务可以让我们从复杂的事务处理中得到解脱&#xff0c;无需去处理获得连接、关闭连接、事务提交和回滚等这些操作。Spring事务管理是Spring框架提供的一个核心功能&#xff0c;它允许开发者以声明式或编…

线性代数(1)——线性方程组的几何意义

线性代数的基本问题是求解个未知数的个线性方程&#xff1b; 例如&#xff1a;&#xff08;方程1&#xff09;。 在线性代数的第一讲中&#xff0c;我们从Row Picture、Column Picture、Matrix Picture三个角度来看这个问题。 上面的系统是二维的。通过添加第三个变量&#…

没有对象来和我手撕红黑树吧

1. 红黑树的介绍 红黑树也是一种自平衡的二叉搜索树&#xff0c;在每一个节点增加了一个存储位来表示节点的颜色&#xff0c;可以是红色也可以是黑色&#xff0c;通过约束颜色来维持树的平衡&#xff0c;具有以下的性质&#xff1a; 每个节点不是红色就是黑色根节点为黑色如果…

Android中SurfaceView与GLSurfaceView 的关系

SurfaceView 与 GLSurfaceView 的关系 在 Android 开发中&#xff0c;SurfaceView 和 GLSurfaceView 是实现自定义渲染效果的关键组件。它们提供了不同的渲染方式&#xff0c;适用于不同的应用场景。我们将通过以下几个方面详细说明 SurfaceView 和 GLSurfaceView 的特点及实现…

DEVOPS: 容器与虚拟化与云原生

概述 传统虚拟机&#xff0c;利用 hypervisor&#xff0c;模拟出独立的硬件和系统&#xff0c;在此之上创建应用虚拟机是一个主机模拟出多个主机虚拟机需要先拥有独立的系统docker 是把应用及配套环境独立打包成一个单位docker 是在主机系统中建立多个应用及配套环境docker 是…

H7-TOOL的LUA小程序教程第16期:脉冲测量,4路PWM,多路GPIO和波形打印(2024-10-25, 更新完毕)

LUA脚本的好处是用户可以根据自己注册的一批API&#xff08;当前TOOL已经提供了几百个函数供大家使用&#xff09;&#xff0c;实现各种小程序&#xff0c;不再限制Flash里面已经下载的程序&#xff0c;就跟手机安装APP差不多&#xff0c;所以在H7-TOOL里面被广泛使用&#xff…

西瓜书《机器学习》符号表KaTex表示

写这篇post的缘故是最近整理机器学习的相关公式&#xff0c;经常要用到 KaTeX \KaTeX KATE​X, 但网络上搜索到的西瓜书符号表的表示有些并不准确或不严谨&#xff0c;本着严谨治学的态度&#xff0c;整理了一下符号表的 KaTeX \KaTeX KATE​X表示&#xff0c;希望有所帮助,整理…

docker的安装配置与基本简单命令

目录 1.docker简介 2.docker安装 2.1使用root用户登陆 更新yum源 2.2安装依赖 2.3设置yum源 更新yum源索引 2.4安装docker 2.5启动并且设置开机自启动 2.6验证安装是否成功 2.7配置docker加速器 2.8重启docker服务 3.docker简单使用 3.1下载镜像 3.2列出…

从线性代数到unity mvp矩阵

坐标变换&#xff1a;矩阵是一种线性空间变换的描述&#xff08;矩阵的列向量&#xff0c;是坐标变换后的基向量&#xff09;。 如: 如上图,即向量(-1,2)在经过由基底x轴:(1, -2) ,y轴:(3, 0)组成的矩阵变换后得到向量(5,2) 实际上就是-1倍的x轴:(1, -2)加上2倍的y轴:(3,…

线程同步 线程安全

这里写目录标题 线程安全互斥锁**互斥锁初始化****互斥锁加锁和解锁****销毁互斥锁****互斥锁死锁****互斥锁的属性** 条件变量条件变量初始化通知和等待条件变量条件变量的判断条件 自旋锁自旋锁初始化自旋锁加锁和解锁 读写锁读写锁初始化读写锁上锁和解锁读写锁的属性 线程安…

使用Python和OpenCV实现火焰检测

使用Python和OpenCV实现火焰检测 项目解释&#xff1a; 此 Python 代码是使用 OpenCV、线程、声音和电子邮件功能的火灾探测系统的简单示例。 以下是它的功能的简单描述&#xff1a; 导入库&#xff1a;代码首先导入必要的库&#xff1a; cv2&#xff1a;用于图像和视频处理…

蓝桥杯基本算法~~~一维/二维前缀和问题

文章目录 1.一维前缀和2.二维前缀和3.移动零问题4.颜色的分类问题 1.一维前缀和 问题说明&#xff1a;一维就是表示的是一维数组的计算&#xff0c;我们的这个一维前缀和是基于这个一维数组进行计算的&#xff1b; 什么是前缀和&#xff1a;就是10 20 30 40 50这个数组&#…

ubuntu20.04系统安装

文章目录 前言参考1 一、准备工作1、进入BIOS&#xff0c;设置 UEFI/Legacy Boot选项 为UEFI2、进入BIOS界面将Secure Boot禁用3、USB启动为enable 二、单系统安装1、插入U盘&#xff0c;电脑正常开机后 总结 前言 装了很多次ubuntu系统&#xff0c;整理一篇自己的文章很费时间…

JS | CommonJS、AMD、CMD、ES6-Module、UMD五种JS模块化规范

目录 前言 一、CommonJS 模块化规范 二、ES6 模块化规范 三、AMD 模块化规范 四、CMD 模块化规范 五、UMD模块化规范 前言 这三个规范都是为Js模块化加载而生的&#xff0c;使模块能够按需加载&#xff0c;使系统同庞杂的代码得到组织和管理。模块化的管理代码使多人开发…

【宠物狗狗数据集】 犬类品种识别 宠物狗检测 深度学习 目标检测(含数据集)

一、背景意义 随着人们对宠物狗的喜爱日益增加&#xff0c;犬种的多样性也逐渐受到重视。狗狗不仅是家庭的好伴侣&#xff0c;更在多个领域中发挥着重要作用&#xff0c;如导盲、搜救、疗愈等。因此&#xff0c;准确识别和分类各种犬种显得尤为重要。传统的犬种识别方法往往依赖…

移远通信闪耀2024香港秋灯展,以丰富的Matter产品及方案推动智能家居产业发展

10月27-30日&#xff0c;2024香港国际秋季灯饰展在香港会议展览中心盛大开展。 作为全球领先的物联网整体解决方案供应商&#xff0c;移远通信再次亮相&#xff0c;并重点展示了旗下支持Matter协议以及亚马逊ACK ( Alexa Connect Kit ) SDK for Matter方案的Wi-Fi模组、低功耗蓝…