vivado进行rtl仿真时,数据和时钟同时跳变,是取变化前还是后的值?

计算赋值号右手边的信号时,所有的变量值均是触发沿到来前的值,更新的赋值号左手边的信号作为触发沿后的值,并且保持到下一个触发沿到来时候,等待更新。这样,就可以使得在同一个块中非阻塞赋值语句不必要求出现的顺序,都是在全部进行赋值号右手边的信号计算后同时更新赋值号左手边的信号的值。非阻塞赋值可以简单的认为 是赋予下一状态的值。

根据仿真测试是取变化之前的值。

下图addra和write_en的关系为时钟上升沿来到时write_en为1时addra增加1

通过波形图可以看到在第二个箭头对应的上升沿时才采集到write_en为高电平,addra才会增加1.

但是下面这段程序出现的问题是:

串口接收图像数据时,这个模块作用是将接收到的字节拼接成16位,并产生ram的写信号,所以是接收两个字节时产生一个write_en,data_cnt是接收字节计数器,每次rx_done有效时增加1,然后write_en和addra(写地址)触发条件一样,为什么会在两个时刻产生判决?这个涉及到我之前的疑惑,即信号在上升沿采集时数据刚好发生了变化,那么是采集变化之前的还是变化之后的数据进行操作?图中箭头指向write_en的时刻,要想write_en产生变化,那么data_cnt采集的是变化之前的数据--data_cnt[0]=1,然而图中指向addra的时刻,要想addra产生变化,data_cnt应该采集变化之后的值,即dara_cnt[0]=1,为什么会产生这样的结果?

没搞清楚。

关掉仿真再跑他居然又对了,离离原上谱,啥都没改。。


 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值