数电实验实验报告资料.docx
- 文档编号:15563491
- 上传时间:2023-07-05
- 格式:DOCX
- 页数:20
- 大小:381.82KB
数电实验实验报告资料.docx
《数电实验实验报告资料.docx》由会员分享,可在线阅读,更多相关《数电实验实验报告资料.docx(20页珍藏版)》请在冰点文库上搜索。
数电实验实验报告资料
数电实验实验报告
实验题目:
ALU算数逻辑单元设计
姓名:
黎俣珩、戴超男
班级:
2010001010
学号:
2010001010001、2010021010013
指导老师:
陈学英、李书洋
地点与时间:
6.8科研楼A304
【摘要】:
作为‘计算器’功能的ALU可以进行二进制的一些简单的运算,例如加减乘以及左右移位,从而形成一个复合的运算单元,这次的实验中,我们即基于FPGA的基础上,利用ISE软件完成ALU的设计和仿真工作。
一、任务要求
1.1实验目的
(1)熟悉用ISE软件进行设计的流程;
(2)掌握ALU逻辑运算单元的电路结构与运算机制,掌握ALU的运算模块及其设计方法,编写几种简单的数字运算的程序;
(3)熟悉FPGA硬件平台的基本知识;
(4)熟悉chipscope软件测试的方法;
利用VHDL语言,我们可以设计一个ALU逻辑运算单元,并调用ISE软件提供的IPcore用FPGA板实现程序下板,并用chipscope抓点观察产生的数字波形。
设计基本原理图如下:
图1
1.2实验指标
1、利用Modelsin软件编写出ALU的代码,根据仿真波形来验证代码的正确性以及运算的可靠性。
2、利用ISE设计出ALU的顶层连线结构与虚拟输入输出结构,将VHDL下载到实验FPGA板上,并使用chipscope进行电路实验,在软件上观察输出的数字的正确性和运算的可靠性。
二、实验原理及方案
2.1原理描述
算术逻辑单元是中央处理器(CPU)的执行单元,是所有中央处理器的核心组成部分,由"AndGate"和"OrGate"构成的算术逻辑单元,主要功能是进行二进制的算术运算,如加减乘(不包括整数除法)。
基本上,在所有现代CPU体系结构中,二进制都以二补数的形式来表示。
运算器包括寄存器、执行部件和控制电路3个部分。
在典型的运算器中有3个寄存器:
接收并保存一个操作数的接收寄存器;保存另一个操作数和运算结果的累加寄存器;在进行乘、除运算时保存乘数或商数的乘商寄存器。
执行部件包括一个加法器和各种类型的输入输出门电路。
控制电路按照一定的时间顺序发出不同的控制信号,使数据经过相应的门电路进入寄存器或加法器,完成规定的操作。
为了减少对存储器的访问,很多计算机的运算器设有较多的寄存器,存放中间计算结果,以便在后面的运算中直接用作操作数。
为了提高运算速度,某些大型计算机有多个运算器。
它们可以是不同类型的运算器,如定点加法器、浮点加法器、乘法器等,也可以是相同类型的运算器。
2.2实验方案
1.加法器,减法器:
使用Modelsim编译最基础的全加器,使用全加器层层构建出4位符号数加法器和减法器,在编译时,应该使用符号数加减法的基本原理,在构建加法器时遵循如下结构
图2
而当构建减法器时,应该使用相似的结构,因为减法即加法,只是加的数字是复数而已,因为考虑到符号位运算,故而采用取补码运算,最后只需要在FA1的进位位输入1,既可完成减法运算。
2.乘法器:
乘法器因为只要求无符号运算,因此采用徒手乘法的逻辑算法,将一层一层的乘法运算逐位相加,最后可以得到乘法运算值,乘法运算的搭建结构可以见图3。
图3
设计的时候使用P0,P1,P2,P3四个四位向量来代表两个4位二进制数每位相乘的结果,并按照顺序分别使用12个加法器完成对这16个数字的运算,得到乘法结果。
值得注意的是在搭建这个乘法器时,应该对布线特别小心。
因为结果相对比较复杂,因而在使用Modelsim编辑程序的时候,最好将各个数字按照条件分别编号,最后在分配各个加法器输入的时候就不会出错,而且速度相对起不按规矩编号的要快得多!
最终输出将以8位向量来表示这个乘法结果。
2.移位器:
本设计的ALU中的移位器的作用是将一个4位二进制数,扩展为8位后,对其进行移位操作。
而移位则分为左移位和右移位,控制移位数则是第二个输入的4位二进制数。
因此设计分为两个部分,左移位器和右移位器!
本设计中,两个输入均为4位二进制数,且第二个二进制数设定为有符号数,如果为负则网反向移位。
因此数位控制则由第二个输入的后三位控制。
3.选择器:
选择器的主要作用是由一个三位二进制来控制ALU的输出,我们将对应关系总结为表1。
从表中便可以很清楚地看出输入与输出的对应关系。
Instructions
Functions
001
Adder
010
Subtractor
011
Multiplier
100
LeftShift
101
RightShift
others
Reversed
表1.输入与输出控制关系表
实际设计结构如图4:
图4
三系统程序与仿真
3.1模块程序设计
本设计的模块设计主要分为6个模块:
(1)带符号运算加法器
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
entityfinal_adderis
port(data_a,data_b:
instd_logic_vector(3downto0);
data_s:
outstd_logic_vector(7downto0));
endfinal_adder;
architecturebehavoffinal_adderis
componentfull_adderis
Port(a:
instd_logic;
b:
instd_logic;
cin:
instd_logic;
cout:
outstd_logic;
s:
outstd_logic);
endcomponent;
signalcout1,cout2,cout3,cout4:
std_logic;
signala,b,data_s1:
std_logic_vector(4downto0);
begin
a<=data_a(3)&data_a;
b<=data_b(3)&data_b;
u0:
full_adderportmap(a=>a(0),b=>b(0),cin=>'0',s=>data_s1(0),cout=>cout1);
u1:
full_adderportmap(a=>a
(1),b=>b
(1),cin=>cout1,s=>data_s1
(1),cout=>cout2);
u2:
full_adderportmap(a=>a
(2),b=>b
(2),cin=>cout2,s=>data_s1
(2),cout=>cout3);
u3:
full_adderportmap(a=>a(3),b=>b(3),cin=>cout3,s=>data_s1(3),cout=>cout4);
u4:
full_adderportmap(a=>a(4),b=>b(4),cin=>cout4,s=>data_s1(4));
data_s<="111"&data_s1whendata_s1(4)='1'else
"000"&data_s1;
endbehav;
说明:
加法器采用的是普通的四位加法器,采用全加器的串行连接完成,同时由于输出位数的要求我们使用了强制补位的方法将输出的四位加法结果补至八位的标准输出位数。
其中,全加器的构建为:
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
entityfull_adderis
Port(a:
instd_logic;
b:
instd_logic;
cin:
instd_logic;
cout:
outstd_logic;
s:
outstd_logic);
endfull_adder;
architectureBehavioraloffull_adderis
begin
s<=axorbxorcin;
cout<=(aandb)or((aorb)andcin);
endBehavioral;
(2)带符号运算减法器
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
entityfinal_subis
port(data_a,data_b:
instd_logic_vector(3downto0);
data_s:
outstd_logic_vector(7downto0));
endfinal_sub;
architecturebehavoffinal_subis
componentadderfor_subis
port(data_a,data_b:
instd_logic_vector(3downto0);
data_s:
outstd_logic_vector(7downto0));
endcomponent;
signalb1,b2:
std_logic_vector(3downto0);
begin
b1<=not(data_b);
b2<=b1+"0001";
u0:
adderfor_subportmap(data_a=>data_a,data_b=>b2,data_s=>data_s);
endbehav;
说明:
减法器是采用将第二个数据取补码,然后使用加法器进行数据一和数据二补码数据的加法,以此来完成减法功能,同时由于补码的问题,减法器需要额外的对其进行‘8’的修正,以此来完善减法器。
其中,相应的加法器为:
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
entityadderfor_subis
port(data_a,data_b:
instd_logic_vector(3downto0);
data_s:
outstd_logic_vector(7downto0));
endadderfor_sub;
architecturebehavofadderfor_subis
componentfull_adderis
Port(a:
instd_logic;
b:
instd_logic;
cin:
instd_logic;
cout:
outstd_logic;
s:
outstd_logic);
endcomponent;
signalcout1,cout2,cout3,cout4:
std_logic;
signala,b,data_s1:
std_logic_vector(4downto0);
begin
a<=data_a(3)&data_a;
process(data_b)
begin
if(data_b="1000")thenb<='0'&data_b;
elseb<=data_b(3)&data_b;
endif;
endprocess;
u0:
full_adderportmap(a=>a(0),b=>b(0),cin=>'0',s=>data_s1(0),cout=>cout1);
u1:
full_adderportmap(a=>a
(1),b=>b
(1),cin=>cout1,s=>data_s1
(1),cout=>cout2);
u2:
full_adderportmap(a=>a
(2),b=>b
(2),cin=>cout2,s=>data_s1
(2),cout=>cout3);
u3:
full_adderportmap(a=>a(3),b=>b(3),cin=>cout3,s=>data_s1(3),cout=>cout4);
u4:
full_adderportmap(a=>a(4),b=>b(4),cin=>cout4,s=>data_s1(4));
data_s<="111"&data_s1whendata_s1(4)='1'else
"000"&data_s1whendata_s1(4)='0';
endbehav;
(3)无符号运算乘法器
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
entitymultiplieris
port(data_a,data_b:
instd_logic_vector(3downto0);
data_P:
outstd_logic_vector(7downto0));
endmultiplier;
architecturebehavofmultiplieris
componentfull_adder
Port(a:
instd_logic;
b:
instd_logic;
cin:
instd_logic;
cout:
outstd_logic;
s:
outstd_logic);
endcomponent;
subtypeABCisstd_logic_vector(0to3);
typetype_ppisarray(0to3)ofABC;
signalpp:
type_pp;
signali,j:
integer;
signals0,s1,c1,s2,c2,s3,s4,c4,s5,c5,s6,s7,c7,s8,c8,s9,s10:
std_logic;
begin
process(data_a,data_b)
begin
N1:
foriin0to3loop
N2:
forjin0to3loop
nextN1whenj>3;
pp(i)(j)<=data_a(i)anddata_b(j);
endloopN2;
endloopN1;
endprocess;
data_p(0)<=pp(0)(0);
u0:
full_adderportmap(a=>pp
(1)(0),b=>pp(0)
(1),cin=>'0',cout=>s0,s=>data_p
(1));
u1:
full_adderportmap(a=>pp
(1)
(1),b=>pp(0)
(2),cin=>'0',cout=>s1,s=>c1);
u2:
full_adderportmap(a=>pp
(1)
(2),b=>pp(0)(3),cin=>'0',cout=>s2,s=>c2);
u3:
full_adderportmap(a=>pp
(2)(0),b=>c1,cin=>s0,cout=>s3,s=>data_p
(2));
u4:
full_adderportmap(a=>pp
(2)
(1),b=>c2,cin=>s1,cout=>s4,s=>c4);
u5:
full_adderportmap(a=>pp
(1)(3),b=>pp
(2)
(2),cin=>s2,cout=>s5,s=>c5);
u6:
full_adderportmap(a=>pp(3)(0),b=>c4,cin=>s3,cout=>s6,s=>data_p(3));
u7:
full_adderportmap(a=>pp(3)
(1),b=>c5,cin=>s4,cout=>s7,s=>c7);
u8:
full_adderportmap(a=>pp
(2)(3),b=>pp(3)
(2),cin=>s5,cout=>s8,s=>c8);
u9:
full_adderportmap(a=>c7,b=>s6,cout=>s9,cin=>'0',s=>data_p(4));
u10:
full_adderportmap(a=>c8,b=>s7,cin=>s9,cout=>s10,s=>data_p(5));
u11:
full_adderportmap(a=>pp(3)(3),b=>s8,cin=>s10,cout=>data_p(7),s=>data_p(6));
endbehav;
说明:
乘法器主要是采用了二维数组以及循环语句的方式对两个数据的
权位进行了采样一次,一次来完成后面的通过加法器串行连接的8位乘法
器的运算。
(4)左移位器
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
useieee.std_logic_arith.all;
entityLSis
port(a:
instd_logic_vector(3downto0);
b:
outstd_logic_vector(7downto0);
ctr:
instd_logic_vector(3downto0));
endLS;
architecturebehavofLSis
signalb1:
std_logic_vector(7downto0):
=(others=>'0');
begin
process(a,ctr)
begin
b1<="00000000";
casectr(2downto0)is
when"000"=>b1(3downto0)<=a(3downto0);
when"001"=>b1(4downto1)<=a(3downto0);
when"010"=>b1(5downto2)<=a(3downto0);
when"011"=>b1(6downto3)<=a(3downto0);
when"100"=>b1(7downto4)<=a(3downto0);
when"101"=>b1(7downto5)<=a(2downto0);b1(0)<=a(3);
when"110"=>b1(7downto6)<=a(1downto0);b1(1downto0)<=a(3downto2);
when"111"=>b1(7)<=a(0);b1(2downto0)<=a(3downto1);
whenothers=>null;
endcase;
endprocess;
b<=b1;
endbehav;
(5)右移位器
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
useieee.std_logic_arith.all;
entityRSis
port(a:
instd_logic_vector(3downto0);
b:
outstd_logic_vector(7downto0);
ctr:
instd_logic_vector(3downto0));
endRS;
architecturebehavofRSis
signalb1:
std_logic_vector(7downto0):
=(others=>'0');
begin
process(a,ctr)
begin
b1<="00000000";
casectr(2downto0)is
when"000"=>b1(3downto0)<=a(3downto0);
when"111"=>b1(4downto1)<=a(3downto0);
when"110"=>b1(5downto2)<=a(3downto0);
when"101"=>b1(6downto3)<=a(3downto0);
when"100"=>b1(7downto4)<=a(3downto0);
when"011"=>b1(7downto5)<=a(2downto0);b1(0)<=a(3);
when"010"=>b1(7downto6)<=a(1downto0);b1(1downto0)<=a(3downto2);
when"001"=>b1(7)<=a(0);b1(2downto0)<=a(3downto1);
whenothers=>null;
endcase;
endprocess;
b<=b1;
endbehav;
说明:
左移右移的原理是想通的,他们都是采用了逐个分析数据的方式对数据采取人为的判断操作,采样0-2这3个位数的数据以此来分析移位的方法。
3.2顶层结构程序设计
顶层设计主要实现的功能为调用各个模块实现综合,并且能够在ISE上成功仿真,并且通过chipscope下载程序到FPGA板上。
主要就是排线部位的设计和编程,这就需要将以上所有模块布线实现一个整体ALU的模块。
相应的代码为:
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
entityALUis
port(rst:
instd_logic;
clk:
instd_logic;
ensure:
instd_logic;
datin1:
instd_logic_vector(3downto0);
datin2:
instd_logic_vector(3downto0);
inst:
instd_logic_vector(2downto0);
datout:
outstd_logic_vector(7downto0)
);
endALU;
architecturebehavofALUis
componentfinal_adderis
port(data_a,data_b:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 报告 资料