Verilog跟C语法有很多相似的地方,很容易犯软件思维的错误。
软件思维(仅指非并发)更多是把问题转换成多个功能模块,按顺序执行,没有严格的时间空间依赖关系,只关心输入输出的值,不关心时间上是否冲突;
硬件思维是把每个模块作为一个电路模块,多个模块共同作用,有严格的时序关系,输入输出不一定同时,也不一定存储下来,有些不能用变量认知。
以厨房做菜为例子。刚开始只有一个厨子,他做菜的流程就是先洗菜,再切菜,最后炒菜,一个流程只做一个菜,这是串行执行程序;为了提升效率,厨子一次多洗几个菜,切菜的同时把锅中水烧热,炒菜的时候用两个锅,交替去炒,这是并发;后来为了开好一个饭店,厨子请了几个小工,洗菜的,切菜的都有人去做,大家需要有序配合,各司其职才能满足食客要求按一定顺序上好一桌菜。
写Verilog代码时,需要把每个信号看做一个模块,除了考虑它的数据依赖,还要注意控制依赖以及时序依赖。
控制信号类型
FPGA控制信号按作用时间可分为 脉冲信号和电平信号。前者通常作为控制信号,往往获取其上升沿或者下降沿,即当这个信号发生某种变化时,被控信号就会发生变化,直到下次发生变化,例如时钟,复位,握手信号等,有效时间在于前后两个时刻值发生了变化;电平信号只需要获取当前信号状态即可,例如读写使能信号,在这个信号为某值的时间段内,被控信号能做某些事。
简单来说一个在于前后时刻发生的变化类型(由低到高或由高到低),另一个是当前时刻的值状态。作为控制信号存在时,前者的是“当某某信号变化时”,后者是“当某某信号为某值时”
信号采集和变化
FPGA信号分为wire型和reg型,都会发生变化,区别在于前者立即发生变化,时间差是物理导线传播时间和硬件运算时间;后者是只有在每个时钟周期到来时变化。
而变化的原因在于信号采集,信号采集是一个瞬时过程,但也需要采集时间
对于a <= b; b <= c; c <= d; 当时钟上升沿发生时,发生如图所示的变化。