寄存器对时钟的上升沿和复位的下降沿敏感。对时钟的下降沿不敏感,当下降沿来时,寄存器输出的Q值仍然保持不动。可以将时钟上升沿和复位下降沿看成两个事件,当这两个事件中任意一个发生后,先看复位信号是不是0,若是,则Q值不论原来是什么,都会立即变成0,若不是,则Q将寄存当前D的值。上例时序逻辑中的!rst_n,可以写为~rst_n,或rst_n==0,没有严格要求。
一般会使用时钟上升沿来驱动寄存器,若想使用时钟下降沿触发的寄存器,则可将敏感列表中posedge clk改为negedge clk。同时支持上升沿和下降沿的触发器是较为罕见的,普通设计仅在这两种沿中二选一。在工作中也会遇到使用两种沿的电路,称为双沿触发,但那是指整个电路,而非一个触发器是双沿的。整个电路的双沿,可以是前一级寄存器采用上升沿触发,其Q端连接的另一个寄存器采用下降沿触发。在设计中最常用的电路设计是单沿触发,而且是上升沿触发,即整个电路中的所有触发器全部是上升沿触发的。这样用的原因是设计简单,不需要查某个寄存器是上升沿触发还是下降沿触发,因而不容易出错。对于同样的功能需求,双沿触发需要的时钟慢,但要求时钟是50%占空比,而单沿触发,对时钟的要求快一倍,但对时钟形状的要求降低很多。
复位信号rst_n,以0电平作为复位电平,1电平解复位,是通用标准,很少有反过来使用的。原因是,数字电路的复位信号是模拟电路给的,通常,模拟电路将其命名为POR(Power On Reset),即上电复位信号。芯片刚通电时,电压小,逐渐上升到要求的电压,例如1.8V,POR本质上是一个电压上升的标志,模拟电路放一个比较器,将输入电压与0.9V比较,电压小于0.9V,POR为0,电压大于0.9V,POR为1。因而复位信号上电时总是先0后1,数字寄存器需要在复位信号为0的阶段保持复位态,不能运行,因为此时芯片电压不足,不能保证正常运行,而复位信号变成1,说明上电完毕,电压充足,寄存器解除复位进行正常运行是安全的。
需要特别澄清的是语句negedge rst_n,直接意思是复位信号的下降沿,即该寄存器对复位信号的下降沿敏感。笔者长期以来也认为既然语法表达是这样,那应该就是当复位信号表现出下降沿时,即从1变为0时,才会触发Q的动作。如图2—5所示,在rst_n的下降沿,Q值恢复为复位态。
图2—5 寄存器复位和恢复的时序
这样一来,就产生了一个问题,在芯片刚上电时,复位信号一直为0,随着芯片上电完成,复位信号逐渐从0变为1。整个过程没有下降沿,是否意味着Q端在芯片上电后不处于复位状态,而是处于不定态?经过仿真和与模拟工程师进行确认,笔者发现复位信号对寄存器的作用不是通过信号沿来驱动的,而是通过电平来驱动,它更像组合逻辑而非时序逻辑。如图2—6所示,只要rst_n为0,即使没有下降沿,寄存器都处在复位态,因此,语句negedge rst_n对学习者有误导作用。读者在写时序逻辑时仍然需要这样写,但心里要清楚寄存器复位的实际原理。
图2—6 芯片上电时寄存器输出的状态变化
在本例中,Q值的初始值为0,读者可以根据需要写成0或1。初值为0或1,对应两种不同的触发器。