组合环、组合电路和时序电路
PB22111665 胡揚嘉
组合环
代码如下:
always@(*) begin
if(en) begin
if(sel) begin
a = initial + 1;
end
else begin
a = a + 1;
end
end
else begin
a = 0;
end
end
如图所示的带有组合环的组合电路。
现在我们研究初始化initial之后,sel = 0
的情况
有电路图:
不妨假设sel
有效10s,而选择与加法完成计算需要0.5s。
显然,在任何时间内,我们无法得到一个稳定的值(实际上延时是以ns来计算的,每x ns就会变化一次)
而这就是最基础的组合环。
同时这体现了组合电路与C语言指令的不同:
组合电路
Verilog生成的是实际的电路,它是一直存在的,它始终处于活动状态,依据输入信号实时通过逻辑门产生输出。
而在C语言中,每条语句在执行完毕后立即停止,程序会顺序执行下一条语句,这种执行方式是逐步进行的。
还有什么差别?
并行性 也是硬件描述语言特有的特征。
例如执行
在Verilog中,行 a
和 b
的计算可以并行进行,而 c
的计算则依赖于 a
和 b
的值。
相对而言,C语言的执行是串行的。每条语句在执行完毕后,程序才会继续执行下一条语句。即先算a,再算b,最后计算c。
如何实现out = out + 1?
前面提到,当输入不稳定时,输出也会随之不稳定波动。所以得到稳定输出的核心是稳定的输入
思考:对initial的要求是什么? 答案见最后。
利用寄存器
always@(posedge clk) begin
if(en) begin
if(sel) begin
a <= initial + 1;
end
else begin
a <= a + 1;
end
end
end
有电路图:
实际得到的信号为:
可以看到假如每个时钟是1s,我们在每个时钟上升沿开始0.2s能够得到稳定的输出。而新的时钟上升沿采集到的输入一定是稳定的.
思考:对initial的要求是什么?
A: 要么是来源于其他寄存器经过组合电路计算出的稳定结果,要么是来源于外界的长期稳定的结果.