首先,FPGA的代码不是被执行的,而是被综合成电路,begin end之间算是一个小的电路模块。所以其与时钟的关系要具体分析
首先是你定义的变量的类型有关,寄存器型reg 和线性wire两种常用类型中,只有寄存器型才可能一个时钟周期的延迟,效果类似于D触发器。
其次最关键的是begin-end模块之间几个寄存器变量赋值的先后关系是取决于 阻塞型赋值还是非阻塞型赋值。 阻塞型赋值 用 "=" ; 非阻塞赋值用"<=" 。
顾名思义 非阻塞赋值 语句 就是各个 reg型变量之间没有先后关系 在begin end 模块的时钟触发条件满足的时候,各个reg变量是同时进行赋值和运算的;而阻塞赋值语句使得不同的寄存器赋值语句之间按照代码的先后顺序进行赋值,后面的reg变量的赋值将会比前面一行延后一个时钟周期。
最后,值得注意的是 同一个begin end 模块之间不能混用 两种赋值语句,一般而言,时序电路always块中用 非阻塞赋值"<=" ,组合逻辑always块及assign 语句时用 阻塞赋值 "=" 。
比如说begin A<=1'b0;B<=1'b1;end 这两个是同步的,时序图是同时的。FPGA是并行执行的,除非你使用if语句通过计数来进行顺序操作