1 向量与标量(vector与scalar)
向量与标量是用于表示单个位或者多个位置的情况
以reg或者wire来说,没有指定其位宽默认为1位宽,是一个标量
定义了其位宽如[7:0]后,变为向量
如题,一条总线,三条独立的输出,、从0取到2
module top_module (
input wire [2:0] vec,
output wire [2:0] outv,
output wire o2,
output wire o1,
output wire o0 ); // Module body starts after module declaration
assign outv = vec;
assign o0 = vec[0];
assign o1 = vec[1];
assign o2 = vec[2];
endmodule
逻辑或,逻辑与,按位与,按位或
逻辑运算产出的结果是布尔值
&&表示逻辑与的意思,即为and。当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false。
&表示按位与操作,我们通常使用0x0f来与一个整数进行&运算,来获取该整数的最低4个bit位,例如,0x31 & 0x0f的结果为0x01。
||表示逻辑或,是逻辑运算符,符号是“||”当两个条件中有任一个条件满足,“逻辑或”的运算结果就为“真”。
|表示按位或,运算符“|”是双目运算符。其功能是参与运算的两数各对应的二进位(也就是最后一位)相或。只要对应的二个二进位有一个为1时,结果位就为1。
2 四出入门four-input gates
Build a combinational circuit with four inputs, in[3:0].
There are 3 outputs:
- out_and: output of a 4-input AND gate.
- out_or: output of a 4-input OR gate.
- out_xor: output of a 4-input XOR gate.
第一个问题在于xor(异或门)
输入量不同为1,其余情况为0
输入量为(3:0)四位输入,要输出或门,与门和异或门
由于输入为四位,在进行门运算时,要对其中四位分别运算即
assign out_and = in[0]&in[1]&in[2]&in[3];
assign out_or = in[0]|in[1]|in[2]|in[3];
assign out_xor = in[0]^in[1]^in[2]^in[3];
再需要注意的是:异或门在编译的过程中用^来表示
同或门 !(A^B)
异或门 ~(A^B)
3 模块的使用
三个线网类型的信号输入输出为ab和out
其运行程序为
top_moudle( input a , input b , output out);
moudle_a (
.in1(a), // Port"in1"connects to wire "a"
.in2(b),
.out(out)
)
enmoudle
可以看到,在模块的端口和信号之间采用的是.端口(信号)的写法
4 32位加法器的构造
module top_module(
input [31:0] a,
input [31:0] b,
output [31:0] sum
);
wire cin;
wire [15:0] sum1,sum2;
wire cout1,cout2;
assign cin = 1'b0;
add16 instance1 (.a(a[15:0]),.b(b[15:0]),.cin(cin),.sum(sum1),.cout(cout1));
add16 instance2 (.a(a[31:16]),.b(b[31:16]),.cin(cout1),.sum(sum2),.cout(cout2));
assign sum = {sum2,sum1};
endmodule
1. 定义了三个`wire`类型的信号`cin`(进位输入信号)、`sum1`和`sum2`(两个16位的求和结果)、`cout1`和`cout2`(两个16位加法器的进位输出)
2. `assign cin = 1'b0;`:这行代码将`cin`初始化为0,表示最低位加法没有来自更低位的进位。
3. `add16 instance1 (.a(a[15:0]),.b(b[15:0]),.cin(cin),.sum(sum1),.cout(cout1));`:这行代码实例化了第一个16位加法器。在这个加法器中,`a[15:0]`和`b[15:0]`是32位输入信号`a`和`b`低16位的切片,`cin`是进位输入(这里是0,因为是最低的16位),`sum1`是16位求和输出,`cout1`是进位输出。
4. `add16 instance2 (.a(a[31:16]),.b(b[31:16]),.cin(cout1),.sum(sum2),.cout(cout2));`:这行代码实例化了第二个16位加法器。它处理输入信号的高16位(`a[31:16]`和`b[31:16]`),将第一个加法器产生的进位`cout1`作为进位输入。`sum2`是这个加法器的求和输出,而`cout2`是进位输出。
5. `assign sum = {sum2,sum1};`:这一行将两个16位加法器的求和结果`sum1`和`sum2`组合起来形成一个32位的求和结果。`{sum2,sum1}`使用了花括号`{}`,这是Verilog中的连接操作符,它将`sum2`(高16位)和`sum1`(低16位)连接起来形成一个32位的输出`sum`。
在这段代码中,如果两个16位加数最低位的加法产生了进位,那么这个进位会传递到高16位的加法操作中(即`cout1`连接到`cin`)。这种设计确保了32位加法操作可以正确处理进位链,即低16位的进位能够影响到高16位的加法结果。最终的`sum`信号就是两个32位数`a`和`b`的加法结果。此外,`cout2`是整个32位加法的最终进位输出,可以用于进一步的级联或进位指示。