前言
这是我第二次刷HDLBits的题,第一次是刚接触FPGA时,为了快速入门Verilog,第一次刷题跟着B站视频刷的,但是现在发现没有很大的用处,个人感觉还是有一点Verilog基础后,再来刷HDLBits会好一点,虽然很多人说这上面的题都很简单,但是还是值得刷一遍,里面几乎涵盖了Verilog的所有常用语法,并且还可以尝试用不同方法解同一道题。
代码以下是我写的每道题的代码和思路
// 单bit半加器
module top_module(
input a, b,
output cout, sum );
assign {cout,sum} = a+b;
endmodule
// 单bit全加器
module top_module(
input a, b, cin,
output cout, sum );
assign {cout,sum} = a + b + cin;
endmodule
//=============================================
// 多bit全加器
// 方法一:使用单bit全加器例化
module top_module(
input [2:0] a, b,
input cin,
output [2:0] cout,
output [2:0] sum );
adder_1bit adder_1bit_inst_1(
.a(a[0]),
.b(b[0]),
.cin(cin),
.cout(cout[0]),
.sum(sum[0]) );
adder_1bit adder_1bit_inst_2(
.a(a[1]),
.b(b[1]),
.cin(cout[0]),
.cout(cout[1]),
.sum(sum[1]) );
adder_1bit adder_1bit_inst_3(
.a(a[2]),
.b(b[2]),
.cin(cout[1]),
.cout(cout[2]),
.sum(sum[2]) );
endmodule
module adder_1bit(
input a, b, cin,
output cout, sum );
assign {cout,sum} = a + b + cin;
endmodule
// 方法二: 推荐
assign {cout[0],sum[0]} = a[0]+b[0]+cin;
assign {cout[1],sum[1]} = a[1]+b[1]+cout[0];
assign {cout[2],sum[2]} = a[2]+b[2]+cout[1];
//=============================================
module top_module (
input [3:0] x,
input [3:0] y,
output [4:0] sum);
wire [2:0] cout;
FA FA_1(
.a(x[0]),
.b(y[0]),
.cin(),
.cout(cout[0]),
.sum(sum[0]) );
FA FA_2(
.a(x[1]),
.b(y[1]),
.cin(cout[0]),
.cout(cout[1]),
.sum(sum[1]) );
FA FA_3(
.a(x[2]),
.b(y[2]),
.cin(cout[1]),
.cout(cout[2]),
.sum(sum[2]) );
FA FA_4(
.a(x[3]),
.b(y[3]),
.cin(cout[2]),
.cout(sum[4]),
.sum(sum[3]) );
endmodule
module FA(
input a, b, cin,
output cout, sum );
assign {cout,sum} = a + b + cin;
endmodule
//=============================================
// 补码判断溢出位
//判断方法-最高位:正+正=负、负+负=正
module top_module (
input [7:0] a,
input [7:0] b,
output [7:0] s,
output overflow
);
assign s = a + b;
assign overflow = (a[7] & b[7] & !s[7])|(!a[7] & !b[7] & s[7]);
endmodule
module top_module(
input [99:0] a, b,
input cin,
output cout,
output [99:0] sum );
assign {cout,sum} = a + b + cin;
endmodule
module top_module (
input [15:0] a, b,
input cin,
output cout,
output [15:0] sum );
wire cout_1_2;
wire cout_2_3;
wire cout_3_4;
bcd_fadd bcd_fadd_inst_1(
.a(a[3:0]),
.b(b[3:0]),
.cin(cin),
.cout(cout_1_2),
.sum(sum[3:0]) );
bcd_fadd bcd_fadd_inst_2(
.a(a[7:4]),
.b(b[7:4]),
.cin(cout_1_2),
.cout(cout_2_3),
.sum(sum[7:4]) );
bcd_fadd bcd_fadd_inst_3(
.a(a[11:8]),
.b(b[11:8]),
.cin(cout_2_3),
.cout(cout_3_4),
.sum(sum[11:8]) );
bcd_fadd bcd_fadd_inst_4(
.a(a[15:12]),
.b(b[15:12]),
.cin(cout_3_4),
.cout(cout),
.sum(sum[15:12]) );
endmodule
module top_module(
input [15:0] a, b,
input cin,
output cout,
output [15:0] sum );
wire [2:0] cout_temp;
bcd_fadd bcd_1(a[3:0],b[3:0],cin,cout_temp[0],sum[3:0]);
bcd_fadd bcd_2(a[7:4],b[7:4],cout_temp[0],cout_temp[1],sum[7:4]);
bcd_fadd bcd_3(a[11:8],b[11:8],cout_temp[1],cout_temp[2],sum[11:8]);
bcd_fadd bcd_4(a[15:12],b[15:12],cout_temp[2],cout,sum[15:12]);
endmodule