Xilinx的官方代码库入口

Tools下面有一个Language Templates选项
模板界面(包括解码器 case语句等等 状态机是state-machine)

之前以为FSM是状态机的简写,但是其实FSM是Finite-state machine(有限状态机)


"="和"<="的区别

这两种赋值方式的区别即为Verilog中阻塞和非阻塞赋值的区别

阻塞赋值,顾名思义,即在一个always块中,后面的语句会受到前面语句的影响,即阻塞赋值是一种顺序执行的关系。

比如:

module test
(
input a,
output reg c
);
reg b;
always @(*)
begin
b = 1b0;
b = a;
c = b;
end
endmodule

  • 在上升沿来的时候,a赋值给b,执行完成后,b再赋值给c,整个代码执行完时,a=c。
上面程序的RTL电路映射结构

非阻塞赋值中,我们需要了解触发器的工作原理。再时钟到来的时候,触发器会将输入端的数据打到输出端,这是受时钟节拍控制的。

比如

module test
(
input a,
output reg c
);
reg b;
always @(*)
begin
b = 1b0;
b <= a;
c <= b;
end
endmodule // test

上面程序的RTL电路映射

非阻塞赋值是由时钟节拍决定,再时钟上升沿到来时,执行赋值语句右边,然后将begin-end之间的所有赋值语句时赋值到赋值语句的左边。(注:是begin-end之间的所有语句,一起执行,且一个时钟只执行一次。)

总结:

  1. 在时序逻辑的描述里,使用「非阻塞赋值」(个人理解:因为时序电路会限制时序 所以可以使用非阻塞赋值)。
  2. 锁存器(latch)建模,使用「非阻塞赋值」。
  3. 组合逻辑,使用「阻塞赋值」。
  4. 在同一个always块中既有组合逻辑又有时序逻辑时,使用「非阻塞赋值」。
  5. 组合逻辑输出时,为了消除毛刺,会在输出端加一个触发器,即使用非阻塞赋值。

推荐阅读:
相关文章