【HDLBits刷题】Hadd.

Create a half adder. A half adder adds two bits (with no carry-in) and produces a sum and carry-out.

Expected solution length: Around 2 lines.

1、第一种,利用拼接括号

module top_module( 
    input a, b,
    output cout, sum );
    assign {cout,sum} = a + b;

endmodule

从上面可以看出来,{}拼接既可以用在赋值语句右侧,也可以用在赋值语句左侧。

2、第二种, 分开得出:

module top_module( 
    input a, b,
    output cout, sum );
    //assign {cout,sum} = a + b;
    assign cout = a&b;
    assign sum = a^b;

endmodule

``` module wallace(x,y,out); //定义模块,输入x、y,输出out parameter size = 4; //定义参数size为4 input [size-1:0] x,y; //定义输入端口x、y,长度为size output [2*size-1:0] out; //定义输出端口out,长度为2*size wire [size*size-1:0] a; //定义wire变量a,长度为size*size wire [1:0] b0,b1,c0,c1,c2,c3; //定义wire变量b0、b1、c0、c1、c2、c3,长度为1或2 wire [5:0] add_a,add_b; //定义wire变量add_a、add_b,长度为6 wire [6:0] add_out; //定义wire变量add_out,长度为7 wire [2*size-1:0] out; //定义wire变量out,长度为2*size assign a = {x[3],x[3],x[2],x[2],x[1],x[3],x[1],x[0],x[3],x[2],x[1],x[0],x[2],x[1],x[0],x[0]}&{y[3],y[2],y[3],y[2],y[3],y[1],y[2],y[3],y[0],y[1],y[1],y[2],y[0],y[0],y[1],y[0]}; //将输入的x、y按照Wallace树的规则连接起来,并赋值给变量a hadd U1(.x(a[8]),.y(a[9]),.out(b0)); //定义一个半加器,输入端口为a[8]、a[9],输出端口为b0 hadd U2(.x(a[11]),.y(a[12]),.out(b1)); //定义一个半加器,输入端口为a[11]、a[12],输出端口为b1 hadd U3(.x(a[4]),.y(a[5]),.out(c0)); //定义一个半加器,输入端口为a[4]、a[5],输出端口为c0 fadd U4(.x(a[6]),.y(a[7]),.z(b0[0]),.out(c1)); //定义一个全加器,输入端口为a[6]、a[7]、b0[0],输出端口为c1 fadd U5(.x(a[13]),.y(a[14]),.z(b0[1]),.out(c2)); //定义一个全加器,输入端口为a[13]、a[14]、b0[1],输出端口为c2 fadd U4(.x(b1[0]),.y(a[10]),.z(b1[1]),.out(c3)); //定义一个全加器,输入端口为b1[0]、a[10]、b1[1],输出端口为c3 assign add_a = {c3[1],c2[1],c1[1],c0[1],a[3],a[1]}; //将c3[1]、c2[1]、c1[1]、c0[1]、a[3]、a[1]连接起来,赋值给变量add_a assign add_b = {a[15],c3[0],c2[0],c1[0],c0[0],a[2]}; //将a[15]、c3[0]、c2[0]、c1[0]、c0[0]、a[2]连接起来,赋值给变量add_b assign add_out = add_a + add_b; //将add_a和add_b相加,结果赋值给变量add_out assign out = {add_out,a[0]}; //将add_out和a[0]连接起来,赋值给变量out endmodule module fadd(x,y,z,out); //定义全加器模块,输入x、y、z,输出out output [1:0] out; //定义输出端口out,长度为2 input x,y,z; //定义输入端口x、y、z assign out = x+y+z; //将x、y、z相加,结果赋值给变量out endmodule module hadd(x,y,out); //定义半加器模块,输入x、y,输出out output [1:0] out; //定义输出端口out,长度为2 input x,y; //定义输入端口x、y assign out = x+y; //将x、y相加,结果赋值给变量out endmodule module wallace_tb; //定义测试模块 reg [3:0] x,y; //定义寄存器变量x、y,长度为4 wire [7:0] out; //定义wire变量out,长度为8 wallace m(.x(x),.y(y),.out(out)); //实例化Wallace模块,并连接输入端口和输出端口 initial begin //开始仿真 x=3,y=4; //给输入端口x、y赋值 #20 x=2,y=3; //等待20个时间单位,再给输入端口x、y赋值 #20 x=6,y=8; //等待20个时间单位,再给输入端口x、y赋值 end endmodule ``` 以上代码为Verilog代码,是实现Wallace树的硬件电路。其中包括三个模块:`wallace`、`fadd`和`hadd`。`wallace`模块是实现Wallace树的核心模块,将输入的x、y按照Wallace树的规则连接起来,并使用半加器和全加器进行计算得到结果。`fadd`模块是全加器模块,将输入的x、y、z相加得到结果。`hadd`模块是半加器模块,将输入的x、y相加得到结果。`wallace_tb`模块是测试模块,可以对Wallace树进行仿真测试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值