大家好,又见面了,我是全栈君。
首先应该明确锁存器和触发器也是由与非门之类的东西构成。尤其是锁存器,虽说数字电路定义含有锁存器或触发器的电路叫时序电路,但锁存器有很多组合电路的特性。
组合电路就是一个真值表,一个函数,一组输入对应一组输出,当前什么输入就根据函数得到什么输出,实时跟踪变化,这样也就容易有冒险、竞争之类的问题产生毛刺。
锁存器:电平敏感
always @ (enable)
??if (enable) ?q <= d;
那就是说,在enable有效的时间内,q完全跟踪d的值,比如在这个时间内d变化了,q跟着变化,当enable失效的时候,q存储d最后的值。
触发器:我们把输出只在时钟某个时刻变化的玩意儿叫触发器。边沿敏感
always @ (posedge enable)
??if (enable) q <= d;
这个便是一个d触发器。只在enable(一般大家都叫它clock)的上升沿q采样d,而且在每个时钟的上升沿都会采样。
在fpga中一般避免用latch,因为在FPGA中触发器资源丰富,不用白不用,latch由于是电平触发的,相对触发器来说容 易产生毛刺,电路不稳定.
latch的优点是完成同一个功能所需要的门较触发器要少,所以在asic中用的较多
?
那最后再说寄存器,寄存器这个玩意儿是一个概念层次的东西,1个寄存器就是能存1bit数据的东西。既可以用触发器实现也可以用锁存器实现。以触发器为例,由于触发器每个时钟上升沿都会采样,所以触发器会有一个反馈逻辑,当load有效的时候才会采样d,否则保持不变。
always @ (posedge clk or negedge rst_n)
if (!rst_n)
q <= 0;
else if (load)
q <= d;
这便就是一个寄存器了。
(2)寄存器的输出端平时不随输入端的变化而变化,只有在时钟有效时才将输入端的数据送输出端(打入寄存器),而锁存器的输出端平时总随输入端变化而变化,只有当锁存器信号到达时,才将输出端的状态锁存起来,使其不再随输入端的变化而变化
可见,寄存器和锁存器具有不同的应用场合,取决于控制方式以及控制信号 和数据之间的时间关系:若数据有效一定滞后于控制信号有效,则只能使用锁存器;数据提前于控制信号而到达并且要求同步操作,则可用寄存器来存放数据。
转载于:https://www.cnblogs.com/ly0019/p/8520648.html
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/107676.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...