最近一直在学习FPGA编程的思想,如何才能让自己摆脱C语言,做到眼中代码,心中电路,这是我最近一直在思考的问题。读了一下锆石科技的FPGA硬件语法篇后,我发现了很多自己平时写Verilog时没有注意到的地方,带有C语言影子的地方,在这里总结一下,希望自己在日后写Verilog时不要再犯了
摆脱C语言!!!
1.三段式状态机
图来自锆石科技。
可见,对于状态机的状态编码,我们应该使用格雷码,还记得数电课老师说格雷码一次只改变一位,一直不知道有什么用,现在真的是恍然大悟!这样可以避免毛刺,避免因为两位变化不同步而进入错误状态!
然后对于三段式状态机
第一段:时序逻辑,使当前状态变为下一状态
第二段:组合逻辑,根据条件改变下一状态
第三段:组合逻辑,根据状态条件写输出
然后使用一个D触发器来寄存输出值,这一点下文会讲
2.使用D触发器来寄存值,使时序逻辑和组合逻辑分开
在Verilog中,时序电路用非阻塞赋值 <= ,组合逻辑使用阻塞赋值 = ,当电路较大时,容易分不清楚导致时序混乱,