Verilog 入门(五)数据流模型化

文章目录

连续赋值用于数据流行为建模;相反,过程赋值用于顺序行为建模。组合逻辑电路的行为最好使用连续赋值语句建模。

连续赋值语句

连续赋值语句将值赋给线网连续赋值不能为寄存器赋值),它的格式如下(简单形式):

assign LHS_target = RHS_expression

连续赋值语句在什么时候执行呢? 只要在右端表达式的操作数上有事件(事件为值的变化)发生时,表达式即被计算;如果结果值有变化,新结果就赋给左边的线网。

下面的例子中,目标是一个向量线网和一个标量线网的拼接结果:

wire Cout, Cin;
wire[3:0] Sum, A, B;
...
assign {
    
    Cout, Sum} = A + B + Cin;

因为 A 和 B 是 4 位宽,加操作的结果最大能够产生 5 位结果。左端表达式的长度指定为 5 位(Cout 1 位,Sum 4 位)。赋值语句因此促使右端表达式最右边的 4 位的结果赋给 Sum,第 5 位(进位)赋给 Cout

下例采用数据流方式描述 1 位全加器:

module FA_Df(A, B, Cin, Sum, Cout);
  input A, B, Cin;
  output Sum, Cout;
  assign Sum = A ^ B ^ Cin;
  assign Cout = (A & Cin) | (B & Cin) | (A & B);
endmodule

时延

如果在连续赋值语句中没有定义时延,如前面的例子,则右端表达式的值立即赋给左端表达式, 时延为 0。如下例所示显式定义连续赋值的时延:

assign #6 Ask = Quiet || Late;

规定右边表达式结果的计算到其赋给左边目标需经过 6 个时间单位时延。

如果右端在传输给左端之前变化,会发生什么呢?在这种情况下,应用最新的变化值。下例显示了这种行为:

assign #4 Cab = Drm;

下图显示了这种变化的效果。右端发生在时延间隔内的变化被滤掉。例如,在时刻 5,Drm 的上升边沿预定在时刻 9 显示在 Cab 上,但是因为 Drm 在时刻 8 下降为 0,预定在 Cab 上的值被删除。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/myDarling_/article/details/134734457