计算赋值号右手边的信号时,所有的变量值均是触发沿到来前的值,更新的赋值号左手边的信号作为触发沿后的值,并且保持到下一个触发沿到来时候,等待更新。这样,就可以使得在同一个块中非阻塞赋值语句不必要求出现的顺序,都是在全部进行赋值号右手边的信号计算后同时更新赋值号左手边的信号的值。非阻塞赋值可以简单的认为 是赋予下一状态的值。
根据仿真测试是取变化之前的值。
下图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,为什么会产生这样的结果?
没搞清楚。
关掉仿真再跑他居然又对了,离离原上谱,啥都没改。。