HDLbits verilog学习小结

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位加法的最终进位输出,可以用于进一步的级联或进位指示。

  • 14
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值