如何理解电平敏感的透明锁存器概念呢?
最近在学夏宇闻老师的《verilog数字系统设计教程》,在always电平敏感信号中提到了电平敏感的透明锁存器的概念,不甚理解,所以想请教下下论坛里的朋友。这里,引用新浪博客一个网友的帖子。http://blog.sina.com.cn/s/blog_4cfafddd0100een4.html
文章中关于这个问题作了一些探讨。想与大家再交流下。谢谢!
附上帖子:(***帖子内容*** 非小编原创)
***************************************************************
组合逻辑电路的设计,在谈到always电平敏感信号列表时,网上有的说:
“
在赋值表达式右端参与赋值的所有信号都必须在always @(敏感电平列表)中列出,always中if语句的判断表达式必须在敏感电平列表中列出。如果在赋值表达式右端引用了敏感电平列表中没有列出的信号,在综合时将会为没有列出的信号隐含地产生一个透明锁存器。这是因为该信号的变化不会立刻引起所赋值的变化,而必须等到敏感电平列表中的某一个信号变化时,它的作用才表现出来,即相当于存在一个透明锁存器,把该信号的变化暂存起来,待敏感电平列表中的某一个信号变化时再起作用,纯组合逻辑电路不可能作到这一点。综合器会发出警告。
”
这句话是错的!而事实的真相应该是这段话:
“
敏感信号列表出现在always块中,其典型行为级的含义为:只要敏感信号列表内的信号发生电平变化,则always模块中的语句就执行一次,因此设计人员必须将所有的输入信号和条件判断信号都列在信号列表中。有时不完整的信号列表会造成不同的仿真和综合结果,因此需要保证敏感信号的完备性。在实际的PLD 器件开发中,EDA 工具都会默认将所有的输入信号和条件判断语句作为触发信号,增减敏感信号列表中的信号不会对最终的执行结果产生影响,因此如果期望在设计中通过修改敏感信号来得到不同的逻辑,那就大错特错了。当敏感信号不完备时,会使得仿真结果不一样,这是因为仿真器在工作时不会自动补充敏感信号表。如果缺少信号,则无法触发和该信号相关的仿真进程,也就得不到正确的仿真结果。
”
必须将所有的输入信号和条件判断信号都列在信号列表中
有一种输入方式是:
always@(*)
begin
....
end
此时,综合工具和仿真工具会自动将所有的敏感信号自动加入敏感信号列表。
***************************************************************
我以前用verilog写过锁存器并综合出了结果。建议小编看看介绍数字电路基础的书籍,比如拉贝的透视。如果能够明白锁存器究竟是怎么工作的,理解verilog描述就很容易了。
在很多常见的电路中,锁存器是不希望出现的,更多使用的是DFF。但在某些场合下,锁存器也可以构成流水线去计算数据。
小编的意思是说,敏感信号列表不全,仿真可能不对,但综合出的电路都是一样的。
这是我引用的帖子中的观点,我本人没有太多的经验,所以不太确定,向您请教来着。
谢谢您的回复,刚好手头貌似有这本书,我去看看学习下。
不知道,但一般都写成always@*,简单保险。
电平敏感的透明锁存器,其实就是D锁存器。D latch。当clk为高时,输出跟随输入D的变化而变化。
恩。这样做是很保险。就是抠到一些细节的地方时,还是不太明白。哎。
那,我还有一个问题想要请教您。always @(...) 括号中为电平信号时,比如 a or b or c,意味着a或b或c发生变化就触发这个过程块。abc的变化可能是0到1或者1到0,不像锁存器响应一个电平,或者触发器响应一个边沿。那么我的问题是,always @(a or b or c)在综合时是怎么样的电路呢?如何实现在abc变化时触发always块?
锁存器出现很多时候是这样,always@(。) if(a)。, 我建议你如果是设计纯组合逻辑,就用always@(*),如果刻意设计锁存器,直接调用stdcell。
这里,大家谈到了两个问题:
1. 敏感列表
2. 锁存器
首先,目前的综合工具的确可以补全敏感列表,但是会造成前仿和后仿的不一致,那么到底是前仿是设计者想要的结果呢?还是后仿呢?
接着,锁存器是在电平触发的代码中,不完备的判断条件上,被综合工具映射出来的
最后,多谈一点,不管写什么代码,至少设计者自己需要明确其映射的逻辑单元,这是电路不是软件
谢谢你的回答。另外,想请教一点,always @(a or b or c) ,响应abc的变化,高到低或者低到高,那么综合出来是怎么样的电路呢?这里既不是响应边沿always @(posedge ...)的触发器,也不是响应高电平或者低电平if(a) or if(!a)的锁存器,那么综合成的电路是如何的呢?是响应每个变量的两个边沿吗?
谢谢你的回答!
好好好好
好好好好
组合逻辑电路
首先,我认为你需要补充下基础知识,否则迟早会出现不该有的错误
什么是电平触发?我这里也不跟你讲了,希望你能搜索相关资料学习下了
组合逻辑电路。电平触发。明白了,谢谢你的回答,我居然把一些基础的知识给忽略了。
确实是组合逻辑电路,现在明白了。多谢!
您好,对于综合后的问题,还有个小疑问,希望能够请教您一下,麻烦您了!
这是书上的一个例子程序段:
input a, b;
reg e,d;
always @(a or b)
beign
e = d & a & b;
end
因为d没有在敏感电平列表中,所以d变化时,e不能立刻变化,要等到a或b变化时才体现出来。也就是说,实际上相当于存在一个电平敏感的透明锁存器在起作用,把d信号的变化锁存其中。这本是一个组合逻辑电路,却出现了一个不该有的锁存器,那么,综合后,对于锁存d信号的锁存器的ENA信号是什么呢?
就是能映射出锁存器,也是RS-锁存器
实际上,请参考我之前11#的答复
谢谢您的回答! 对于此,还是不太明白。