FPGA学习——HDBLBits网站刷题笔记整理(8)

算术运算电路(Arithmetic Circuits)

半加器(Half adder)

半加器是实现两个一位二进制数加法运算的器件。它具有两个输入端(被加数A和加数B)及输出端。是数据输入被加数A、加数B,数据输出S和数(半加和)、进位C。A和B是相加的两个数,S是半加和数,C是进位数。所谓半加就是不考虑进位的加法。
真值表如下:
在这里插入图片描述

题目:创建一个半加器。半加器将两位相加(不带进位),并产生一个求和和进位。
答案:

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

endmodule

全加器(Full adder)

全加器英语名称为full-adder,用门电路实现两个二进数相加并求出和的组合线路,称为一个全加器。全加器区别于半加器是全加器带有进位。
真值表如下:
在这里插入图片描述

题目:创建一个全加器。全加器将三位(包括进位)相加,并产生一个求和和进位。
答案:

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

endmodule

3bit binary adder

N-bit加法器可以根据1-bit全加器组合而成。每个全加器的输出进位cout作为下一个全加器的输入进位cin,这种加法器称为行波进位加法器(Ripple-carry adder,简称RCA)。
题目:知道了如何构建一个全加器,那么就制作3个实例来创建一个3位二进制行波进位加法器。行波进位加法器将两个3位数字和一个进位相加以产生一个3位结果和一个进位输出。
答案:

module top_module( 
    input [2:0] a, b,
    input cin,
    output [2:0] cout,
    output [2:0] sum );
    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];

endmodule

Adder

执行以下电路:
在这里插入图片描述
答案:由电路图分析可知,对输入进行全加器操作,从右至左进行相加进位。

module top_module (
    input [3:0] x,
    input [3:0] y, 
    output [4:0] sum);
    wire [2:0] cout;
    
    assign {cout[0],sum[0]} = x[0] + y[0];
    assign {cout[1],sum[1]} = x[1] + y[1] + cout[0];
    assign {cout[2],sum[2]} = x[2] + y[2] + cout[1];
    assign {sum[4],sum[3]} = x[3] + y[3] + cout[2];

endmodule

Signed addition overflow

上溢必定是两个正数相加,下溢必定是两个负数相加,会产生符号溢出现象。
题目:假设您有两个8bit的补码,a[7:0]和b[7:0]。将这些数字相加生成s[7:0]。还要计算是否发生(有符号的)溢出。
答案:可以通过比较输入和输出数字的符号来计算溢出。

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

100bit binary adder

题目:创建一个100位二进制加法器。加法器将两个100位数字和一个进位相加,生成100位结果和一个进位。
答案:

module top_module( 
    input [99:0] a, b,
    input cin,
    output cout,
    output [99:0] sum );
    assign {cout,sum[99:0]} = a + b + cin;

endmodule

4-digit BCD adder

我们为您提供了一个名为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位和并执行。
答案:利用给定的bcd_fadd加法器进行行波进位,4个模块中需要一个3位的媒介进行连接。

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

以上是HDLBits Verilog语言刷题网站中的Circuits-Arithmetic Circuits部分,后续部分会继续更新。对一些基础性知识点进行归纳总结,有错误请指正。仅供学习参考,谢谢!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TC_zyq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值