找回密码
 注册
关于网站域名变更的通知
查看: 154|回复: 1
打印 上一主题 下一主题

【答疑】​关于锁存器问题的讨论

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-2-29 15:57 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
本帖最后由 明德扬FPGA科教 于 2020-2-29 16:19 编辑 ! {) R) V" c) X6 S7 s' ~% g
& e7 a/ n2 i/ i* Q/ m2 s9 ~
关于锁存器问题的讨论+ g/ G: @: t+ g: z) y1 }
- J# m! \7 _. c2 A# r5 |! w
                              
' y" h( Q. ]0 a/ F, a- ~- V上面是两个没有else的代码,其等效于下面的代码。& C1 }, R- H0 j" ^( U
& t! T+ V1 C9 y# h* D  n! F
+ T2 k7 P3 V  x: M9 R
也就是说,当if条件里面没有写else时,默认是表示“保持不变”的意思。
  ?7 E" s: ]$ j/ j1 c. e7 {' {8 B
) v$ E# C* o9 h2 L
$ d% g" G: J: w" G' J: H! K接下来,我们来讨论一下,硬件中是如何实现“保持不变”的。
3 l; v) d1 c! t2 C* ~ : A& Z8 ^* u3 K; R" |+ w) u

0 m% r/ B0 w* E. e
5 d# d# K0 D( J左边是时序时序逻辑的代码,右边是该代码所对应的硬件电路。特别注意图中红色的那个线,那个就是保持不变的“反馈”。由图中可以看出,当时钟上升沿的时候,当选择器的结果赋值给信号b;非上升沿的时候,b一直保持不变,因此红色线在此期间也是保持不变的。当a0的时候,选择器选择当前b的结果,然后在下一个时钟上升沿赋给信号b
9 l6 f2 e8 W% \7 ]6 \* z# P& N3 _+ Y% [由引可见,实现“保持不变”的关键在于D寄存器。
# s# G9 E8 ]. U 4 y4 \# }1 d! i
众所周知,组合逻辑代码是没有D寄存器的,那么它又是如何实现保持不变呢?这个就会用到锁存器了。9 v" ]5 l2 d9 E
. k0 n2 E# G6 t7 k. A

7 y  {$ V5 h9 ^# g4 B5 c" R" e9 Q  
1 J: Y4 ]; B$ L% M7 ?/ \0 E- s  U, p上图左边是组合逻辑代码,右边是其电路。为了让信号b保持不变,就要用到一个叫“锁存器”的器件。当a1时,b就会等于1;当a0时,b会保持不变。
* s) q; U3 z6 M0 ~- \1 ]关于锁存器的危害,可以参考MDY的“大串讲”视频,总之我们知道锁存器是不好东西的,尽量不要有锁存器,也就是说组合逻辑里,要让“if else”条件补全。$ g4 j6 u1 C9 d9 ]! v9 g9 L
3 i5 K. ~  F8 ^0 |) m, x' d7 w
常见问题
+ d$ o, f  F& H3 k/ u1:是不是所有的代码,if else都需要补全呢?1 @( j3 j" r$ V# P% ]
答:如前面所讨论的,对于时序逻辑可以由D寄存器实现“保持不变”,所以时序逻辑是不需要补全的,只有组合逻辑才需要。5 Y" i2 P! G6 n/ w' g

2 s  T6 r6 }! M) K( d+ a' e2:是不是只要组合逻辑的if else补充了,就不会生成锁存器了?: i% b$ Y7 d* n4 k# F+ W) k" u
答:不一定。这里的关键在于“保持不变”,千万不要从“代码层次”来理解,而应该从“功能的层次”来理解,要找准到底有没有“保持不变”。例如,下面的代码,虽然else写上去了,但写不写else都是让b保持不变。所以这仍然会综合出锁存器。
% y# D! C# e% w - e% v8 O( Y2 b# l) ~( E6 @
, ?+ _$ }7 o% y
3:是不是组合逻辑不写else,就一定会生成锁存器?
7 j2 V6 d" ^1 i9 C2 f答:不一定。这里仍然要从是否包括“保持不变”这个功能来分析。如下面代码,假设a1比特信号,其值只有01。那么已经涵盖了所有情况,再不会有其他情况,所以不会出现保持不变的情形,这个时候也不会生成锁存器。; n" A# K; O+ w, G  M8 o% s

; c  {7 S( g; h  T
/ U& l" a  ~8 m# u  K4case不写default,是否会生成锁存器?5 r7 _+ K/ P1 \1 s
答:case不写default,相当于if 条件不写else,其情况分析跟前面3个问题一样,关键在于有没有“保持不变”的功能。
! }6 _& O) h8 L
, K" p# w, k' G/ h. v5:功能上,我一定要实现“组合逻辑的保持不变”功能,该如何做?
+ }; G6 ~. P7 Y; e( j- g答:通常来说,所谓“组合逻辑的保持不变”,是指“该段代码”是组合逻辑写的,但需要与前一个时钟的值保持不变,如下代码,这种需求是很正常的。
. d9 e- z& _! E4 g0 j 5 x# S8 X! T. k$ k, |; ~

$ Z$ g1 e2 P7 s( Y! A- G解决方法,仍然是靠D触发器来实现“保持不变”的功能。只不过是把一个时序逻辑的ALWAYS写法,换成组合逻辑+时钟逻辑的写法而已,代码如下。7 j! E( E) U5 [9 y
8 A$ K. _( z1 z) R$ k8 [
+ y" p8 W. l0 J) c- W& }; G
6:问题5的扩展,我就是要实现组合逻辑的保持,并且小于一个时钟周期的。$ H8 x. U" [# T( a' N2 ?4 G: o
答:不正常需求,FPGA不会这么设计的。
, n# u" m; F3 ] # R1 r7 y  e6 t9 C; i9 D" t
  T' Z) U0 |+ A3 ]' R1 k/ ~, g/ G+ @  Z
! X. {5 R- m, g; @

' D$ S" l3 T# P2 ?" [9 p - R% w& \. T% \$ J

. {0 W4 q+ L8 B- p# ~! D
  • TA的每日心情

    2019-11-29 15:37
  • 签到天数: 1 天

    [LV.1]初来乍到

    2#
    发表于 2020-2-29 16:58 | 只看该作者
    锁存器的讨论
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-8-20 03:02 , Processed in 0.125000 second(s), 26 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表