跳转到内容

可编程逻辑/Verilog Always 和 Initial

来自维基教科书,开放的书籍,开放的世界

此页面将介绍 Verilog 关键字alwaysinitial

同步和异步

[编辑 | 编辑源代码]

always 块可以是同步或异步结构。这些结构中的指令被称为与给定条件同步发生,或者异步发生(如果未指定条件)。

Initial 块

[编辑 | 编辑源代码]

Initial 块可以在可综合或不可综合的块中使用。它们通常用在测试平台中。Initial 块会导致某些指令在模拟开始时执行,在任何其他指令操作之前。Initial 块只操作一次。

可综合的 initial 块可用于设置 FPGA 中寄存器、RAM 和 ROM 的上电值。但是,initial 块不能在 CPLD 或 ASIC 中综合。

Always 块

[编辑 | 编辑源代码]

Always 块描述了应该无限期重复的事情,或者应该在给定的同步条件下重复的事情。没有条件的 always 块是异步的

always
begin
   ...
end

这块代码将连续执行,无论电路的时钟信号如何。

硬件模块不能在 always 块内实例化。模块中所有的 always 块都被认为是并行的硬件块。同样,模块被认为是并行操作的独立硬件块。但是,函数可以在 always 块内实例化。

一个线或寄存器不能被多个 always 块写入。但是,一个 wand 或 wor 可以被多个块写入。它分配值给

always @ 结构是同步条件结构。它采用以下形式

always @(<condition> <signal>)

其中 <condition> 可以是posedgenegedge 或省略。<signal> 参数是要同步的信号(通常是时钟信号)。例如,如果我们希望在每个时钟脉冲的正边沿执行特定的代码块,我们将编写

always @(posedge clock)

如果我们不放入 posedge 或 negedge 限定符,always 块将在每次变化(信号的每个正边沿和负边沿)时触发。例如

always @(clock)

将在时钟信号的正边沿和负边沿执行。

Always 块可以被认为是电路结构,其中该电路的输入由一个锁存器控制。触发 always 块的事件被认为是锁存器的时钟输入。只有当锁存器的触发输入接收到正确的条件时,电路才会接收新的输入。

边沿触发

[编辑 | 编辑源代码]

关键字posedgenegedge 是边沿触发条件,只与always 块一起使用。

华夏公益教科书