首页 > 其他分享 >锁存器

锁存器

时间:2023-04-02 09:11:30浏览次数:33  
标签:存器 dout FPGA 触发器 视图 rst

一、锁存器

首先设计锁存器的时候应该清楚什么是锁存器,锁存器其实是对电平信号敏感的,一定信号是电平敏感的,和时钟边沿clk无关。

所以用verilog描述的时候,应该是:

always @(a,b,e)
begin
if(e)
dout<=a;
end

产生锁存器的原因是因为各条件分支对dout的赋值不全,在else分支内没有对dout操作,这样就会造成锁存器。

实际综合后的RTL视图,可以看到综合后出现了锁存器latch

 

 

 

 

 

而从Technology Map View可以看出该锁存器的结构:

 

 

 

 

实际从FPGA逻辑资源实现上采用了逻辑门实现的,可见FPGA内部一般是没有锁存器这样的单元的。

二、触发器

首先明白触发器敏感信号时时钟边沿, 在Verilog中表述是这样的

复制代码
always@(posedge clk or negedge rst_n)
begin
    if(~rst_n)
        dout1<=1'b0;
    else if(e)
        dout1<=a;
    else 
        dout1<=b;
end
复制代码

其RTL视图为一个触发器:

 

 

而从Technology Map View可以看出FPGA内部实际是有触发器资源的。

 

 

 

  

三、避免锁存器

在(一)中可以看到对于dout分支不全造成了锁存器。下面再分析一例程序

复制代码
reg  dout,dout1,dout2 ;     
always@(posedge clk or negedge rst_n)  
begin  
    if(~rst_n)  
        dout1<=1'b0;  
    else if(e)  
        dout1<=a;  
    else   
        dout1<=b;  
end   
always@(a,b,e)   
begin  
    if(e)  
    begin  
        dout2<=a;   
    end  
    else  
    begin  
        dout<=b;  
 
    end  
end 
复制代码

RTL视图为:包含两个锁存器和一个触发器。

分析:虽然下面的alway里分支都有(if else都有)但是每个分支只对其中一个寄存器赋值,再另一分支中没有再对相应寄存器赋值。

所以对于dout2和dout都形成了锁存器。

 

 

 

再看Technology Map View视图:

分析:图中下面两个位锁存器的结构,可以看出,锁存器是有反馈回路的逻辑电路,如图中标红的线为反馈信号。

 

 

 

为了尽量避免锁存器,改为触发器,修改语句:

复制代码
always@(posedge clk or negedge rst_n)  
begin  
    if(~rst_n)  
        dout1<=1'b0;  
    else if(e)  
        dout1<=a;  
    else   
        dout1<=b;  
end   
always@(posedge clk )   
begin  
    if(e)  
    begin  
        dout2<=a;  
    end  
    else  
    begin  
        dout<=b;  
 
    end  
end
复制代码

 

图示为修改后的RTL视图,把分支赋值全了,可以看到锁存器没有了,变成了触发器

 

 


再看Technology Map View视图:

分析:锁存器消失

 

 

 

缺点:时序分析较困难。

 

不要锁存器的原因有二:

1、锁存器容易产生毛刺,

2、锁存器在ASIC(专用集成电路)设计中应该说比ff(触发器)要简单,但是在FPGA的资源中,大部分器件没有锁存器这个东西,所以需要用一个逻辑门和ff

来组成锁存器,这样就浪费了资源。(用CPLD(复杂可编程逻辑器件)和FPGA(现场可编程逻辑阵列)来进行ASIC设计是最为流行的方式之一)

 优点:面积小。锁存器比FF快,所以用在地址锁存是很合适的,不过一定要保证所有的latch信号源的质量,锁存器在CPU设计中很常见,正是由于它的应用使得

CPU的速度比外部IO部件逻辑快许多。latch完成同一个功能所需要的门较触发器要少,所以在asic中用的较多。

标签:存器,dout,FPGA,触发器,视图,rst
From: https://www.cnblogs.com/force-assign/p/17279910.html

相关文章

  • 寄存器
    寄存器(Register)是计算机中的一种数据储存单元,它用来临时保存指令或数据。寄存器的操作速度非常快,比内存和外存等其他存储器的访问速度都要快得多。寄存器有多种类型,例如通用寄存器、特殊寄存器、程序计数器等,在不同的计算机架构和处理器中会有一些差异。通用寄存器是最常见的寄存......
  • LabVIEW | 知识点:移位寄存器
    移位寄存器循环结构里(while、for)常常用到移位寄存器,作为暂存数据的一种很有效的方式(移位寄存器可以存任何类型的数据)。如下图,上面循环对移位寄存器进行过初始化,下面的循环未......
  • 控制寄存器(Cr0-Cr3)
    控制寄存器(CR0~CR3)用于控制和确定处理器的操作模式以及当前执行任务的特性。CR0中含有控制处理器操作模式和状态的系统控制标志;CR1保留不用;CR2含有导致页错误的线性地址;......
  • 朱有鹏:寄存器修改指定位或多个不连续位,左移<< 设置特定二进制数
    一:设置连续,特定位为1问:假设要有一组32位的二进制数,要修改其中3~7bit位的位为1(其他位为0),该如何写?答:推算: 7-3+1(第7位减去第3位,加1是公式必须这样这么写,先获取要......
  • 寄存器修改指定位不影响其他位, 位与&、位或|、位异或^
    一、位与&(位清零用)位与特点:任何数(0或1),和1,位与无变化;和0,位与变成0真值表: 1&1=1   0&0=0  1&0=0   0&1=0代码:#include<stdio.h>intmain(void){u......
  • 什么是寄存器和存储器?寄存器与存储器有何区别?
    中央处理器CPU是单片机的核心,主要用来解译单片机指令以及处理计算机数据,内部结构大致可以分为控制单元、逻辑运算单元和存储单元三个部分,存储器和寄存器在计算机中起着不可......
  • 汇编 标志寄存器 ZF/PF/SF/CF/OF标志 adc/sbb/cmp指令 pushf和popf 检测比较结果
    标志寄存器CPU内部的寄存器中,有一种特殊的寄存器(对于不同的处理机,个数和结构都可能)具有以下3中作用。用来存储相关指令的某些执行结果。用来为CPU执行相关指令提供行为依据......
  • 关于OV5640的重要寄存器配置问题
    最近在做ZYNQ的图像处理的学习,一直用的导入图片的方式进行了,现在想用摄像头试试真实的情况,总结一下几个重要寄存器的配置问题最重要的当然输出的图像分辨率,下面是输出图......
  • 常见寄存器与汇编指令
    学习ctf中RE模块必须掌握的寄存器通用寄存器32位16位作用EAX(累加器)AX作用于操作数和结果的数据EBX(基址寄存器)BXDS段中的数据指针ECX(计数器)CX用......
  • stm32f407探索者开发板(十七)——串口寄存器库函数配置方法
    文章目录​​一、STM32串口常用寄存器和库函数​​​​1.1常用的串口寄存器​​​​1.2串口相关的库函数​​​​1.3状态寄存器(USART_SR)​​​​1.4数据寄存器(USART_D......