前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >来看联发科芯片秋招的一个大题(1)——全减器电路与Verilog

来看联发科芯片秋招的一个大题(1)——全减器电路与Verilog

作者头像
FPGA探索者
发布2021-04-15 13:21:10
9770
发布2021-04-15 13:21:10
举报
文章被收录于专栏:FPGA探索者FPGA探索者

遇到半加器和全加器比较多,第一次遇到半减器和全减器。

先来看看半加器和全加器,再类似分析半减器和全减器。

思路:列真值表,画卡诺图,化简。

半加器

输入 A/B,输出和 S,输出 C 为进位。

输入 A = 0,B = 0,0+0 = 0,所以 S = 0,C = 0;

输入 A = 0,B = 1,0+1 = 1,所以 S = 1,C = 0;

输入 A = 1,B = 0,1+0 = 1,所以 S = 1,C = 0;

输入 A = 1,B = 1,1+1 = 10(二进制加法,进 1),

所以 S = 0,C = 1;

代码语言:javascript
复制
S = A ^ B        // 输出加法结果
C = A & B        // 输出进位结果

(1)根据真值表编写

按照半加器和全加器的真值表写出输出端的逻辑表达式,对半加器,输出的进位端是量输入的“与”,输出的计算结果是量输入的异或;对全加器,也按照逻辑表达式做。

代码语言:javascript
复制
//半加器模块
module adder_half(  
  input        a,
  input        b,
  output reg   sum,
  output reg   cout
);

//这里的always @(*)搭配里面的“=”阻塞赋值符号
//实现的效果和 assign sum = a ^ b; assign cout = a & b;是一样的
always @(*)
begin
  sum = a ^ b;
  cout = a & b;
end
endmodule

全加器

当多位数相加时,半加器可用于最低位求和,并给出进位数。第二位的相加有两个待加数和,还有一个来自前面低位送来的进位数。这三个数相加,得出本位和数(全加和数)和进位数,这种就是“全加”。

真值表:

使用与门、或门和异或门搭建电路:

根据真值表编程,门级描述:

代码语言:javascript
复制
// 全加器
module all_adder(cout,sum,a,b,cin);

input a,b,cin;
output sum,cout;

assign sum = a^b^cin;
assign cout = (a&b)|(a&cin)|(b&cin);
endmodule

全加器编程其他思路

直接描述功能,加法直接得到低位的和、高位的进位。

这种方式描述简单,易于扩展,但是底层具体的实现方式比较抽象。

代码语言:javascript
复制
// 1 位全加器
module full_add1(a,b,cin,sum,cout);
input a,b,cin;
output sum,cout;

assign {cout,sum} = a+b+cin;  // 位拼接,直接描述功能

endmodule

扩展,4 位全加器,运算不需要改变,只需要更改位宽:

代码语言:javascript
复制
 module add4(cout,sum,a,b,cin);

 input[3:0] a,b;
 input cin;
 output[3:0] sum;
 output cout;
 
 assign {cout,sum}=a+b+cin;
 
 endmodule

半减器

输入:被减数 A,减数 B

输出:差 S,借位 Cout

(1)0 - 0 = 0,不需要借位,所以 S = 0,Cout = 0;

(2)0 - 1 = 1,需要借位,所以 S = 1,Cout = 1;

(3)1 - 1 = 0,不需要借位,所以 S = 0,Cout = 0;

(4)1 - 0 = 0,不需要借位,所以 S = 1,Cout = 0;

通过观察(或者卡诺图化简),可以得出

代码语言:javascript
复制
S = A ^ B;
Cout = (~A) & B;

全减器

输入:被减数 A,减数 B,低位向高位的借位 Cin

输出:差 S,借位 Cout

这里需要注意:需要计算的是 A - B - Cin

(1) 0 - 0 - 0 = 0,不需要借位,所以 S = 0,Cout = 0;

(2) 0 - 1 - 0 = 1,需要借位,所以 S = 1,Cout = 1;

(3) 1 - 1 - 0 = 0,不需要借位,所以 S = 0,Cout = 0;

(4) 1 - 0 - 0 = 1,不需要借位,所以 S = 1,Cout = 0;

(5) 0 - 0 - 1 = 1,需要借位,所以 S = 1,Cout = 1;

(6) 0 - 1 - 1 = 0,需要借位,所以 S = 0,Cout = 1;

(7) 1 - 1 - 1 = 1,需要借位,所以 S = 1,Cout = 1;

(8) 1 - 0 - 1 = 0,不需要借位,所以 S = 0,Cout = 0;

对 Cout,不容易观察其表达式,使用卡诺图化简:

代码语言:javascript
复制
S = A ^ B ^ Cin
Cout = (~A) & ( B ^ Cin ) + B & Cin
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-04-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FPGA探索者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档