作业-基于verilog HDL的八位超前进位加法器
用verilog编写的8位扩展超前进位加法器代码
+ Pi * Pi-1 * ... * P1 * P0 * C0
Gij = Gi + Pi * Gi-1 + Pi * Pi-1 * Gi-2 + ... + Pi * Pi-1 * ... * Pj+1 * Gj
Pij = Pi * Pi-1 * ... * Pj+1 * Pj;
Gi,i = Gi;
Pi,i = Pi;
***************************************************************************** */
module adder_8bits( s, co, a, b, ci );
assign c[ 5 ] = g04_04 | p04_04 & c[ 4 ];
assign c[ 6 ] = g05_04 | p05_04 & c[ 4 ];
assign c[ 7 ] = g06_06 | p06_06 & c[ 6 ];
assign c[ 8 ] = g07_00 | p07_00 & c[ 0 ];
8位扩展超前进位加法器
/* *****************************************************************************
Ci+1 = Ai * Bi + Bi * Ci + Ci * Ai
= Ai * Bi + ( Ai + Bi ) * Ci
基于verilog的8位加法器设计验证
#10$finish;
end
initial $monitor($time,,"%d + %d + %b = {%b, %d}",a,b,cin,c,sum);
endll
# 0 0 + 0 + 0 = {0, 0}
reg [7:0] a;
reg [7:0] b;
reg cin;
// wires
wire c;
wire [7:0] sum;
// assign statements (if any)
adder_8 i1 (
// port map - connection between master ports and signals/registers
实验名称
专业、年级
学号
姓名
8位加法器设计验证
以下内容由实验指导教师填写(实验内容请以批注的形式批阅)
实验项目完成情况
实验项目成绩
指导教师
时间
年月日
实验二:8位加法器设计验证
一:8位全加器的源程序:
module adder_8(sum,c,a,b,cin);
output[7:0] sum;
output c;
# Time: 50 ns Iteration: 0 Instance: /adder_8_vlg_tst
四:测试波形如下图所示:
(此文档部分内容来源于网络,如有侵权请告知删除,文档可自行编辑修改内容,供参考,感谢您的配合和支持)
.a(a),
.b(b),
.c(c),
.cin(cin),
实验二8位加法器的设计
实验二8位加法器的设计一、实验目的1)学习8位加法器的工作原理2)熟悉MAX+plusII软件的基本使用方法3)熟悉EDA实验开发的基本使用方法4)学习VHDL程序中数据对象,数据类型,顺序语句,并行语句的综合使用二、实验内容设计一个8位加法器电路ADDER8B,分别用2个4位加法器组成,即由两个4位二进制并行加法器级联而成的。
三、实验条件开发软件:MAX+plus II 9.23 Baseline硬件设备:装有windows7的pc机四、实验设计1)系统的原理框架图2)VHDL源程序Adder4b.vhd源代码library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity adder4b isport ( c4: in std_logic;a4: in std_logic_vector(3 downto 0);b4:in std_logic_vector(3 downto 0);s4: out std_logic_vector(3 downto 0);co4: out std_logic);end entity adder4b;architecture art of adder4b issignal s5:std_logic_vector(4 downto 0); signal a5,b5: std_logic_vector(4 downto 0); begina5<='0'&a4;b5<='0'& b4;s5<=a5+b5+c4;s4<= s5(3 downto 0);co4<=s5(4);end architecture art;Adder8b.vhd源代码library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity adder8b isport( c8:in std_logic;a8:in std_logic_vector(7 downto 0);b8: in std_logic_vector(7 downto 0);s8: out std_logic_vector(7 downto 0);co8: out std_logic);end entity adder8b ;architecture art of adder8b is component adder4b isport(c4: in std_logic;a4: in std_logic_vector(3 downto 0);b4: in std_logic_vector(3 downto 0);s4: out std_logic_vector(3 downto 0);co4: out std_logic);end component adder4b;signal sc:std_logic;beginu1:adder4bport map(c4=>c8,a4=>a8(3 downto 0),b4=>b8(3 downto 0),s4=>s8(3 downto 0),co4=> sc);u2:adder4bport map(c4=>sc, a4=>a8(7 downto 4),b4=>b8(7 downto 4),s4=>s8(7 downto 4),co4=>co8);end architecture art;3)管脚图五、实验结果及总结系统时序仿真结果从系统仿真结果可以看出,本系统完全符合设计要求,同时从仿真结果可以看出,从输入到输出有一定的延时,在11ns左右,这正是器件延时特征的反映。
Verilog实现的8位超前进位加法器
Verilog实现的8位超前进位加法器。
经过modelsim验证正确可用,在DC下综合成功//文件名:add_8.v//模块名:add_8//`timescale 1ns/1nsmodule add_8 ( input [7:0]a, input [7:0]b, input cin, output [7:0] s, output co );wire [7:0]c_tmp;wire [7:0]g;wire [7:0]p;assign co = c_tmp[7];assign g[0] = a[0] & b[0],g[1] = a[1] & b[1],g[2] = a[2] & b[2],g[3] = a[3] & b[3],g[4] = a[4] & b[4],g[5] = a[5] & b[5],g[6] = a[6] & b[6],g[7] = a[7] & b[7];assign p[0] = a[0] | b[0],p[1] = a[1] | b[1],p[2] = a[2] | b[2],p[3] = a[3] | b[3],p[4] = a[4] | b[4],p[5] = a[5] | b[5],p[6] = a[6] | b[6],p[7] = a[7] | b[7];assign c_tmp[0] = g[0] | ( p[0] & cin ),c_tmp[1] = g[1] | ( p[1] & g[0]) | ( p[1] & p[0] & cin),c_tmp[2] = g[2] | ( p[2] & g[1]) | ( p[2] & p[1] & g[0]) | ( p[2] & p[1] & p[0] & cin),c_tmp[3] = g[3] | ( p[3] & g[2]) | ( p[3] & p[2] & g[1]) | ( p[3] & p[2] & p[1] & g[0])| ( p[3] & p[2] & p[1] & p[0] & cin),c_tmp[4] = g[4] | ( p[4] & g[3]) | ( p[4] & p[3] & g[2]) | ( p[4] & p[3] & p[2] & g[1])| ( p[4] & p[3] & p[2] & p[1] & g[0]) | ( p[4] & p[3] & p[2] & p[1] & p[0] &cin),c_tmp[5] = g[5] | ( p[5] & g[4]) | ( p[5] & p[4] & g[3]) | ( p[5] & p[4] & p[3] & g[2])| ( p[5] & p[4] & p[3] & p[2] & g[1]) | ( p[5] & p[4] & p[3] & p[2] & p[1] & g[0])| ( p[5] & p[4] & p[3] & p[2] & p[1] & p[0] & cin),c_tmp[6] = g[6] | ( p[6] & g[5]) | ( p[6] & p[5] & g[4]) | ( p[6] & p[5] & p[4] & g[3])| ( p[6] & p[5] & p[4] & p[3] & g[2]) | ( p[6] & p[5] & p[4] & p[3] & p[2] & g[1])| ( p[6] & p[5] & p[4] & p[3] & p[2] & p[1] & g[0])| ( p[6] & p[5] & p[4] & p[3] & p[2] & p[1] & p[0] & cin),c_tmp[7] = g[7] | ( p[7] & g[6]) | ( p[7] & p[6] & g[5]) | ( p[7] & p[6] & p[5] & g[4])| ( p[7] & p[6] & p[5] & p[4] & g[3]) | ( p[7] & p[6] & p[5] & p[4] & p[3] & g[2])| ( p[7] & p[6] & p[5] & p[4] & p[3] & p[2] & g[1])| ( p[7] & p[6] & p[5] & p[4] & p[3] & p[2] & p[1] & g[0])| ( p[7] & p[6]& p[5] & p[4] & p[3] & p[2] & p[1] & p[0] & cin);assign s[7:0] = a[7:0] ^ b[7:0] ^{c_tmp[6:0],cin};endmodule。
基于FPGA的八位加法器
课程实训报告课程名称EDA 技术设计题目基于FPGA的八位加法器院系名称机械电子工程学院专业班级电子信息工程2014级姓名学号成绩指导教师2016年12月目录1、设计目的、要求.................................................................................................................... - 2 -1.1、设计目的.................................................................................................................... - 2 -1.2、系统设计要求............................................................................................................ - 2 -2、设计原理及相关硬件............................................................................................................ - 3 -2.1、系统设计方案及原理................................................................................................ - 3 -2.2、硬件原理.................................................................................................................... - 3 -3、主要模块设计........................................................................................................................ - 5 -3.1、模块Key-led............................................................................................................. - 5 -3.2、模块Adder................................................................................................................. - 6 -4、系统编译及仿真过程............................................................................................................ - 6 -4.1、系统编译.................................................................................................................... - 6 -4.2、仿真............................................................................................................................ - 7 -5、硬件验证过程和分析............................................................................................................ - 8 -5.1、引脚设置和保护........................................................................................................ - 8 -5.2、硬件下载.................................................................................................................... - 8 -5.3、硬件测试结果及分析................................................................................................ - 9 -6、实验参考程序........................................................................................................................ - 9 -6.1、模块key_led............................................................................................................. - 9 -6.2、模块adder4b........................................................................................................... - 13 -6.3、模块adder8b........................................................................................................... - 14 -总结 ......................................................................................................................................... - 15 -参考文献...................................................................................................................................... - 0 -附录 ........................................................................................................................................... - 1 -1、设计目的、要求1.1、设计目的(1)了解并掌握一般设计方法,具备初步的独立设计能力;(2)掌握用VerilogHDL语言程序的基本技能;(3)提高综合运用所学的理论知识独立分析和解决问题的能力;(4)进一步掌握EDA技术的开发流程;(5)学习较复杂的数字系统设计方法。
VerilogHDL简单计算器设计
实用文档目录第一章设计目的及任务要求 (1)1.1 设计目的 (1)1.2 设计任务 (1)1.3 课设要求 (1)第二章设计思路 (2)2.1 设计总体框图 (2)2.2 设计原理 (2)2.2.1 计算其原理 (2)2.2.2 数码显示原理 (2)2.2.3 八位数码管扫描的原理 (3)第三章设计源程序及分析 (4)3.1 计算器模块 (4)3.1.1 计算器源程序 (4)3.1.2 计算器程序分析 (4)3.2 数码管显示部分 (5)3.2.1 数码管显示源程序 (5)3.2.2 数码管显示程序分析 (5)3.3 循环扫描模块 (6)3.3.1 循环扫描程序 (6)3.3.2 循环程序分析 (6)3.4 总程序及其分析 (7)第四章时序仿真和结果验证 (10)4.1 计算器时序仿真及其分析 (10)4.2 数码管时序仿真及分析 (10)4.3 总体时序仿真图 (10)4.4 结果验证 (11)第五章心得体会 (12)第一章设计目的及任务要求1.1 设计目的(1)进一步加强熟练EDA基础知识。
(2)熟练掌握Quartus 6.0软件的使用以及用该软件编程和仿真的全过程。
(3)培养独立思考问题,解决问题的能力以及查阅相关资料和资料的正确使用能力,为明年的毕业设计打下良好的设计基础。
1.2 设计任务设计一个简单计算器,输入为8位二进制数,分别用两位数码管显示,输出的计算结果为16位二进制数,并用四位数码管显示,能够实现+、-、 *、/ 四种运算,其中除法的结果显示分为商和余数两部分,分别用两位数码管显示。
1.3 课设要求(1)说明题目的设计原理和思路、采用方法及设计流程。
(2)系统框图、Verilog语言设计程序或原理图。
(3)对各子模块的功能以及各子模块之间的关系做较详细的描述。
(4)详细说明调试方法和调试过程。
(5)说明测试结果:仿真时序图和结果显示图,并对其进行说明和分析。
第二章设计思路2.1 设计总体框图有分析可知,本次课程设计可以分成五个木块来实现相应的功能,分别是输入模块,计算模块,扫描模块,输出模块以及显示模块。
8位超前进位加法器
【verilog】8位超前进位加法器2010-12-22 21:16这是我的32位超前进位加法器的一部分。
其中的一个模块,一个8位的超前进位加法器。
我的32位的超前进位加法器是将4个模块再进行超前进位加法实现的。
也就是second level carry-lookahead adder:以下的代码就是上面的block0到block3。
代码://Written by alexyangfox#module eight_bit_unit(A,B,c0,G_level,PG_level,carry,sum);input [7:0] A; //加数Ainput [7:0] B; //加数Binput c0; //输入的进位c0 (Carry 0)output [7:0] sum; //输出和output G_level,PG_level,carry; //产生的极间PG(propagate)和G(generate)//因为我这里想要的是做2级超前进位加法器//一个32位的超前进位加法器由4个八位的超前进位加法器组成//然后四个加法器又被当作独立的模块,四个加法器再超前进位一次形成第二级wirepg0,pg1,pg2,pg3,pg4,pg5,pg6,pg7,g0,g1,g2,g3,g4,g5,g6,g7,c0,c1,c2,c3,c4,c5,c6,c7,c8;wire G_level,PG_level,carry;//全部 PG的计算(propagate)//有的人将PG定义为: PG=A + B//而我在此处使用通常定义: PG = A xor B//由于有这样的关系 A + B = (A xor B) + AB//但是AB已经在Gernerate中:C_n=Generator_(n-1) + Propagate_(n-1)*C_(n-1)//PG 和 G只是用来计算进位数的,所以使用哪种PG的定义并没有影响//在实际电路中,若使用PG=A+B的方案,还可以减少晶体管的使用//well,sth interesting :XOR is not "exclusive or" (nor),it's //"exclusive disjunction or"assign pg0=A[0]^B[0];assign pg1=A[1]^B[1];assign pg2=A[2]^B[2];assign pg3=A[3]^B[3];assign pg4=A[4]^B[4];assign pg5=A[5]^B[5];assign pg6=A[6]^B[6];assign pg7=A[7]^B[7];//计算所有的 Generate (G)assign g0=A[0] & B[0];assign g1=A[1] & B[1];assign g2=A[2] & B[2];assign g3=A[3] & B[3];assign g4=A[4] & B[4];assign g5=A[5] & B[5];assign g6=A[6] & B[6];assign g7=A[7] & B[7];//进位产生器//公式:C_n=Generator_(n-1) + Propagate_(n-1)*C_(n-1)//c1=g0 + pg0*c0assign c1=g0|( pg0 & c0);//c2=g1+ pg1*g0 + pg1*pg0*c0assign c2=g1|( pg1 & g0)|( pg1 & pg0 & c0);//c3=g2+ pg2*g1+ pg2*pg1*g0 + pg2*pg1*pg0*c0assign c3=g2|( pg2 & g1)|( pg2 & pg1 & g0)|( pg2 & pg1 & pg0 & c0);//c4= g3 + pg3*g2+ pg3*pg2*g1+ pg3*pg2*pg1*g0// + pg3*pg2*pg1*pg0*c0assign c4=g3|(pg3 & g2)|(pg3 & pg2 & g1)|( pg3 & pg2 & pg1 & g0)|(pg3 & pg2 & pg1 & pg0 & c0);//c5= g4 + pg4*g3 + pg4*pg3*g2+ pg4*pg3*pg2*g1// + pg4*pg3*pg2*pg1*g0 + pg4*pg3*pg2*pg1*pg0*c0assign c5=g4|( pg4 & g3)|( pg4 & pg3 & g2)|( pg4 & pg3 & pg2 & g1)|( pg4& pg3 & pg2 & pg1 & g0)|( pg4 & pg3 & pg2 & pg1 & pg0 & c0);//c6=g5 + pg5*g4 + pg5*pg4*g3 + pg5*pg4*pg3*g2// + pg5*pg4*pg3*pg2*g1 + pg5*pg4*pg3*pg2*pg1*g0// + pg5*pg4*pg3*pg2*pg1*pg0*c0assign c6=g5|( pg5 & g4)|( pg5 & pg4 & g3)|( pg5 & pg4 & pg3 & g2)|( pg5 & pg4 & pg3 & pg2 & g1)|( pg5 & pg4 & pg3 & pg2 & pg1 & g0)|( pg5 & pg4 & pg3 & pg2 & pg1 & pg0 & c0);//c7=g6 + pg6*g5 + pg6*pg5*g4 + pg6*pg5*pg4*g3 + pg6*pg5*pg4*pg3*g2// + pg6*pg5*pg4*pg3*pg2*g1 + pg6*pg5*pg4*pg3*pg2*pg1*g0// + pg6*pg5*pg4*pg3*pg2*pg1*pg0*c0assign c7=g6|( pg6 & g5)|( pg6 & pg5 & g4)|( pg6 & pg5 & pg4 & g3)|( pg6 & pg5 & pg4 & pg3 & g2)|( pg6 & pg5 & pg4 & pg3 & pg2 & g1)|( pg6 & pg5 & pg4 & pg3 & pg2 & pg1 & g0)|( pg6 & pg5 & pg4 & pg3 & pg2 & pg1 & pg0 & c0);//c8=g7 + pg7*g6 + pg7*pg6*g5 + pg7*pg6*pg5*g4 + pg7*pg6*pg5*pg4*g3 +pg7*pg6*pg5*pg4*pg3*g2// + pg7*pg6*pg5*pg4*pg3*pg2*g1 + pg7*pg6*pg5*pg4*pg3*pg2*pg1*g0//+ pg7*pg6*pg5*pg4*pg3*pg2*pg1*pg0*c0assign c8=g7|(pg7 & g6)|(pg7 & pg6 & g5)|(pg7 & pg6 & pg5 & g4)|(pg7 & pg6 & pg5 & pg4 & g3)|(pg7 & pg6 & pg5 & pg4 & pg3 & g2)|(pg7 & pg6 & pg5 & pg4 & pg3 & pg2 & g1)|(pg7 & pg6 & pg5 & pg4 & pg3 & pg2 & pg1 & g0)|(pg7 & pg6 & pg5 & pg4 & pg3 & pg2 & pg1 & pg0 & c0);//这句写成:c8=G_level|(pg7 & pg6 & pg5 & pg4 & pg3 & pg2 & pg1 & pg0 & c0);会减少器件使用,但是会增加延迟?//极间超前进位信号G_level和PG_level的产生//Actually I am building a two_level carry look ahead adder.//回顾上面C8的计算公式,将它拆解成两部分://C8=G_level + C0*PG_level//于是,我们很容易得到这个://G_level=item0+item1+...+item7//PG_level=pg7*pg6*pg5*pg4*pg3*pg2*pg1*pg0assign PG_level=pg7 & pg6 & pg5 & pg4 & pg3 & pg2 & pg1 & pg0;assign G_level=g7|(pg7 & g6)|(pg7 & pg6 & g5)|(pg7 & pg6 & pg5 & g4)|(pg7 & pg6 & pg5 & pg4 & g3)|(pg7 & pg6 & pg5 & pg4 & pg3 & g2)|(pg7 & pg6 & pg5 & pg4 & pg3 & pg2 & g1)|(pg7 & pg6 & pg5 & pg4 & pg3 & pg2 & pg1 & g0);//the parts above explains the term "Carry look_ahead"//计算输出结果//两个异或门(Xor GAtes)assign sum[0]=A[0] ^ B[0] ^ c0;assign sum[1]=A[1] ^ B[1] ^ c1;assign sum[2]=A[2] ^ B[2] ^ c2;assign sum[3]=A[3] ^ B[3] ^ c3;assign sum[4]=A[4] ^ B[4] ^ c4;assign sum[5]=A[5] ^ B[5] ^ c5;assign sum[6]=A[6] ^ B[6] ^ c6;assign sum[7]=A[7] ^ B[7] ^ c7;assign carry=c8;endmodule。
Verilog习题
Verilog习题一.简答题1.电子电路CAD的基本含义是什么?2.利用Protel99进行原理图设计的基本步骤有那些?3.归纳总结,Protel99中,画线、画图工具有什么区别?4.两个节点通过哪些方法可以实现电气连接?5.网单文件中包含哪些内容?6.在Protel99的PCB中,有那些主要板层,作用分别是什么?7.PCB元件布局时应遵守那些原则?8.采用CPLD/FPGA设计复杂数字逻辑的一般流程是什么?9.论述构成数字系统的基本组成部分有哪些,作用如何?a)数字系统是指能进行数字信号的处理、存储、传输,完成某一特定功能的数字电路和软件系统的总和。
如计算机。
b)数字系统硬件主要由各种不同功能的组合逻辑(编码/译码等)和时序逻辑电路(计数器/寄存器/状态计)组合而成。
c)系统硬件单元有:(1)CPU:主控单元(2)RAM:内部数据存储、交换(3)输入输出设备,通信接口:输入指令、输出结果d)软件有:(1)操作系统:完整软件系统(2)嵌入式系统:简化的操作系统(3)监控程序:实现简单功能的循环程序10.论述数字逻辑EDA设计的一般流程是什么?系统任务——> 模块划分——> 图形或HDL行为语言描述——> 逻辑前仿真——> 综合——> 综合后仿真——> 布局布线——> 后仿真——> 下装ASIC11.举例说明流水线工作原理a)所谓流水线就是指把大规模、层次多,延时大的组合逻辑电路分为几个级,在每一级接入寄存器,暂存中间数据,从而增加数据处理能力得方法。
b)K级流水线就是在功能逻辑输入输出间恰好有K组寄存器,上一级输出是下一个输入c)流水线增加了数据吞吐量,带来了首位数据时间延迟,增加了KT.15.综述:Pspice可以进行那些分析,其作用如何?16.综述:pspice的信号源有那些类型,语法如何描述?17.FPGA内部逻辑单元的基本组成是什么?18.说出三个以上世界知名EDA公司的名称和主要产品。
FPGA八位加法器
FPGA 实验报告(信息科学与工程学院)实验名称:流水线设计技巧设计加法器专业:通信071学生姓名:喻明富学号:07437126 2010 ~2010学年第一学期第一次试验实验日期:10月30号指导教师:刘威成绩:审阅教师:信息科学与工程学院电子与信息技术实验中心教务处一、实验目的1、理解流水线设计技巧的原理;2、通过比较普通加法器和流水线加法器的性能验证后者的优越性。
二、实验要求1、用《EDA技术》课程所学方法设计一个8位加法器;2、用流水线技巧设计一个2级流水线的8位加法器;3、比较普通加法器和流水线加法器的性能。
三、实验原理1、设计一个普通加法器,用8个一位加法器级联,组成行波进位式加法器;图1-1 行波进位式加法器为了方便进行时间分析,需要在输入和输出端分别加上寄存器。
输入端(图1-2)图1-2 输入端所加的寄存器输出端(图1-3)图1-3 输出端所加的寄存器处理后可进行delay time分析、setup/hold time分析和频率分析。
2、流水线设计方法流水线设计就是将一个时延比较大的复杂的组合逻辑系统地分割,在各个部分(分级)之间插入寄存器以暂存中间数据的方法。
目的是将一个大操作分解成若干的小操作,每一步小操作的耗时较小,各小操作能并行执行,所以数据可以像流水线一样轮流进入每一步小操作进行处理,这样整体地来看系统,数据可以更快地进入和流出系统,所以能提高数据吞吐率(提高处理速度)。
这样的流水线的速率取决于每一步小操作所耗费的时间。
由于采用同步寄存器分割组合逻辑,只要每个组合逻辑的时延小于寄存器的时钟周期,那么系统的频率取决于系统的时钟频率。
流水线处理是高速设计中的一个常用设计手段。
如果某个设计的处理流程分为若干步骤,而且整个数据处理是“单流向”的,即没有反馈或者迭代运算,前一个步骤的输出是下一个步骤的输入,则可以考虑采用流水线设计方法来提高系统的工作频率。
例如,利用FPGA设计8位加法器时,考虑到:1>FPGA每个逻辑单元规模小,一般为4输入LUT,如果加法器位数大于4bit,则会受到LUT容量限制。
verilog语言编写8位全加器
8位全加器一、实验目得用verilog语言编写一个8位全加器,并在modelsim软件上进行仿真。
二、代码1、源代码:module add8(sum,cout,in1,in2,cin);input [7:0] in1,in2;inputcin;output [7:0] sum;output cout;assign {cout,sum}=in1+in2+cin;endmodule2、激励:`timescale 1ns/100psmodule add8_tb;reg[7:0] A,B;reg CIN;wire [7:0] SUM;wireCOUT;add8 ul(、sum(SUM),、cout(COUT),、in1(A),、in2(B),、cin(CIN));initialbeginA=8'd0;B=8'd0;CIN=1'b0;#10 A=8'd20;B=8'd129;CIN=1'b1;#10 A=8'd27;B=8'd19;CIN=1'b0;#10 A=8'd157;B=8'd29;CIN=1'b0;#10 A=8'd37;B=8'd68;CIN=1'b0;#10 A=8'd11;B=8'd69;CIN=1'b0;#10 A=8'd54;B=8'd67;CIN=1'b1;#10 A=8'd211;B=8'd0;CIN=1'b0;#10 A=8'd87;B=8'd43;CIN=1'b1;#10 A=8'd23;B=8'd171;CIN=1'b0;#10 A=8'd12;B=8'd12;CIN=1'b1;#10 A=8'd112;B=8'd115;CIN=1'b0;endendmodule三、实验过程1、上机过程2、仿真波形3、波形说明波形图中,从上至下依次为:输入加数A、输入加数B、输入进位CIN、输出进位COUT、输出与SUM。
组成原理课下报告_8位并串行加法器
组成原理课外实践报告(第二次)院系:计算机学院专业班:信息安全0902学号:U200915316姓名:丁洪鑫老师:秦磊华时间:2011.5一.题目要求利用EDA 软件分别设计一个先行进位和行波进位的8位加法器,分别对它们进行时序分析,比较先行进位和行波进位在时间上的差别。
二.实践准备1. 了解EDA (基于MAX+plus )在做这个实践题目之前,并未接触过EDA 技术和实际的EDA 软件。
在查阅了相关书籍后,对EDA 技术有了两方面的初步认识(足以解决本实践问题):1. VHDL 语言算法(自顶向下)。
这种语言以前并未接触学习过,故在实践开始前做了一些粗浅的自学功课。
总的说来即是避开复杂的逻辑运算与原理图设计,用比较简洁的VHDL 语言直接描述器件的逻辑结构,编译成功后可利用该EDA 软件(本实践中利用的是MAX+plus 工具)进行时序仿真并进行延时分析。
本实践中的先行进位8位加法器即用VHDL 语言来描述实现。
2. 原理图输入设计(自底向上)。
这是传统的电子设计技术,在这里结合VHDL 语言(即先利用VHDL 语言设计一位全加器封装后用于原理图设计)用原理图的传统方法来设计8位行波进位加法器。
2.理论分析1)行波进位加法器行波进位加法器即串行进位加法器。
可以用一位全加器FA 直接相连得到(低FA 的进位输出直接与相邻的高位FA 的进位输出相连),如图C0 A0B0A7 B7 F7F0 C7FA FAFA FA FA FA FA FA图中进位表达式为:C 0=X(未知)C 1=A 0B 0+(A 0+B 0)C 0C 2=A 1B 1+(A 1+B 1)C 1……C 7=A 6B 6+(A 6+B 6)C 6由公式知,高位进位产生依赖于相邻地位的进位输出,由于高位运算需要等待地位的运算,因此串行进位加法器的速度较慢。
2)并行进位加法器由串行进位的进位表达式,得到下式:C 0=0C 1=A 0B 0+(A 0+B 0)C 0=A 0B 0C 2=A 1B 1+(A 1+B 1)C 1=A 1B 1+(A 1+B 1)A 0B 0C 3=A 2B 2+(A 2+B 2)C 2=A 2B 2+(A 2+B 2)A 1B 1+(A 2+B 2)(A 1+B 1)A 0B 0……C 7=A 6B 6+(A 6+B 6)A 5B 5+(A 6+B 6)(A 5+B 5)A 4B 4+(A 6+B 6)(A 5+B 5)(A 4+B 4)A 3B 3+(A 6+B 6)(A 5+A 5)(A 4+B 4)(A 3+B 3)A 2B 2+(A 6+B 6)(A 5+B 5)(A 4+B 4)(A 3+B 3)(A 2+B 2)A 1B 1由公式可以看出,每一个进位的产生都不不互相依赖,只要给出C 0 ,加数和被加数即可算出所有的进位,即可同时计算。
verilog语言编写8位全加器
由一位全加器构成8位全加器电科6012202023 裴佳文一、实验目的用verilog语言编写由1位全加器构成8位全加器,自行编写testbench代码并在modelsim软件上进行仿真。
二、代码1、源代码:1位全加器:module P1(A,B,Cin,sum,Cout);input A,B,Cin;output sum,Cout;wire s1,t1,t2,t3;xor x1(s1,A,B),x2(sum,s1,Cin);and A1(t3,A,B),A2(t2,B,Cin),A3(t1,A,Cin);or o1(Cout,t1,t2,t3);endmodule由1位全加器构成8位全加器module P(J,W,Psum,PCout,PCin);input [7:0] J,W;input Pcin;output [7:0] Psum;output Pcout;wire [7:1]Ptemp;P1:PA1(.A(J[0]),.B(W[0]),.Cin(PCin),.sum(Psum[0]),.Cout(Ptemp[1])),PA2(.A(J[1]),.B(W[1]),.Cin(Ptemp[1]),.sum(Psum[1]),.Cout(Ptemp[2])),PA3(.A(J[2]),.B(W[2]),.Cin(Ptemp[2]),.sum(Psum[2]),.Cout(Ptemp[3])), PA4(.A(J[3]),.B(W[3]),.Cin(Ptemp[3]),.sum(Psum[3]),.Cout(Ptemp[4])),PA5(.A(J[4]),.B(W[4]),.Cin(Ptemp[4]),.sum(Psum[4]),.Cout(Ptemp[5]))PA6(.A(J[5]),.B(W[5]),.Cin(Ptemp[5]),.sum(Psum[5]),.Cout(Ptemp[6])) PA7(.A(J[6]),.B(W[6]),.Cin(Ptemp[6]),.sum(Psum[6]),.Cout(Ptemp[7])) PA8(.A(J[7]),.B(W[7]),.Cin(Ptemp[7]),.sum(Psum[7]),.Cout(PCout). endmodule2、激励:`timescale 1ns/100psmodule P_tb;reg[7:0] A,B;reg CIN;wire [7:0] SUM;wire COUT;P ul(.Psum(SUM),.PCout(COUT),.J(A),.W(B),.PCin(CIN));initialbeginA=8'd0;B=8'd0;CIN=1'b0;#10 A=8'd20;B=8'd129;CIN=1'b1;#10 A=8'd27;B=8'd19;CIN=1'b0;#10 A=8'd157;B=8'd29;CIN=1'b0;#10 A=8'd37;B=8'd68;CIN=1'b0;#10 A=8'd11;B=8'd69;CIN=1'b0;#10 A=8'd54;B=8'd67;CIN=1'b1;#10 A=8'd211;B=8'd0;CIN=1'b0;#10 A=8'd87;B=8'd43;CIN=1'b1;#10 A=8'd23;B=8'd171;CIN=1'b0;#10 A=8'd12;B=8'd12;CIN=1'b1;#10 A=8'd112;B=8'd115;CIN=1'b0;endendmodule三、实验过程1、仿真过程2、仿真波形3、波形说明波形图中,从上至下依次为:输入加数A、输入加数B、输入进位CIN、输出进位COUT、输出和SUM。
八位运算器实验报告
《组成原理》实验报告姓名:***____________专业:网络工程________学号:**********______日期:2014年11月25日实验一:8位运算器的设计1,设计目的:1)学习并练习verilog语言2)了解8位加法器实现原理2,设计目标:1)使用verilog语言编写8为运算器并进行仿真模拟3,模块设计规格及输入输出端变量说明1)3模块设计规格及输入输出端变量说明:输入:[2:0]s(操作指令), LDA,LDB(输入控制), [7:0]IN(输入数);输出:[7:0]A,B(操作数), ALU(结果寄存器),FZ(判零), FC(进位);2)操作指令表:4,程序原理连接图5,程序代码Module test (T4,s,A,B,LDA,LDB,FZ,FC,IN,ALU);input [2:0] s;input LDA,LDB,T4;input [7:0] IN;output [7:0] A,B,ALU;output FZ,FC;reg [7:0] A,B,ALU;reg FZ,FC;/** 输入模块,当clk上升沿时,如果LDA为1,则把IN的值给A,否则赋给B */always @ (posedge CLK)beginif(LDA==1'b1)beginA<=IN;endelse if(LDB==1'b1)beginB<=IN;endend/**计算模块,根据操作数s的不同值为A和B进行八种不同的计算,其中当A+B *进行加法计算时,把进位值赋给FC*/always @ (s[2] or s[1] or s[0])begincase ({s[2],s[1],s[0]})3'b000:ALU<=A;//直接赋值3'b001:ALU<=A&B;//A与B按位与3'b010:ALU<=A|B;//A与B按位或3'b011:ALU<=~A;//非A3'b100:ALU<=(A<<1);//A左移一位3'b101:{FC,ALU}<=A+B;//ALU=A+B,FC为A+B的进位3'b110:ALU<=A+1;//加一操作3'b111:ALU<=A-1;//减一操作endcaseend/**该模块的作用是判断ALU是否为,若是FZ赋为1*/always @ (negedge T4)beginif(ALU==8'b00000000)FZ<=1'b1;elseFZ<=1'b0;endendmodule6时序仿真图:。
作业-基于verilog HDL的八位超前进位加法器
基于verilog HDL的八位超前进位加法器Verilog 综合作业陈孙文2011-10-25指导老师:邓婉玲老师目录:1. 超前进位加法器原理2. 算法代码3. modelsim SE软件实现功能仿真4. synplify pro软件实现综合正文:一、原理(1)、全加器列出真值表如表所示,若Ai、Bi两个一位二进制数相加,以Ci表示来自低位的的进位,Si表示和,Ci表示向高位的进位,可以看出该电路考虑来低位的进位,是一个一位数的全加器电路,其逻辑符号如图所示。
串并行超前进位加法器的特点是:各级进位信号同时产生,减小或消除因进位信号逐级传递所用的时间。
每一位的进位信号不依赖于从低位逐级传递,而是—开始就能确定。
全加器真值可以得到逻辑表达式:为表达简单,定义两个中间变量Gi和Pi得出得到各位进位信号的逻辑表达式为:当实际位数较多时,往往将全部数位按4位一组分成若干组,组内采用超前进位,组间采用串行进价,组成所谓的串并行进位加法器。
二、算法代码:有4bits.v、8bits.v、testbench.v三个文件;4bits.v实现输入为4位数的加法器;8bits.v中调用4bits.v中的函数来实现8位数相加;testbench.v 为测试代码;实现四位加法4bits.v部分:module fast_adder4b(ina,inb,carry_in,sum_out,clk,rst_n);parameter ADDER_WIDTH=4;parameter SUM_WIDTH=5;input [ADDER_WIDTH-1:0]ina; //输入数ina,8位input [ADDER_WIDTH-1:0]inb; //输入数inb,8位input carry_in;input rst_n;input clk;output [SUM_WIDTH-1:0] sum_out;reg [SUM_WIDTH-1:0] sum_out;wire [ADDER_WIDTH-1:0]sg;wire [ADDER_WIDTH-1:0]sp;wire [ADDER_WIDTH-1:0]sc;assign sg[0]=ina[0]&inb[0]; //中间变量G0=ina0&inb0;assign sg[1]=ina[1]&inb[1];assign sg[2]=ina[2]&inb[2];assign sg[3]=ina[3]&inb[3];assign sp[0]=ina[0]^inb[0]; //中间变量P0=ina0^inb0;assign sp[1]=ina[1]^inb[1];assign sp[2]=ina[2]^inb[2];assign sp[3]=ina[3]^inb[3];assign sc[0]=sg[0]|(sp[0]&carry_in); //进位位C0assign sc[1]=sg[1]|(sp[1]&(sg[0]|(sp[0]&carry_in)));assign sc[2]=sg[2]|(sp[2]&(sg[1]|(sp[1]&(sg[0]|(sp[0]&carry_in)))));assign sc[3]=sg[3]|(sp[3]&(sg[2]|(sp[2]&(sg[1]|(sp[1]&(sg[0]|(sp[0]&carry_in)))))));always@(posedge clk or negedge rst_n)beginif(!rst_n)sum_out<=5'b00000;elsebeginsum_out[0]<=sp[0]^carry_in; //输出结果位sum_out[1]<=sp[1]^sc[0];sum_out[2]<=sp[2]^sc[1];sum_out[3]<=sp[3]^sc[2];sum_out[4]<=sc[3];endendendmodule实现八位加法8bits.v部分:module pipe_adder8b(ina,inb,sum_out,clk,rst_n);parameter ADDER_WIDTH=8;parameter SUM_WIDTH=9;parameter HALF_ADDER_WIDTH=4;input [ADDER_WIDTH-1:0]ina;input [ADDER_WIDTH-1:0]inb;input rst_n;input clk;output[SUM_WIDTH-1:0] sum_out;reg [SUM_WIDTH-1:0] sum_out;reg [HALF_ADDER_WIDTH-1:0] ina_lsb;reg [HALF_ADDER_WIDTH-1:0] ina_msb;reg [HALF_ADDER_WIDTH-1:0] inb_lsb;reg [HALF_ADDER_WIDTH-1:0] inb_msb;reg [HALF_ADDER_WIDTH-1:0] ina_msb1;reg [HALF_ADDER_WIDTH-1:0] inb_msb1;reg [HALF_ADDER_WIDTH:0] sum11;wire[HALF_ADDER_WIDTH:0] sum1;wire[HALF_ADDER_WIDTH:0] sum2;always @(posedge clk or negedge rst_n)beginif(!rst_n)beginina_lsb<=4'b0000;ina_msb<=4'b0000;inb_lsb<=4'b0000;inb_msb<=4'b0000;endelsebeginina_lsb<=ina[3:0];ina_msb<=ina[7:4];inb_lsb<=inb[3:0];inb_msb<=inb[7:4];endendfast_adder4b u1(ina_lsb,inb_lsb,1'b0,sum1,clk,rst_n); //低四位调用4位加法器模块always @(posedge clk or negedge rst_n)beginif(!rst_n)beginina_msb1<=4'b0000;inb_msb1<=4'b0000;endelsebeginina_msb1<=ina_msb;inb_msb1<=inb_msb;endendfast_adder4b u2(ina_msb1,inb_msb1,sum1[4],sum2,clk,rst_n); //高四位调用4位加法器模块always @(posedge clk or negedge rst_n)beginif(!rst_n)sum11<=4'b0000;elsesum11<=sum1;endalways @(posedge clk or negedge rst_n)beginif(!rst_n)sum_out<=9'b0000_00000;elsesum_out<={sum2,sum11[3:0]};endendmoduletestbengch.v部分:`timescale 1ns/1nsmodule test_8a;reg clk,rst_n;reg [7:0]ina,inb;wire [8:0]sum_out;always #20 clk=~clk; //时钟信号40ns一个周期initialbeginrst_n=1;clk=0;#30ina=43; //给a赋值43inb=61;#200 rst_n=0;#40 rst_n=1;#2000 $stop;end//fast_adder4b bbb(.ina(ina),.inb(inb),.carry_in(1'b0),.sum_out(sum_out),.clk(clk),.rst_n(rst_n));pipe_adder8b te(.ina(ina),.inb(inb),.sum_out(sum_out),.clk(clk),.rst_n(rst_n));endmodule三、modelsim软件实现功能仿真三个代码文件compile通过之后,执行simulation;添加待观察端口到波形图wave中,执行simulation->run all命令,在wave波形图中得到以下的仿真波形:四、synplify pro软件综合。
EDA与VHDL实现8位加法器
EDA技术与VHDL实训姓名:李*班级:电信**-*学号:12********电子与信息工程学院8位加法器设计一实训目的1.学习使用VHDL语言设计电路,加深对VHDL语言的理解与应用。
2.学习8位加法器的VHDL程序设计方法。
3.学习例化语句的应用,并能够利用例化语句完成从半加器到全加器的设计。
二加法器加法器是为了实现加法的。
即是产生数的和的装置。
加数和被加数为输入,和数与进位为输出的装置为半加器。
若加数、被加数与低位的进位数为输入,而和数与进位为输出则为全加器。
常用作计算机算术逻辑部件,执行逻辑操作、移位与指令调用。
对于1位的二进制加法,相关的有五个的量:1,被加数A,2,被加数B,3,前一位的进位CIN,4,此位二数相加的和S,5,此位二数相加产生的进位COUT。
前三个量为输入量,后两个量为输出量,五个量均为1位。
对于32位的二进制加法,相关的也有五个量:1,被加数A(32位),2,被加数B(32位),3,前一位的进位CIN(1位),4,此位二数相加的和S(32位),5,此位二数相加产生的进位COUT(1位)。
要实现32位的二进制加法,一种自然的想法就是将1位的二进制加法重复32次(即逐位进位加法器)。
这样做无疑是可行且易行的,但由于每一位的CIN都是由前一位的COUT 提供的,所以第2位必须在第1位计算出结果后,才能开始计算;第3位必须在第2位计算出结果后,才能开始计算,等等。
而最后的第32位必须在前31位全部计算出结果后,才能开始计算。
这样的方法,使得实现32位的二进制加法所需的时间是实现1位的二进制加法的时间的32倍。
三实训内容首先设计半加器,然后用例化语句将它们连接起来。
利用半加器和或门构成1位全加器,以1位全加器为基本硬件,构成串行进位的8位加法器。
3.1 设计1位半减器利用真值表设计1位半减器。
图3-1中的h_add是半加器,sum是输出和,a_out是进位输出,add_in是进位输入。
verilog八位十进制计数器实验报告(附源代码)
verilog⼋位⼗进制计数器实验报告(附源代码)8位10进制计数器实验报告⼀、实验⽬的●学习时序逻辑电路●学会⽤verilog语⾔设计时序逻辑电路●掌握计数器的电路结构●掌握数码管动态扫描显⽰原理⼆、实验内容实现⼀个8bit⼗进制(BCD码)计数器端⼝设置:⽤拨动开关实现复位和使能LED灯来表⽰8位数据⽤数码管显⽰16进制的⼋位数据1.复位时计数值为8‘h02.复位后,计数器实现累加操作,步长为1,逢9进1,,计数值达到8‘h99后,从0开始继续计数3.使能信号为1时正常计数,为0时暂停计数,为1时可继续计数。
4.每0.5s计数值加15.8位的结果显⽰在LED灯上,其中LED灯亮表⽰对应的位为1,LED灯灭表⽰对应的灯为06.⽤isim进⾏仿真,⽤forever语句模拟时钟信号输⼊,并给变量赋值仿真initial语句。
7.⽤7段数码管的后两位显⽰16进制下8位结果。
三、实验结果烧写结果:拨动reset开关到1时,LED灯显⽰10010000,7段数码管显⽰“90”。
之后拨动WE开关呢,开始计数,LED开始变化并且7段数码管开始计数。
从99后到达00,LED重新开始从00000000开始亮,且数码管重新从00开始计数。
之后拨动WE开关,暂停计数,LED暂停亮灭,七段数码管暂停变化,WE拨回1,继续计数。
拨动复位信号时,⽆视WE信号,直接复位。
仿真结果:当输⼊reset信号时波形变化如下当达到⼀个扫描信号的周期时的波形如下当达到⼀个以上计数信号的周期时的波形实验分析:实验总体结构和模块间关系如图所⽰:(其中还需要补上使能信号)实验原理:由于要求实现数码管和LED灯的显⽰,先考虑LED灯,可以直接由8位输出信号控制,⽽数码管需要同时显⽰两个不同的数字,需要时分复⽤,即快速的交替显⽰⼗位和个位,利⽤⼈眼的视觉暂留来达到同时显⽰。
这样就需要两种不同的频率信号。
⼀种是每0.5s⼀次,作为计数信号,⽤脉冲⽣成器⽣成,另⼀种是1ms⼀次的扫描信号,⽤降频器⽣成,将计数信号输⼊计数器来计数,并将计数的值和扫描信号同时输⼊扫描显⽰模块。
8位加法器实验报告
6.1 实验一:8位加法器的设计1.实验目的(1)学习isEXPERT/MAX+plusisEXPERT/MAX+plus II/Foudation Series 软件的基本使用方法。
(2)学习GW48-CK EDA实验开发系统的基本使用方法。
(3)了解VHDL程序的基本结构。
2.实验内容设计并调试好一个由两个4位二进制并行加法器级联而成的8位二进制加法器,并用GW48-CK EDA实验开发系统(拟采用的实验芯片的型号为ispLSI1032E PLCC-84或EPF10K10LC84-3或XCS05/XL PLCC84)进行硬件验证。
3.实验条件(1)开发设备:Lattice ispEXPERT。
(2)实验设备:GW48-CK EDA实验开发系统。
(3)拟用芯片:ispLSI1032E PLCC-84或EPF10K10LC84-3或XCS05/XL PLCC84。
4.实验设计1)系统的原理框图2)VHDL源程序(1)4位二进制并行加法器的源程序ADDER4B.VHDLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY ADDER4B ISPORT(C4: IN STD_LOGIC;A4: IN STD_LOGIC_VECTOR(3 DOWNTO 0);B4: IN STD_LOGIC_VECTOR(3 DOWNTO 0);S4: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);CO4: OUT STD_LOGIC);END ENTITY ADDER4B;ARCHITECTURE ART OF ADDER4B ISSIGNAL S5: STD_LOGIC_VECTOR(4 DOWNTO 0);SIGNAL A5,B5: STD_LOGIC_VECTOR(4 DOWNTO 0);BEGINA5<='0'&A4;B5<='0'&B4;S5<=A5+B5+C4;S4<=S5(3 DOWNTO 0);CO4<=S5(4);END ARCHITECTURE ART;(2)8位二进制加法器的源程序ADDER8B.VHDLIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY ADDER8B ISPORT(C8: IN STD_LOGIC;A8: IN STD_LOGIC_VECTOR(7 DOWNTO 0);B8: IN STD_LOGIC_VECTOR(7 DOWNTO 0);S8: OUT STD_LOGIC_VECTOR(7 DOWNTO 0);CO8: OUT STD_LOGIC);END ENTITY ADDER8B;ARCHITECTURE ART OF ADDER8B ISCOMPONENT ADDER4B ISPORT(C4: IN STD_LOGIC;A4: IN STD_LOGIC_VECTOR(3 DOWNTO 0);B4: IN STD_LOGIC_VECTOR(3 DOWNTO 0);S4: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);CO4: OUT STD_LOGIC);END COMPONENT ADDER4B;SIGNAL SC:STD_LOGIC;BEGINU1:ADDER4BPORT MAP(C4=>C8,A4=>A8(3 DOWNTO 0),B4=>B8(3 DOWNTO 0),S4=>S8(3 DOWNTO 0),CO4=>SC);U2:ADDER4BPORT MAP(C4=>SC,A4=>A8(7 DOWNTO 4),B4=>B8(7 DOWNTO 4),S4=>S8(7 DOWNTO 4),CO4=>CO8);END ARCHITECTURE ART;5.系统仿真文件预计当输入为以下值时C8: 0 1 1 00A8: 10 02 FF 02B8:11 04 FF 02与之对应的输出应该为CO8:0 0 1 0S8:21 07 FF 04仿真结果为:6.实验小结本实验使我加深了对加法器的了解,也使我学会了isEXPERT/MAX+plus软件的基本操作,使我对VHDL程序有了更深的了解,但是我不知道是不是我的软件问题,仿真结果是正确的,但CO8那一行为什么与别的行不一样,为什么是阴影的,还有就是S8那一行出现的那些红色“XXX”我不知道事怎么回事,希望老师给我解释一下。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于verilog HDL的八位超前进位加法器
Verilog 综合作业陈孙文
2011-10-25
指导老师:邓婉玲老师目录:
1. 超前进位加法器原理
2. 算法代码
3. modelsim SE软件实现功能仿真
4. synplify pro软件实现综合
正文:
一、原理
(1)、全加器
列出真值表如表所示,若Ai、Bi两个一位二进制数相加,以Ci表示来自低位的的进位,Si表示和,Ci表示向高位的进位,可以看出该电路考虑来低位的进位,是一个一位数的全加器电路,其逻辑符号如图所示。
串并行超前进位加法器的特点是:各级进位信号同时产生,减小或消除因进位信号逐级传递所用的时间。
每一位的进位信号不依赖于从低位逐级传递,而是—开始就能确定。
全加器真值可以得到逻辑表达式:
为表达简单,定义两个中间变量Gi和Pi
得出
得到各位进位信号的逻辑表达式为:
当实际位数较多时,往往将全部数位按4位一组分成若干组,组内采用超前进位,组间采用串行进价,组成所谓的串并行进位加法器。
二、算法代码:有4bits.v、8bits.v、testbench.v三个文件;
4bits.v实现输入为4位数的加法器;8bits.v中调用4bits.v中的函数来实现8位数相加;testbench.v 为测试代码;
实现四位加法4bits.v部分:
module fast_adder4b(ina,inb,carry_in,sum_out,clk,rst_n);
parameter ADDER_WIDTH=4;
parameter SUM_WIDTH=5;
input [ADDER_WIDTH-1:0]ina; //输入数ina,8位
input [ADDER_WIDTH-1:0]inb; //输入数inb,8位
input carry_in;
input rst_n;
input clk;
output [SUM_WIDTH-1:0] sum_out;
reg [SUM_WIDTH-1:0] sum_out;
wire [ADDER_WIDTH-1:0]sg;
wire [ADDER_WIDTH-1:0]sp;
wire [ADDER_WIDTH-1:0]sc;
assign sg[0]=ina[0]&inb[0]; //中间变量G0=ina0&inb0;
assign sg[1]=ina[1]&inb[1];
assign sg[2]=ina[2]&inb[2];
assign sg[3]=ina[3]&inb[3];
assign sp[0]=ina[0]^inb[0]; //中间变量P0=ina0^inb0;
assign sp[1]=ina[1]^inb[1];
assign sp[2]=ina[2]^inb[2];
assign sp[3]=ina[3]^inb[3];
assign sc[0]=sg[0]|(sp[0]&carry_in); //进位位C0
assign sc[1]=sg[1]|(sp[1]&(sg[0]|(sp[0]&carry_in)));
assign sc[2]=sg[2]|(sp[2]&(sg[1]|(sp[1]&(sg[0]|(sp[0]&carry_in)))));
assign sc[3]=sg[3]|(sp[3]&(sg[2]|(sp[2]&(sg[1]|(sp[1]&(sg[0]|(sp[0]&carry_in)))))));
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
sum_out<=5'b00000;
else
begin
sum_out[0]<=sp[0]^carry_in; //输出结果位
sum_out[1]<=sp[1]^sc[0];
sum_out[2]<=sp[2]^sc[1];
sum_out[3]<=sp[3]^sc[2];
sum_out[4]<=sc[3];
end
end
endmodule
实现八位加法8bits.v部分:
module pipe_adder8b(ina,inb,sum_out,clk,rst_n);
parameter ADDER_WIDTH=8;
parameter SUM_WIDTH=9;
parameter HALF_ADDER_WIDTH=4;
input [ADDER_WIDTH-1:0]ina;
input [ADDER_WIDTH-1:0]inb;
input rst_n;
input clk;
output[SUM_WIDTH-1:0] sum_out;
reg [SUM_WIDTH-1:0] sum_out;
reg [HALF_ADDER_WIDTH-1:0] ina_lsb;
reg [HALF_ADDER_WIDTH-1:0] ina_msb;
reg [HALF_ADDER_WIDTH-1:0] inb_lsb;
reg [HALF_ADDER_WIDTH-1:0] inb_msb;
reg [HALF_ADDER_WIDTH-1:0] ina_msb1;
reg [HALF_ADDER_WIDTH-1:0] inb_msb1;
reg [HALF_ADDER_WIDTH:0] sum11;
wire[HALF_ADDER_WIDTH:0] sum1;
wire[HALF_ADDER_WIDTH:0] sum2;
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
ina_lsb<=4'b0000;
ina_msb<=4'b0000;
inb_lsb<=4'b0000;
inb_msb<=4'b0000;
end
else
begin
ina_lsb<=ina[3:0];
ina_msb<=ina[7:4];
inb_lsb<=inb[3:0];
inb_msb<=inb[7:4];
end
end
fast_adder4b u1(ina_lsb,inb_lsb,1'b0,sum1,clk,rst_n); //低四位调用4位加法器模块
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
ina_msb1<=4'b0000;
inb_msb1<=4'b0000;
end
else
begin
ina_msb1<=ina_msb;
inb_msb1<=inb_msb;
end
end
fast_adder4b u2(ina_msb1,inb_msb1,sum1[4],sum2,clk,rst_n); //高四位调用4位加法器模块always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
sum11<=4'b0000;
else
sum11<=sum1;
end
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
sum_out<=9'b0000_00000;
else
sum_out<={sum2,sum11[3:0]};
end
endmodule
testbengch.v部分:
`timescale 1ns/1ns
module test_8a;
reg clk,rst_n;
reg [7:0]ina,inb;
wire [8:0]sum_out;
always #20 clk=~clk; //时钟信号40ns一个周期
initial
begin
rst_n=1;
clk=0;
#30
ina=43; //给a赋值43
inb=61;
#200 rst_n=0;
#40 rst_n=1;
#2000 $stop;
end
//fast_adder4b bbb(.ina(ina),.inb(inb),.carry_in(1'b0),.sum_out(sum_out),.clk(clk),.rst_n(rst_n));
pipe_adder8b te(.ina(ina),.inb(inb),.sum_out(sum_out),.clk(clk),.rst_n(rst_n));
endmodule
三、modelsim软件实现功能仿真
三个代码文件compile通过之后,执行simulation;添加待观察端口到波形图wave中,执行simulation->run all命令,在wave波形图中得到以下的仿真波形:
四、synplify pro软件综合。