可编程逻辑/Verilog Always 和 Initial
此页面将介绍 Verilog 关键字always 和initial
always 块可以是同步或异步结构。这些结构中的指令被称为与给定条件同步发生,或者异步发生(如果未指定条件)。
Initial 块可以在可综合或不可综合的块中使用。它们通常用在测试平台中。Initial 块会导致某些指令在模拟开始时执行,在任何其他指令操作之前。Initial 块只操作一次。
可综合的 initial 块可用于设置 FPGA 中寄存器、RAM 和 ROM 的上电值。但是,initial 块不能在 CPLD 或 ASIC 中综合。
Always 块描述了应该无限期重复的事情,或者应该在给定的同步条件下重复的事情。没有条件的 always 块是异步的
always begin ... end
这块代码将连续执行,无论电路的时钟信号如何。
硬件模块不能在 always 块内实例化。模块中所有的 always 块都被认为是并行的硬件块。同样,模块被认为是并行操作的独立硬件块。但是,函数可以在 always 块内实例化。
一个线或寄存器不能被多个 always 块写入。但是,一个 wand 或 wor 可以被多个块写入。它分配值给
always @ 结构是同步条件结构。它采用以下形式
always @(<condition> <signal>)
其中 <condition>
可以是posedge、negedge 或省略。<signal>
参数是要同步的信号(通常是时钟信号)。例如,如果我们希望在每个时钟脉冲的正边沿执行特定的代码块,我们将编写
always @(posedge clock)
如果我们不放入 posedge 或 negedge 限定符,always 块将在每次变化(信号的每个正边沿和负边沿)时触发。例如
always @(clock)
将在时钟信号的正边沿和负边沿执行。
Always 块可以被认为是电路结构,其中该电路的输入由一个锁存器控制。触发 always 块的事件被认为是锁存器的时钟输入。只有当锁存器的触发输入接收到正确的条件时,电路才会接收新的输入。
关键字posedge 和negedge 是边沿触发条件,只与always 块一起使用。