超前进位加法器原理与递推式超详细推导+verilog实现与测试
当记忆的线缠绕过往支离破碎,是慌乱占据了心扉。----《寂寞沙洲冷》
超前进位加法器原理
1. 一位二进制的加法
首先考虑两个1位二进制相加 a+b,不考虑上一级的进位,0和1简单相加,即使是三岁小孩理解下面的表格想必也没有什么困难
上一级的进位(Cn-1) | A | B | 进位(Cn) |
---|---|---|---|
0 | 0 | 0 | 0 |
0 | 1 | 0 | 0 |
0 | 0 | 1 | 0 |
0 | 1 | 1 | 1 |
结论显而易见,A&B==1(AB=1)的时候存在进位
2. 考虑存在输入的进位情况下的进位:
上一级的进位(Cn-1) | A | B | 进位(Cn) |
---|---|---|---|
1 | 0 | 0 | 0 |
1 | 0 | 1 | 1 |
1 | 1 | 0 | 1 |
1 | 1 | 1 | 1 |
那么,考虑上一级进位的情况下,A || B==1(A+B=1)时存在进位
3. 卡诺图公式推导
用到一点简单的数电知识,综合以上两个表格,画出卡诺图如下:
一位挂科的学生默默翻开了书复习卡诺图化简
C[n-1]\AB | 00 | 01 | 11 | 10 |
---|---|---|---|---|
0 | 0 | 0 | 1 | 0 |
1 | 0 | 1 | 1 | 1 |
短暂复习过后,不难看出,存在三个圈,则根据卡诺图写出最简表达式为:
逻辑表达式为:
C[n] = AB + BC[n-1] + AC[n-1]= AB + C[n-1](A + B)使用逻辑运算符书写为:
C[n] = (A[n] & B[n]) || ((A[n] || B[n]) & C[n-1])
即使你没有挂科,如果不会,请去看看数电书。
4.超前进位递推式
既然递推式得到了,那么事情就变得简单了。例如:
设两个八位二进制加数为A、B,则:
C0 = A[0] || B[0] (第一位没有上一级的进位)
C1 = (A[1] & B[1]) || ((A[1] || B[1]) & C[0])
C2 = (A[2] & B[2]) || ((A[2] || B[2]) & C[1])
C3 = (A[3] & B[3]) || ((A[3] || B[3]) & C[2])
C4 = ······
5. 二进制本位加法
两个一位二进制数相加忽略之前的进位,其
ans = A xor B
考虑之前的进位,设进位为C[n-1],二进制数为A、B,则:
C[n-1] | A | B | ans[n] |
---|---|---|---|
0 | 0 | 0 | 0 |
0 | 0 | 1 | 1 |
0 | 1 | 0 | 1 |
0 | 1 | 1 | 0 |
1 | 0 | 0 | 1 |
1 | 0 | 1 | 0 |
1 | 1 | 0 | 0 |
1 | 1 | 1 | 1 |
这次,聪明的你想必不需要卡诺图也能直接看出来表达式了,没错,就是:
ans[n] = C[n-1] xor (A[n] xor B[n])
6. 总结
设两加数为A、B,且进位数组为C[n],答案为ans[n],则:
C[0] = A[0] & B[0];
ans[1] = A[0] xor B[0];C[1] = (A[1] & B[1]) || ((A[1] || B[1]) & C[0]);
ans[2] = C[1] xor (A[2] xor B[2]);C[2] = (A[2] & B[2]) || ((A[2] || B[2]) & C[1]);
ans[3] = C[2] xor (A[3] xor B[3]);······
7.代码
根据上述分析,使用verilog写出四位超前进位加法器如下:
(这样写真的很蠢,不要这样写,别的博主有写的更好的,这里贴一篇。他的代码很简单美观。但是注意到他这篇文章的评论有人说他写的不是超前进位,好像确实是这样,因为他那个本质还是递推)
需要注意的是,
超前进位加法器的本质是用电路的复杂程度去换时间。–《数字电子技术基础(第六版)》
module top(input [3:0] a,input [3:0] b,input c,output [3:0] ans
);wire [3:0] C;assign ans[0] = a[0] ^ b[0];
assign C[0] = a[0] & b[0];//这些注释掉的都是递推式,你可以先写好递推式再把上面的C[n-1]复制粘贴替换进去就可以
//assign ans[1] = C[0] ^ (a[1] ^ b[1]);
//assign C[1] = ((a[1] | b[1]) & C[0]) | (a[1] & b[1]);assign ans[1] = (a[0] & b[0]) ^ (a[1] ^ b[1]);
assign C[1] = ((a[1] | b[1]) & (a[0] & b[0])) | (a[1] & b[1]);// assign ans[2] = C[1] ^ (a[2] ^ b[2]);
// assign C[2] = ((a[2] | b[2]) & C[1]) | (a[2] & b[2]);assign ans[2] = (((a[1] | b[1]) & (a[0] & b[0])) | (a[1] & b[1])) ^ (a[2] ^ b[2]);
assign C[2] = ((a[2] | b[2]) & (((a[1] | b[1]) & (a[0] & b[0])) | (a[1] & b[1]))) | (a[2] & b[2]);// assign ans[3] = C[2] ^ (a[3] ^ b[3]);
// assign C[3] = ((a[3] | b[3]) & C[2]) | (a[3] & b[3]);assign ans[3] = ((a[2] | b[2]) & (((a[1] | b[1]) & (a[0] & b[0])) | (a[1] & b[1]))) | (a[2] & b[2]) ^ (a[3] ^ b[3]);
assign C[3] = ((a[3] | b[3]) & ((a[2] | b[2]) & (((a[1] | b[1]) & (a[0] & b[0])) | (a[1] & b[1]))) | (a[2] & b[2])) | (a[3] & b[3]);//如果你需要八位的加法器,把下面的注释去掉
// assign ans[4] = C[3] ^ (a[4] ^ b[4]);
// assign C[4] = ((a[4] | b[4]) & C[3]) | (a[4] & b[4]);// assign ans[5] = C[4] ^ (a[5] ^ b[5]);
// assign C[5] = ((a[5] | b[5]) & C[4]) | (a[5] & b[5]);// assign ans[6] = C[5] ^ (a[6] ^ b[6]);
// assign C[6] = ((a[6] | b[6]) & C[5]) | (a[6] & b[6]);// assign ans[7] = C[6] ^ (a[7] ^ b[7]);
// assign C[7] = ((a[7] | b[7]) & C[6]) | (a[7] & b[7]);
endmodule
8. 测试代码
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include "verilated_vcd_c.h" //可选,如果要导出vcd则需要加上
#include "Vtop.h" //.v -> .h
#include <iostream>
#include <bitset>vluint64_t main_time = 0; //initial 仿真时间double sc_time_stamp()
{return main_time;
}int main(int argc, char **argv)
{Verilated::commandArgs(argc, argv); Verilated::traceEverOn(true); //导出vcd波形需要加此语句VerilatedVcdC* tfp = new VerilatedVcdC; //导出vcd波形需要加此语句Vtop *top = new Vtop("top"); //调用VShuang.h里面的IO structtop->trace(tfp, 0); tfp->open("wave.vcd"); //打开vcdint a = 1;int b = 0;int c = 0;while (sc_time_stamp() < 7 && !Verilated::gotFinish()) { //控制仿真时间top->a = a; //激励控制top->b = b;top->c = c;top->eval(); //计算输出std::cout<<a<<" "<<b<<" "<<std::bitset<4>(top->ans)<<" ";printf("%d\n", top->ans);tfp->dump(main_time); //dump wavemain_time++; //推动仿真时间a++;//向后产生加数,你自己random产生测试数据也行b++;}top->final();tfp->close();delete top;return 0;
}
9. 输出
左边两个是加数,中间的是二进制,后面的是十进制表示:
1 0 0001 1
2 1 0011 3
3 2 0101 5
4 3 0111 7
5 4 1001 9
6 5 1011 11
7 6 1101 13
10. 编译命令
文件名为 top.v main.cpp
verilator -Wno-fatal top.v main.cpp --top-module top --cc --trace --exe #编译.v文件
make -C obj_dir -f ./Vtop.mk Vtop #编译cpp
./obj_dir/Vtop #运行
gtkwave wave.vcd #查看vcd波形
后记:1.一开始忘了卡诺图每一个相邻项只能变一个值,写成了00 01 10 11,怎么化简也化不出来,后来才发现,真的是,才疏学浅。
2.这玩意还写了半天,真的是很不熟练。
3.本例仅供学习超前进位加法器原理使用,实际编程直接+就完事了,verilog内置的肯定比咱写的垃圾加法器优化要好。
超前进位加法器原理与递推式超详细推导+verilog实现与测试相关推荐
- 超前进位加法器原理与设计
超前进位加法器原理与设计 一.行波进位加法器关键路径分析 N比特行波进位加法器可由N个全加器级联而成,电路的延迟包括门延迟和线延迟等,分析忽略线延迟. 单比特全加器门电路图 从输入a,b,cin到输出 ...
- 计算机组成原理超前进位加法器原理,计算机组成原理课程设计—超前进位加法器的设计.doc...
PAGE 沈阳航空航天大学 课 程 设 计 报 告 课程设计名称:计算机组成原理课程设计 课程设计题目:超前进位加法器的设计 院(系):计算机学院 专 业: 班 级: 学 号: 姓 名: 指导教师: ...
- 四位行波进位加法器_【HDL系列】超前进位加法器原理与设计
上期介绍了半加器.全加器以及行波进位加法器(RCA),本文介绍超前进位加法器(Lookahead Carry Adder,简称LCA).在介绍超前进位加法器前,我们先来分析下行波进位加法器的关键路径. ...
- 原码一位乘法器设计_数字IC校招基础知识点复习(七)——超前进位加法器、Wallace树、Booth乘法器...
1.超前进位加法器 看了一些面经,提到会让你用基础的门搭加法器,因此首先得熟悉半加器,全加器等最基础的加法器才能理解之后的超前进位加法器,树型加法器等复杂的加法器. 半加器的输入为a,b,输出为结果s ...
- 超前进位加法器实验报告_16位超前进位加法器实验报告
一.实验目的 设计.验证并优化 16 位超前进位加法器的逻辑功能. 二.实验原理 1 . 1 位全加器原理 全加器的求和输出信号和进位信号,定义为输入变量 A . B . C 的两种组合布尔函 数: ...
- 32位进位选择加法器_超前进位加法器amp;行波进位加法器
超前进位加法器&行波进位加法器 八位超前进位加法器 原理 设计文件 综合电路 测试文件 仿真波形 八位行波进位加法器 原理 设计文件 测试文件 仿真波形 总结 八位超前进位加法器 原理 有学弟 ...
- 四位行波进位加法器_超前进位加法器amp;行波进位加法器
超前进位加法器&行波进位加法器 八位超前进位加法器 原理 设计文件 综合电路 测试文件 仿真波形 八位行波进位加法器 原理 设计文件 测试文件 仿真波形 总结 八位超前进位加法器 原理 有学弟 ...
- 超前进位加法器实验报告_干货 | 加法器与反相加法器原理解析
什么是加法器 加法器是为了实现加法的,即是产生数的和的装置. 加数和被加数为输入,和数与进位为输出的装置为半加器.若加数.被加数与低位的进位数为输入,而和数与进位为输出则为全加器.常用作计算机算术逻辑 ...
- C# Winform 计算机原理模型机的设计——带超前进位加法器
前言 此刻距离我上一篇博客已有一年多,这一年来学业繁忙,少有顾及,但这个博客我会一直写下去的.尽管现在的我还是菜鸡 今天要写的是关于我大二时候学习计算机原理的时候,用C#和C# Winform做的一个 ...
最新文章
- 网络规划设计培训与方案集下载
- 码易众包:软件开发众包的未来不能只靠等待和呐喊
- alexa api php,PHP使用Alexa API获取网站的Alexa排名例子
- 解决方案:Error:Execution failed for task ‘:app:compileDebugAidl‘. > aidl is missing
- uploadify 附件上传
- 【CSS3】好玩的动画线框
- Android应用开发—setResult()的调用时机
- memcached 缓存 分布式缓存 常见命令,管理命令
- 为SQL Server 增加链接到SQL Server 的链接服务器
- java判断session中是否存在_java中session用法 判断用户是否登录
- flash android 5.0,Adobe Flash Player
- VS的C++调试教程
- 判断距离1970年1月1日的天数
- 如何围绕自身打造个人IP,做长线引流布局?
- js刷新当前页的方法
- esp寄存器与ebp寄存器介绍
- 关于在微软学生资源中心下载软件
- (Java)IO流对象(三)字符流
- RESTClient 使用教程
- 红米手机如何HTML到电视上,红米(Redmi)路由器AX6用手机怎么设置?
热门文章
- 高校bbs或者科研论坛paperpass
- 有源天线:请教个GPS模块接天线的问题,阿莫论坛同轴供电接收GPS二合一,自己总结的TG621K,TG621S和S1216
- CISP——访问控制(自主访问控制和强制访问控制)
- 常见攻击原理与技术分析
- 信息学奥赛一本通 1214:八皇后 | OpenJudge NOI 2.5 1756:八皇后
- wordpress 插件开发
- matlab 工具箱 GATBX 的安装,安装Sheffield Matlab遗传算法工具箱的建议
- 计算机组成原理实验心得200字,2016年江西师范大学考研专业目录及考试科目
- 简单到外行人都能看懂的“学生管理系统”
- 日撸力扣三道题---Day3---数组算法+二分查找