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 @(*) 语句时,表示该块中的代码会在任何输入信号发生变化时执行。当x为1时,c取a,当x为0时,c取b。行为级的编码告诉编译器我们想要的结果,让编译器自己去实现对应电路的逻辑。
无论是门级、数据流级还是行为级实现,这三种不同的编程风格或实现方式都能够实现同样的功能。相信编译器的电路实现,我们可以更加专注于电路设计的高层次问题,而不必纠结于具体实现细节。
编译器可以有效地将我们的行为描述转换为适当的逻辑门或数据流级实现。其优化能力通常优于手动设计,这样可以节省时间并减少错误。
所以一般设计的时候都是通过行为级编码实现,当需要压缩编译器电路实现的资源时,也会通过数据流级的编码。这时是需要对实现的电路非常了解。