1、计算机组成原理与汇编语言实验报告实验二 : 加减法运算器的设计与实现专业班级:xxxxxxxxxx学号:xxxxxxx 姓名:xxx学号:xxxxxxx 姓名:xxx实验地点: 实验时间:实验二 加减法运算器的设计一、实验目的 1、理解加减法运算器的原理图设计方法2、掌握加减法运算器的 VERILOG语言描述方法3、理解超前进位算法的基本原理4、掌握基于模块的多位加减运算器的层次化设计方法5、掌握溢出检测方法和标志线的生成技术6、掌握加减运算器的宏模块设计方法二、实验任务1、 用 VERILOG设计完成一个 4位行波进位的加减法运算器,要求有溢出和进位标志,并封装成模块。模块的端口描述如下:m
2、odule lab2_RippleCarry 宽度可定制(默认为 4 位)的行波进位有符号数的加减法器。#(parameter WIDTH=4)( input signed WIDTH-1:0 dataa,input signed WIDTH-1:0 datab,input add_sub, / if this is 1, add; else subtractinput clk, input cclr,input carry_in, /1 表示有进位或借位output overflow,output carry_out, output reg WIDTH-1:0 result)2、 修改上述运
3、算器的进位算法,设计超前进位无符号加法算法器并封装成模块。模块的端口描述如下:module lab2_LookaheadCarry / 4 位超前进位无符号加法器(input 3:0 a,input 3:0 b,input c0, /carry_ininput clk, input cclr,output reg carry_out,output reg 3:0sum);3、 在上述超前进位加法运算器的基础上,用基于模块的层次化设计方法,完成一个 32位的加法运算器,组内超前进位,组间行波进位。4、 用宏模块的方法实现一个 8位加减运算器。三、 实验步骤1 编写 VERILOG 代码2 功能仿
4、真进行分析与综合,排除语法上的错误建立波形仿真文件,输入激励生成功能仿真网表进行功能仿真,观察输出结果3 选择器件DE2_70 开发板的使用者请选择 EP2C70F896C64 绑定管脚5 下载验证DE2_70 开发板的下载:使用 USB-Blaster 进行下载四、实验内容任务一:module lab2_RippleCarry#(parameter WIDTH=4)(input signed WIDTH-1:0 dataa,input signed WIDTH-1:0 datab,input add_sub, / if this is 1, add; else subtractinput c
5、lk, input cclr,input carry_in,output overflow,output carry_out,output reg WIDTH-1:0 result);/内部变量wire WIDTH:0 dataa_temp;wire WIDTH:0 datab_temp;reg WIDTH:0 ci_temp;reg WIDTH:0 result_temp;reg carry_in_temp;integer i; integer temp ;assign dataa_tempWIDTH:0= dataaWIDTH-1,dataaWIDTH-1:0;/扩展 aassign da
6、tab_tempWIDTH:0=(add_sub=1)?databWIDTH-1,databWIDTH-1:0:databWIDTH-1,databWIDTH-1:0;/扩展 bassign overflow= (result_tempWIDTHresult_tempWIDTH-1)=1?1b1:1b0; assign carry_out=ci_tempWIDTH;always (dataa_temp or datab_temp or carry_in )begincarry_in_temp=(add_sub=1)?carry_in:carry_in;ci_temp0=carry_in_tem
7、p;temp=carry_in_temp;result_temp0= dataa_temp0datab_temp0ci_temp0; for (i=0;iWIDTH;i=i+1)begin ci_tempi+1=(dataa_tempidatab_tempi)/行波进位result_tempi+1= dataa_tempi+1datab_tempi+1ci_tempi+1; temp=ci_tempi+1;end endalways (posedge clk or negedge cclr)beginif (!cclr )begin result= 0;end else begin resul
8、tWIDTH-1:0=result_tempWIDTH-1:0;endendendmodule任务二:module task2_2 / 4 位超前进位无符号(input 3:0 a,input 3:0 b,input c0, /carry_ininput clk, input cclr,output reg carry_out,output reg 3:0sum);/内部变量wire c1,c2,c3,c4;wire e0,e1,e2,e3;wire p0,p1,p2,p3; /进位产生信号wire g0,g1,g2,g3; /进位传递信号wire sum0,sum1,sum2,sum3;as
9、sign g0=a0assign g1=a1assign g2=a2assign g3=a3assign p0=a0|b0;assign p1=a1|b1;assign p2=a2|b2;assign p3=a3|b3;assign e0=a0b0;assign e1=a1b1;assign e2=a2b2;assign e3=a3b3;assign c1=g0|c0assign c2=g1|c1/ g1 + p1g0 + p1p0c0assign c3=g2|c2/g2 + p2g1 + p2p1g0 + p2p1p0c0assign c4=g3|c3/g3 + p3g2 + p3p2g1
10、+ p3p2p1g0 + p3p2p1p0c0assign sum0=e0c0;assign sum1=e1c1;assign sum2=e2c2;assign sum3=e3c3;always (posedge clk or negedge cclr)beginif (!cclr )begin sum= 0;carry_out=0;end else begin sum=sum3,sum2,sum1,sum0;carry_out=c4;endendendmodule五、思考题1、加减运算电路中减法是如何实现的?设计一个控制加减法的信号 add。若 add为 1,做加法;若 add为 0做减法。
11、当做加法时,被加数不变,仍然保持补码形式;当做减法时,对其取反加一,然后再与被加数相加2、超前进位的原理是什么?G = A and B ,P = A xor Bc1 = g0 + p0c0 c2 = g1 + p1c1= g1 + p1(g0 + p0c0) = g1 + p1g0 + p1p0c0c3 = g2 + p2c2= g2 + p2(g1 + p1g0 + p1p0c0)= g2 + p2g1 + p2p1g0 + p2p1p0c0c4 = g3 + p3c3= g3 + p3(g2 + p2g1 + p2p1g0 + p2p1p0c0) = g3 + p3g2 + p3p2g1
12、+ p3p2p1g0 + p3p2p1p0c0 3、列出三种溢出检测算法?fA 和 fB :表示两操作数(A 、B )的符号位,Fs :表示结果的符号位,OVL=(!fA)(!fB)fS+fAfB(!fS) 若 OVL 为 1,则表示溢出。 Cf :表示符号位的进位。C : 表示数值最高位的进位。若 OVL=CCf 为 1,表示计算结果溢出。 fs1 和 fs2:表示结果的双符号位(变形补码) 。结果溢出时,机器应能自动检测,然后转入中断处理。 若 OVL=fs1fs2 为 1,表示结果溢出。4、标志线的生成方法是什么?标志线是能够表示设备运行状态的线,像为零线,为负线,都是标志线。它常常成为机器进行某种动作的条件。一般来说,标志线可以根据一组数据,对其进行组合逻辑运算,就可以生成标志线。5、 如何理解模块封装和层次化的设计思想?模块化的设计体现了自上而下的设计思想。对于较大的工程,需要分析清楚设计层次。模块化封装可以很好体现这一个思想。6、宏模块的设计有何优点与缺点?应在何时使用?免去了自己设计的繁琐过程,直接就可以调用,方便快捷。但是,宏模块功能都是系统已经定义好的,不能自己定制有特定功能的模块,不能对其修改。