微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 这样也算是锁存器吗?

这样也算是锁存器吗?

时间:10-02 整理:3721RD 点击:
代码如下:(其中counter是5位的,从0到26循环计数;A0是一位的;

  1.         always @(posedge clk or negedge rst)
  2.                 if(!rst)
  3.                         A0=0;
  4.                 else if(counter==0)
  5.                         A0=~A0;

复制代码


生成的RTL图如下:



可见,图片右上方的触发器中有一个使能端,即生成了锁存器;
如果把代码改为:

  1.         always @(posedge clk or negedge rst)
  2. if(!rst)
  3. A0=0;
  4. else if(counter==0)
  5. A0=A0+1;

复制代码


那么RTL图如下:



可见上图中不存在使能端,即没有锁存器生成;
可以这样理解吗?
锁存器的标准与危害到底是什么?

不是锁存器


RTL图所示的不是锁存器,
只是你这样的写法确实有可能产生锁存器,
一般如果有if,那么最后最好加上else,养成这样的习惯。
我一般理解为时序逻辑一般不会产生锁存器,
组合逻辑会产生锁存器,出现未考虑全面的条件时,就会产生。
比如,if或者case,没有写全所有的可能情况,
就会产生锁存器,所以最好加上else或者default。

两个都不算锁存器.
你的if语句里面还有个隐含条件,如果counter!=0 ,那么应该是什么输出?保留原值?要保留原值那就必须有一个en信号了

因为你有always@(posedge clk),带了时钟端口的,不会生成锁存器

这样写容易产生锁存器

时序逻辑不会出现latch,只有组合逻辑里面才有可能。
latch有可能会造成仿真结果和实际上板结果不一致。

带使能端,不代表会得到latch,做下去试试就好了
另外,先把“=”改成“<=”

哪只眼看到锁存器了?
那是带有使能端的DFF罢了

latch是活在组合逻辑的世界中的



   非常感谢~我一直 =有一个问题,挺多人强调在时序逻辑中使用非阻塞型的赋值,但是我觉得这个得根据实际情况来看吧。如果在一个always语句中只对一个reg型变量进行赋值,那么无所谓是阻塞还是非阻塞。   另外我是这个认为的:在时序电路中,一般而言使用非阻塞赋值是错不了的;在组合电路中,无所谓使用哪种。
   不知您如何看待。

推荐时序非阻塞、组合阻塞的一个原因在于,这样做可以使仿真行为和实际动作行为最大可能的一致
减少因为语言、语法带来的人为影响
P.S. verilog虽然相对要求灵活,但是基本的语法还是要遵守的,要不然会编译告错的



是否可以如此理解:1、在时序逻辑电路中,是不存在锁存器的,因为触发器本身就带有使能端,因此在if else语句中可以语句不充分;
2、在组合逻辑电路中,需要避免锁存器,但是有一个问题我一直不解:
   

  1. module latch1(cnt,a,b,c);
  2. input [1:0] cnt;
  3. input a,b;

  4. output reg c;

  5. always @(cnt or a or b)
  6. begin
  7. case(cnt)
  8. 2'b00:c=a;
  9. 2'b01:c=b;2‘b10:c=1;
  10. endcase
  11. end
  12. endmodule

复制代码


在以上的程序中,当cnt为2’b11时,c不改变原值,但是这种情况下如何才能使综合后的结果中不会出现锁存器呢?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top