always块中的非阻塞赋值问题

jshzp 2020-09-12 05:10:22
下面的代码在系统时钟sys_CLK上升沿触发的always块中,使用了非阻塞赋值将B的值付给A:


always @(posedge sys_CLK)
A<=B;


如果在系统时钟sys_CLK相邻的两次上升沿之间,B的值从0变成了1,即上一次上升沿时刻B还是0,而下一次上升沿之前,B已经变成了1。
那么在“下一次上升沿”时刻,A的值是0还是1?请解释原因,别简单的回复0或1。谢谢指教!
...全文
32750 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ace919 2020-09-26
  • 打赏
  • 举报
回复
A值是1。事实上,在下一个时钟的上升沿之前,要求B必须已完成变化,且已稳定,因为触发器需要建立时间Tsetup。而且在时钟上升沿之后,B还要保持当前值很小一段时间,这是触发器要求的保持时间Thold
jshzp 2020-09-14
  • 打赏
  • 举报
回复
引用 3 楼 zgl7903 的回复:
https://www.cnblogs.com/chengqi521/p/7920326.html

虽然这个帖子没有直接回答问题,但是它把阻塞非阻塞的概念解释得很清楚,帮助我加深了理解。谢谢版主!
jshzp 2020-09-14
  • 打赏
  • 举报
回复
引用 4 楼 worldy 的回复:
A的值会是sys_CLK 上升沿前瞬间B的值,

所谓非阻塞是指A<=B;这条语句及后面的的语句是同时执行

比如
always @(posedge sys_CLK)
A<=B
C<=A

非阻塞: C的值不会等于B的值,而是在时钟上升之前瞬间A的值(因为非阻塞是同时进行的)
阻塞:C的值会等于B值

感谢回复!
“是在时钟上升之前瞬间A的值”,这么说,信号B相对于系统时钟sys_CLK如果是异步的,那么我题目中的问题,除非B在时钟上升沿之前足够早的时间就变为高电平,否则,A的值就是不确定的了。因为理论上存在这种情况:已经取了B的值后,B才变为高电平,然后时钟上升沿才到达。我理解的对吗?
worldy 2020-09-14
  • 打赏
  • 举报
回复
A的值会是sys_CLK 上升沿前瞬间B的值, 所谓非阻塞是指A<=B;这条语句及后面的的语句是同时执行 比如 always @(posedge sys_CLK) A<=B C<=A 非阻塞: C的值不会等于B的值,而是在时钟上升之前瞬间A的值(因为非阻塞是同时进行的) 阻塞:C的值会等于B值
worldy 2020-09-14
  • 打赏
  • 举报
回复
引用 5 楼 jshzp 的回复:
[quote=引用 4 楼 worldy 的回复:]A的值会是sys_CLK 上升沿前瞬间B的值, 所谓非阻塞是指A<=B;这条语句及后面的的语句是同时执行 比如 always @(posedge sys_CLK) A<=B C<=A 非阻塞: C的值不会等于B的值,而是在时钟上升之前瞬间A的值(因为非阻塞是同时进行的) 阻塞:C的值会等于B值
感谢回复! “是在时钟上升之前瞬间A的值”,这么说,信号B相对于系统时钟sys_CLK如果是异步的,那么我题目中的问题,除非B在时钟上升沿之前足够早的时间就变为高电平,否则,A的值就是不确定的了。因为理论上存在这种情况:已经取了B的值后,B才变为高电平,然后时钟上升沿才到达。我理解的对吗?[/quote] 是的,你可以看所有数字电路的时序,都要求时钟到来之前,数据线的数据要稳定
壶中日月小 2020-09-14
  • 打赏
  • 举报
回复
说的专业一点,如果B满足建立时间和保持时间要求,那么A的值就是B的值,即1
zgl7903 2020-09-13
  • 打赏
  • 举报
回复
非阻塞赋值 一般的会加入D触发器, 因此输出的结果会滞后一个时钟周期

jshzp 2020-09-13
  • 打赏
  • 举报
回复
引用 1 楼 zgl7903 的回复:
非阻塞赋值 一般的会加入D触发器, 因此输出的结果会滞后一个时钟周期

谢谢回复!
会把“上一次”还是“下一次”的上升沿时刻对应的B的值加入D触发器呢?

6,125

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 硬件设计
社区管理员
  • 硬件设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧