最近倒腾 FPGA, 以下为个人心得 :
硬件电路分三种 , 纯逻辑电路 , 例如 不带时钟的纯与或门构成的电路 , 比如译码器 , DA 等等 ,
这种电路 在verilog中叫 逻辑电路 , 可以用 assign 或者 always @( clk ) 的方式 来组成 , 注意 , 这里的 clk 是不考虑上下沿的 ,仅仅是电平 , 并且 在电路中只能使用 阻塞 ‘=’ 赋值, 因为你一旦用了 非阻塞‘《=’赋值 , 那么那个寄存器就需要用触发器来锁存了, 虽然这是可以的, 但这就不是 纯逻辑电路了, 已经包含了一些时序 。 在这种电路中, 完全使用阻塞赋值的的寄存器 的值, 在一个时钟周期内 是可以多次赋值的 , 每次赋值 都会改变 寄存器的值, 此时的 寄存器的使用方法和 C语言中的变量一模一样,这个已经验证过了。 但是 用了 非阻塞赋值的寄存器 就不一样的 , 他们的值在当前时钟周期内是固定的, 因为他们是触发器的输出 , 当前周期对此类寄存器的赋值,回到下周期才能读取到, 若是对此值有 多次赋值 , 以最后赋值为准 。
纯时序电路, 这种电路不仅全是 非阻塞赋值, 而且 还考虑了触发条件, 上升沿或者下降沿 , 编写verilog时候要考虑 时间维度 , 与纯逻辑电路完全不一样。 这种条件下的数据在本周起赋值, 在下个周期可获得 。
第三种就是介于二者之间了 。