跳转至

组合环、组合电路和时序电路

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语言中,每条语句在执行完毕后立即停止,程序会顺序执行下一条语句,这种执行方式是逐步进行的。

还有什么差别?

并行性 也是硬件描述语言特有的特征。

例如执行

a = m + 1; 
b = n + 1; 
c = a + b;

在Verilog中,行 ab 的计算可以并行进行,而 c 的计算则依赖于 ab 的值。

graph LR
    C[c = a+b]
    A[a = m+1] -->C
    B[b = n+1] -->C

相对而言,C语言的执行是串行的。每条语句在执行完毕后,程序才会继续执行下一条语句。即先算a,再算b,最后计算c。

graph LR
    C[c = a+b]
    A[a = m+1]
    B[b = n+1] 
    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: 要么是来源于其他寄存器经过组合电路计算出的稳定结果,要么是来源于外界的长期稳定的结果.