VerilogHDL组合逻辑的编码可以从三个不同抽象层实现,这些抽象层是描述同一种硬件的不同方式。从具体到抽象的程度,可以分为gate、dataflow、behavior三种,其中gate级描述了硬件实际搭建的过程,dataflow级描述实际的逻辑门控数据的流动方式,behavior描述的是电路实际行为方式。可以根据用户实际喜好实现三种方式用于描述您的设计,下面我们还将看看这三种抽象层次所实现代码的差异。
抽象层
Verilog HDL 允许我们在三个不同的抽象层次上描述硬件。这些抽象层分别是:
门级建模 gate
在这一层次,HDL(Hardware Description Language,HDL)描述实际的逻辑门及其连接方式。这种建模方式适合简单的电路,但在设计复杂电路时不够实用。
数据流级建模 dataflow
在这一层,描述电路中的数据流动。数据流建模通过使用逻辑运算符将电路转化为布尔逻辑句子。这种方法更加高效,但仍然是对电路行为的具体描述。
行为级建模 behavior
这是一个更高的抽象层次,通过过程块(如 always 块)来描述电路的行为。这种方式使得设计复杂电路变得更加简单,因为我们只需描述电路的功能,而不需要具体的逻辑门。
具体实例
下面我们将通过一个具体的实例来说明这三种抽象层次各种的风格。
选用的实例是一个简单的2选1mux组合电路作为说明。
2 选 1 多路复用器( M U X )是一个选择器, 2选1多路复用器(MUX)是一个选择器, 2选1多路复用器(MUX)是一个选择器,
它根据选择输入( X )从两个输入( A 和 B )中选择一个输出( C ) 它根据选择输入(X)从两个输入(A和 B)中选择一个输出(C) 它根据选择输入(X)从两个输入(A和B)中选择一个输出(C)
其电路图如图:
逻辑表达式为:
C = X ⋅ A + X ‾ ⋅ B C= X\cdot A+ \overline{X} \cdot B C=X⋅A+X⋅B
这里的逻辑意义是:
当 X为 1 时,输出 C等于输入 A的值。
当 X为 0 时,输出 C等于输入 B的值。
真值表:
选择信号 X | 输入 A | 输入 B | 输出 C |
---|---|---|---|
0 | 0 | 0 | 0 |
0 | 0 | 1 | 1 |
0 | 1 | 0 | 0 |
0 | 1 | 1 | 1 |
1 | 0 | 0 | 0 |
1 | 0 | 1 | 0 |
1 | 1 | 0 | 1 |
1 | 1 | 1 | 1 |
// Gate Level MUX 2-to-1
module mux2to1_gatelevel(input a, b, x, output c);
wire not_x;
wire out_and_a, out_and_b;
not not1(not_x, x);
and and1(out_and_a, a, x);
and and2(out_and_b, b, not_x);
or or1(c, out_and_a, out_and_b);
endmodule
使用基础逻辑门(NOT、AND、OR)实现了多路复用器。
not_x 是 x 的反相,out_and_a 和 out_and_b 是两个 AND 门的输出,分别对应于输入 a 和 b 经过选择信号 x 的与运算。
最后,通过一个 OR 门将两个 AND 门的输出合并,得出最终输出 c
// Dataflow Level MUX 2-to-1
module mux2to1_datalevel(input a, b, x, output c);
assign c = (a & x) | (b & ~x);
endmodule
c 的值由 a 和 b 根据选择信号 x 通过位与(AND)和位或(OR)运算得到。
这种方式简洁明了,便于理解。但需要对于新入门的选手不太友好。
// Behavioral Level MUX 2-to-1
module mux2to1_behavioral(input a, b, x, output reg c);
always @(*) begin
if (x)
c = a;
else
c = b;
end
endmodule
使用 always @(*) 语句时,表示该块