针对时序逻辑电路和组合逻辑电路,如果有信号发生变化,那么它们相对于整个电路的时钟clk是如何的呢?要不要考虑clk呢?
主要仿真了一下几个语句
//时序逻辑电路
always@(posedge clk or negedge rst)
这个是典型的时序逻辑电路,当括号的敏感信号变化时,always的语句块才会执行;这里的执行条件是复位信号有复位 或者 在时钟信号的上升沿到来。是严格和clk信号对齐的。
同步时序电路设计中需要注意的是,当外部有一个异步输入信号发生改变时,如果我们在clk的上升沿去采这个信号,然后保存到寄存器中,那么这个信号至少要保存一个clk的时钟周期。
如上图所示,最上面的是clk信号,第3行是外部输入的异步信号,信号从1变成0,是在clk的一个随机时刻发生的,在下一个clk的上升沿,保存到寄存器中,也就是下面的波形。
如果信号从1变成0,然后又很快的变成了1,那么再下一个clk的上升沿将不会采集到这个变为0的信号了,如下仿真波形。
如上图所示,clk的时钟周期是20ns,但是这个变化的低脉冲只持续了5ns,因此在下一个clk上升沿的时候,采集到的电平还是1,就丢失了这个低电平信号。这种就会导致同步信号失败。
//组合逻辑电路
assign
举个例子:assign d = c;
注意这里的赋值表达式,用的是阻塞赋值的“=” ,这个是组合逻辑专用的符号。这里当信号c变化时,d是立即跟着变化的,不会考虑当前的时钟clk在哪里,是不是在上升沿什么的。统统不考虑,只要c变化,d立马跟着变。
//组合逻辑电路
always@(*)
当always后面的敏感信号,只是电平敏感信号时,及输入信号的值发生改变,那么就会执行下面语句块中的内容,同样是不考虑clk到哪里了,这个和assign是一样的
附上测试仿真工程:可自行测试
链接:https://pan.baidu.com/s/1wrGS3jjQ7TMuaqvS0NcgDA
提取码:pa0b