简单理解Verilog中的赋值过程

44 阅读1分钟

硬件描述语言的特点是所有语句并行执行。

可以这样简单理解,always语句中在时钟开始时,硬件瞬间将时钟沿到达前一时刻的所有值全部记录下来并锁死,然后硬件电路再根据记录下来的值完成所有需要的计算,再在时钟沿到达的一瞬间完成所有赋值。

其原因是无论触发器D端的值如何变化,其Q端的值只有在每个时钟沿到达时才进行更新。

这也就是为什么在时序逻辑中要采用非阻塞赋值,看似顺序执行的两条语句实际上是并行执行的,否则第47行两个寄存器内的值将永远相等,程序将无法正常工作

//内置计数器
always@(posedge clk or negedge rst_n)begin
	if(!rst_n)begin
		key_flag <= 1'b1;	//复位状态时,标志位无效
		cnt <= 20'd0;		//同时清零计数器
	end
	else begin
		key_reg <= key;				//给内部寄存器赋值
			if(key_reg != key)      //*47
				cnt <= CNT_MAX;			//如果检测到不相等则重置计数器
			else begin
				if(cnt > 20'd0)
					cnt <= cnt - 1'b1;	//相等时计数器开始工作
				else
				cnt <= 20'd0;		//一直相等则保持计数器不工作
			end
	end
end