教程 - 编写组合和顺序代码
使用 VHDL 进程或 Verilog Always Blocks
本教程展示了如何编写包含在 Process 中的 VHDL 或 Verilog 块 或始终阻止 分别。流程(VHDL)和Always Blocks(Verilog)是基础,需要很好地理解。它们的行为方式完全相同,因此在这里为您介绍两者,如果您现在只学习一种语言,请注意针对该特定语言的示例。进程或 Always Blocks 主要用于两个场景:
- 定义一个组合的块 逻辑
- 定义一个顺序的块 逻辑
第一种情况是教科书中向新生介绍流程或始终块时常见的情况。它在这里为您呈现,让您意识到它的存在。但实际上,用于定义组合逻辑块的 Process/Always 块在“真实世界”代码中的出现频率远低于用于定义顺序逻辑的 Process/Always 块。
您可能会问自己的第一个问题是组合逻辑和顺序逻辑之间的区别是什么?组合(或组合)逻辑是不需要时钟来操作的逻辑。前面的与门的例子是一个组合例子。顺序逻辑是需要时钟来操作的逻辑。时序逻辑最基本的构建块是 D 触发器(如下图所示)。
D触发器!如果您不了解 D 触发器的工作原理,请立即停止阅读!在继续阅读之前,您需要了解触发器是如何在 FPGA 中使用的。可以了,好了?不错。
VHDL中的组合过程:
process (input_1, input_2) begin and_gate <= input_1 and input_2; end process;
Verilog 中的组合总是阻塞:
always @ (input_1 or input_2) begin and_gate = input_1 & input_2; end
在上面的 VHDL 和 Verilog 代码中,input_1 和 input_2 位于所谓的敏感列表中 .敏感度列表是所有将导致进程/始终阻止执行的信号的列表。在上面的示例中,对 input_1 或 input_2 的更改将导致 Process/Always 块执行。这个 process/always 块接受两个输入,对它们执行“与”操作,并将结果存储在信号 and_gate 中。这与这段代码的功能完全相同:
-- VHDL: and_gate <= input_1 and input_2;
// Verilog: assign and_gate = input_1 & input_2;
这两个代码示例的目的相同:分配信号和门。不同之处在于一个在组合过程/始终阻止中,而另一个不在。因此,由于不使用组合的 Process/Always Block 也可以实现相同的结果,因此我不建议初学者以这种方式使用这些语句。
可以使用 Process 或 Always Block 的第二种方式(以及更有趣的示例)是定义一个顺序逻辑块。同样,时序逻辑是有时钟的逻辑。
VHDL