Verilog HDLBits 第九期:3.1.3 Arithmetic Circuits

目录

 前言

3.1.3.1 Half adder(Hadd)

Solution:

3.1.3.2 Full adder(Fadd)

Solution:

3.1.3.3 3-bit binary adder(Adder3)

Solution:

3.1.3.4 Adder(Exams/m2014 q4j)

Solution:

3.1.3.5 Signed addition overflow(Exams/ece241 2014 q1c)

Solution:

3.1.3.6 100-bit binary adder(Adder100)

Solution:

3.1.3.7 4-digit BCD adder(BCDadd4)

Solution:


 前言

HDLbits网站如下

Problem sets - HDLBits (01xz.net)

从本期开始我们继续HDLbits第三章Circuits的学习,本期的内容是3.1.3Arithmetic Circuits


3.1.3.1 Half adder(Hadd)

创建一个半加器,半加器将两位相加(无进位)并产生一个sum和carry out。

期望的答案长度:2行

Solution:

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

endmodule

3.1.3.2 Full adder(Fadd)

创建一个全加器,全加器将两位相加(包括进位carry in)并产生一个sum和carry out。

期望的答案长度:2行

Solution:

module top_module( 
    input a, b, cin,
    output cout, sum );
    assign cout = a&b | a&cin | b&cin;
    assign sum = a^b^cin;

endmodule

3.1.3.3 3-bit binary adder(Adder3)

现在你知道怎么构建全加器了,例化3个全加器的副本来构建一个3位纹波进位加法器。加法器将2个3位数和一个carry in相加,产生3位总和 和 carry out .为了鼓励您实际实例化全加器,还要输出纹波进位加法器中每个全加器的进位。cout[2] 是最后一个全加器的最终进位,也是你经常看到的进位。

Solution:

module top_module( 
    input [2:0] a, b,
    input cin,
    output [2:0] cout,
    output [2:0] sum );
    fadd add0(a[0],b[0],cin,cout[0],sum[0]);
    fadd add1(a[1],b[1],cout[0],cout[1],sum[1]);
    fadd add2(a[2],b[2],cout[1],cout[2],sum[2]);
endmodule

module fadd(input a,b,cin,
            output cout,sum);
    assign cout = a&b | a&cin | b&cin;
    assign sum = a^b^cin;

endmodule

3.1.3.4 Adder(Exams/m2014 q4j)

实现以下电路:

Solution:

module top_module (
	input [3:0] x,
	input [3:0] y,
	output [4:0] sum
);

	// This circuit is a 4-bit ripple-carry adder with carry-out.
	assign sum = x+y;	// Verilog addition automatically produces the carry-out bit.

	// Verilog quirk: Even though the value of (x+y) includes the carry-out, (x+y) is still considered to be a 4-bit number (The max width of the two operands).
	// This is correct:
	// assign sum = (x+y);
	// But this is incorrect:
	// assign sum = {x+y};	// Concatenation operator: This discards the carry-out
endmodule

这个电路是一个带进位的4位行波进位加法器

而assign sum = x+y; Verilog 加法自动产生进位位。

但是Verilog有一个怪异之处:尽管(x+y)的值包括进位,(x+y)仍然被认为是一个4位数(两个操作数的最大位宽)

而对于连接运算符则会丢弃进位  assign sum = {x+y}; 


3.1.3.5 Signed addition overflow(Exams/ece241 2014 q1c)

假设你有两个8位2的补码:a[7:0]和b[7:0],这两个数相加得到s[7:0]。还要计算是否发生了(有符号的)溢出。

Hint:当两个正数相加产生负结果或两个负数相加产生正结果时,就会发生有符号溢出。有几种检测溢出的方法:它可以通过比较输入和输出数字的符号来计算,或者从位 n 和 n-1 的进位看出。

Solution:

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
  • 两负数相加时,若输出的符号位是0则表示溢出,即(a[7]&&b[7]&&~s[7])
  • 两正数相加时,若输出的符号位是1则表示溢出,即(~a[7]&&~b[7]&&s[7])
  • 两种情况用 || 相或表示。

3.1.3.6 100-bit binary adder(Adder100)

创建一个 100 位二进制加法器。加法器将两个 100 位数字和一个进位相加,以产生 100 位总和并进位。

Solution:

module top_module (
	input [99:0] a,
	input [99:0] b,
	input cin,
	output cout,
	output [99:0] sum
);

	// The concatenation {cout, sum} is a 101-bit vector.
	assign {cout, sum} = a+b+cin;

endmodule

连接运算{cout, sum} 是一个101位向量


3.1.3.7 4-digit BCD adder(BCDadd4)

为您提供了一个名为 bcd_fadd 的一位 BCD(二进制编码十进制)加法器,它将两个 BCD 数字和进位相加,并产生一个总和和进位。

module bcd_fadd {
    input [3:0] a,
    input [3:0] b,
    input     cin,
    output   cout,
    output [3:0] sum );

实例化 4 个 bcd_fadd 副本以创建一个 4 位 BCD 纹波进位加法器。您的加法器应将两个 4 位 BCD 数(打包成 16 位向量)和一个进位相加,以产生 4 位总和并执行。

Hint:

  • 5 位十进制数 12345 的 BCD 表示是 20'h12345。这与 14'd12345(即 14'h3039)不同。
  • 该电路的结构就像一个二进制纹波进位加法器,除了加法器是 以10为 基数而不是 2 基数。

Solution:

module top_module( 
    input [15:0] a, b,
    input cin,
    output cout,
    output [15:0] sum );
    wire [3:0]cout_temp;
    
    bcd_fadd add0(a[3:0],b[3:0],cin,cout_temp[0],sum[3:0]);
    bcd_fadd add1(a[7:4],b[7:4],cout_temp[0],cout_temp[1],sum[7:4]);
    bcd_fadd add2(a[11:8],b[11:8],cout_temp[1],cout_temp[2],sum[11:8]);
    bcd_fadd add3(a[15:12],b[15:12],cout_temp[2],cout_temp[3],sum[15:12]);
    
    assign cout = cout_temp[3];

endmodule


真想快点结束这一章

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值