【IC每日一题】

news2024/11/27 12:42:44

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 @(*) begin
	if(~enable) begin
		out1 = 1'b0;
	end else begin
        out1 = 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) begin
    if (!rst_n) begin
        din_r <= 1'b0;
    end else begin
        din_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) begin
    if (!rst_n) begin
        sta_cur <= IDLE;
    end else begin
        sta_cur <= sta_nxt;
    end
end

//=========================================================
//-- FSM-2: state jump condition
//=========================================================
always @(*) begin
    case (sta_cur)
        IDLE: begin 
            if(!din_vld) begin
                sta_nxt = IDLE;
            end else begin
                if(din) begin
                    sta_nxt = S0;
                end else begin
                    sta_nxt = S1;
                end
            end
        end
        S0: begin
            if(!din_vld) begin
                sta_nxt = S0;
            end else begin
                if (din) begin
                    sta_nxt = S1;
                end else begin
                    sta_nxt = S0;
                end
            end
        end
        S1 : begin
            if(!din_vld) begin
                sta_nxt = S1;
            end else begin
                if(din) begin
                    sta_nxt = S0;
                end else begin
                    sta_nxt = S2;
                end
            end
        end
        S2: begin
            if(!din_vld) begin
                sta_nxt = IDLE;
            end else begin
                if(din) begin
                    sta_nxt = S2;
                end else begin
                    sta_nxt = S1;
                end
            end
        end
        default: sta_nxt = IDLE;
    endcase

end

//=========================================================
//-- FSM-3: state action
//=========================================================
reg mod3_res;

always @(posedge clk) begin
    if(!rst_n)begin
        mod3_res <= 1'b0;
    end else begin
        case (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;
        endcase
    end
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.coloradmin.cn/o/2227933.html

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

相关文章

端到端自动驾驶模型SparseDrive论文阅读笔记

为了进一步的理解模型&#xff0c;方便对模型进行调试&#xff0c;对论文进行了详细的阅读&#xff0c;记录了相关的笔记&#xff0c;和论文阅读批注。 论文阅读批注连接&#xff1a; https://note.youdao.com/s/VC6mDgdZ 笔记如下图&#xff1a;

(11)(2.1.6) Hobbywing DroneCAN ESC(一)

文章目录 前言 1 连接和配置 2 参数说明 前言 具有 CAN 接口&#xff08;including these&#xff09;的业余 ESC 支持 DroneCAN&#xff0c;它允许自动驾驶仪通过 CAN 控制 ESC /电机&#xff0c;并检索单个转速、电压、电流和温度。 具有 CAN 接口&#xff08;including …

《机器学习by周志华》学习笔记-神经网络-03多层网络学习算法之误差逆传播算法

1、背景 由于多层网络的学习能力比单层感知机要强很多,想要训练多层网络的话,感知机的学习规则显然不使用,需要更强大的学习算法来进行训练。「误差逆传播」算法就是最杰出、最成功的神经网络学习算法之一。 现实世界的业务大多数以来使用该算法进行训练。 2、作用 不仅…

.NET Core WebApi第4讲:控制器、路由

一、控制器是什么&#xff1f; 1、创建一个空的API控制器&#xff1a;TestController.cs 2、里面有一个类叫TestController&#xff0c;把它叫做控制器 因为它继承了ControllerBase类&#xff0c;ControllerBase类里提供了一系列的方法&#xff0c;使得TestController这个类具…

基于Mysql、JavaScript、PHP、ajax开发的MBTI性格测试网站(前端+后端)

源码地址&#xff1a;https://download.csdn.net/download/2302_79553009/89933699 项目简介 本项目旨在构建一个基于MBTI&#xff08;迈尔斯-布里格斯性格分类指标&#xff09;理论的在线平台——“16Personalities”。该平台利用PHP、MySQL、JavaScript等技术栈开发&#xf…

【AI开源项目】FastGPT- 快速部署FastGPT以及使用知识库的两种方式!

文章目录 一、FastGPT大模型介绍1. 开发团队2. 发展史3. 基本概念 二、FastGPT与其他大模型的对比三、使用 Docker Compose 快速部署 FastGPT1、安装 Docker 和 Docker Compose&#xff08;1&#xff09;. 安装 Docker&#xff08;2&#xff09;. 安装 Docker Compose&#xff…

SpringBoot- 查看Maven依赖API文档

在 Maven 中查看某个依赖的所有 API 文档&#xff0c;最常见的方式是通过添加 Javadoc 并使用 IDE 自动集成查看&#xff0c;或者直接访问 Maven 仓库网站。以下是详细的步骤&#xff1a; 1. 使用 Maven Dependency Plugin 下载 Javadoc 可以通过 mvn dependency:resolve 命令…

macOS Sonoma 14.7.1 (23H222) Boot ISO 原版可引导镜像下载

macOS Sonoma 14.7.1 (23H222) Boot ISO 原版可引导镜像下载 2024 年 10 月 28 日&#xff0c;Apple 智能今日登陆 iPhone、iPad 和 Mac。用户现可借助 Apple 智能优化写作&#xff0c;为通知、邮件和消息生成摘要&#xff0c;体验交互更自然、功能更丰富的 Siri&#xff0c;使…

Nginx+Lua脚本+Redis 实现自动封禁访问频率过高IP

1 、安装OpenResty 安装使用 OpenResty&#xff0c;这是一个集成了各种 Lua 模块的 Nginx 服务器&#xff0c;是一个以Nginx为核心同时包含很多第三方模块的Web应用服务器&#xff0c;使用Nginx的同时又能使用lua等模块实现复杂的控制。 &#xff08;1&#xff09;安装编译工具…

[Linux] linux 软硬链接与动静态库

标题&#xff1a;[Linux] linux 软硬链接与动静态库 个人主页水墨不写bug &#xff08;图片来源于网络&#xff09; /** _oo0oo_* o8888888o* 88" . "88* (| -_- |)* …

VSCode 设置环境变量(WSL 2)

环境&#xff1a;openEuler、Windows 11、WSL 2、python 3.12.3 背景&#xff1a;使用vscode连接Windows 的Linux子系统&#xff0c;开发python项目&#xff0c;获取环境变量失败 时间&#xff1a;20241029 说明&#xff1a;使用os.environ获取不到变量&#xff0c;设置/etc…

控制台安全内部:创新如何塑造未来的硬件保护

在 Help Net Security 的采访中&#xff0c;安全研究人员 Specter 和 ChendoChap 讨论了游戏机独特的安全模型&#xff0c;并强调了它与其他消费设备的不同之处。 他们还分享了对游戏机安全性的进步将如何影响未来消费者和企业硬件设计的看法。 斯佩克特 (Specter) 是本周在阿…

13.音乐管理系统(基于SpringBoot + Vue)

目录 1.系统的受众说明 ​​​​​​​ 2 需求分析 2.1用例图及用例分析 2.1.1 用户用例图及用例分析 2.1.2 管理员用例图及用例分析 2.2 系统结构图和流程图 2.2.1 音乐播放器的系统流程图&#xff08;图2.2.1-1&#xff09; 2.2.2 系统功能表&#xff08;表2.2.2…

TiDB体验一在单机上模拟部署TiDB生产环境集群

TiDB整体架构 TiDB集群主要包括三个核心组件&#xff1a;TiDB Server&#xff0c;PD Server和TiKV Server。 TiDB Server&#xff1a;SQL 层&#xff0c;对外暴露 MySQL 协议的连接 endpoint&#xff0c;负责接受客户端的连接&#xff0c;执行 SQL 解析和优化&#xff0c;最终生…

Conditional DETR论文笔记

原文链接 [2108.06152] Conditional DETR for Fast Training Convergencehttps://arxiv.org/abs/2108.06152 原文笔记 What 《Conditional DETR for Fast Training Convergence》 这个工作也是针对于DETR Query的工作 用于解决DETR训练收敛慢&#xff08;Object query需要…

在Excel中如何快速筛选非特定颜色

Excel中的自动筛选是个非常强大的工具&#xff0c;不仅可以筛选内容&#xff0c;而且可以筛选颜色&#xff0c;例如筛选A列红色单元格。但是有时希望筛选除了红色之外的单元格&#xff08;下图右侧所示&#xff09;&#xff0c;其他单元格的填充色不固定&#xff0c;有几种颜色…

C语言中的位操作

第一章 变量某位赋值与连续赋值 寄存器 | 值 //例如&#xff1a;a 1000 0011b a | (1<<2) //a 1000 0111 b 单独赋值 a | (3<<2*2) // 1011 0011b 连续赋值 第二章 变量某位清零与连续清零 寄存器 & ~&#xff08;&#xff09; 值 //例子&#xff1a;a …

微信小程序scroll-view吸顶css样式化表格的表头及iOS上下滑动表头的颜色覆盖及性能分析

微信小程序scroll-view吸顶css样式化表格的表头及iOS上下滑动表头的颜色覆盖及性能分析 目录 微信小程序scroll-view吸顶css样式化表格的表头及iOS上下滑动表头的颜色覆盖及性能分析 1、iOS在scroll-view内部上下滑动吸顶的现象 正常的上下滑动吸顶覆盖&#xff1a; iOS及iPa…

详细分析Pytorch中的transpose基本知识(附Demo)| 对比 permute

目录 前言1. 基本知识2. Demo 前言 原先的permute推荐阅读&#xff1a;详细分析Pytorch中的permute基本知识&#xff08;附Demo&#xff09; 1. 基本知识 transpose 是 PyTorch 中用于交换张量维度的函数&#xff0c;特别是用于二维张量&#xff08;矩阵&#xff09;的转置操…

#PCIE#基础知识分解之 CC/SRNS/SRIS 时钟架构

参考资料为PCIe Base Spec和CEM Spec。 1.1 时钟架构分类 PCIe参考时钟的三种架构&#xff1a; Common Refclk (Shared Refclk) ArchitectureData Clocked Rx ArchitectureSeparate Refclk Architecture 下面&#xff0c;我们来简单地聊一聊前面说到的三种参考时钟架构&…