ALU运算器实验报告
- 格式:doc
- 大小:31.50 KB
- 文档页数:3
ROM+ALU实验报告LPM_ROM实验一、实验目的1、掌握FPGA中lpm_ROM的设置,作为只读存储器ROM的工作特性和配置方法,部分参数有变动。
2、用文本编辑器mif文件配置ROM,学习将程序代码以mif格式文件加载于lpm_ROM种3、验证FPGA中LPM_ROM的功能二、实验步骤1、创建工程ROMMD2、创建mif文件,并编辑相应内容(P39)File->New->Memory Files->Memory Initialization File,设置参数:Number of words:64;Word size:24。
编辑mif文件,设置相应内容。
3、创建原理图文件,另存为ROMMD.bdf4、引用ROM元件步骤:1)Tools->IP Catalog,在右侧搜索ROM,双击ROM:1-PORT2) 填入名字ROMIP,确定3)找到ROMIP.v文件,右键->Create Symbol Files for Current File4)然后在项目中调用ROMIP元件5、自动生成输入、输出端口。
右键->Generate pins for symbol ports。
6、编译。
成功的话进行仿真,引脚绑定。
7、仿真8、引脚绑定(模式0)ROM+ALU实验一、实验内容:通过将ROM中读取出的16位数据q[15..0],分别给ALU的A(q[15..8])和B(q[7..0]),进行相加运算,输出结果在实验箱上显示。
二、实验步骤:1、创建工程rom_alu2、创建mif文件,并编辑。
File->New->Memory Files->Memory Initialization File,设置参数:Number of words:256;Word size:16。
编辑mif文件,设置相应内容:0102、1122、C050、E004、B005、A206、9A01、E00F等内容,编辑完成后,另存文件名rom_alu.mif。
计算机组成原理实验报告实验报告运算器实验⼀、实验⽬的掌握⼋位运算器的数据传输格式,验证运算功能发⽣器及进位控制的组合功能。
⼆、实验要求完成算术、逻辑、移位运算实验,熟悉ALU运算控制位的运⽤。
三、实验原理实验中所⽤的运算器数据通路如图2-3-1所⽰。
ALU运算器由CPLD描述。
运算器的输出FUN经过74LS245三态门与数据总线相连,运算源寄存器A和暂存器B的数据输⼊端分别由2个74LS574锁存器锁存,锁存器的输⼊端与数据总线相连,准双向I/O 输⼊输出端⼝⽤来给出参与运算的数据,经2⽚74LS245三态门与数据总线相连。
图2-3-1运算器数据通路图中A WR、BWR在“搭接态”由实验连接对应的⼆进制开关控制,“0”有效,通过【单拍】按钮产⽣的脉冲把总线上的数据打⼊,实现运算源寄存器A、暂存器B的写⼊操作。
四、运算器功能编码算术运算逻辑运算K23~K0置“1”,灭M23~M0控位显⽰灯。
然后按下表要求“搭接”部件控制路。
表2.3.2 运算实验电路搭接表算术运算1.运算源寄存器写流程通过I/O单元“S7~S0”开关向累加器A和暂存器B置数,具体操作步骤如下:2.运算源寄存器读流程关闭A、B写使能,令K18=K17=“1”,按下流程分别读A、B。
3.加法与减法运算令M S2 S1 S0(K15 K13~K11=0100),为算术加,FUN及总线单元显⽰A+B的结果令M S2 S1 S0(K15 K13~K11=0101),为算术减,FUN及总线单元显⽰A-B的结果。
逻辑运算1.运算源寄存器写流程通过“I/O输⼊输出单元”开关向寄存器A和B置数,具体操作步骤如下:2.运算源寄存器读流程关闭A、B写使能,令K17= K18=1,按下流程分别读A、B。
①若运算控制位设为(M S2 S1 S0=1111)则F=A,即A内容送到数据总线。
②若运算控制位设为(M S2 S1 S0=1000)则F=B,即B内容送到数据总线。
《计算机组成原理》学生实验报告(2011~2012学年第二学期)专业:信息管理与信息系统班级: A0922学号:10914030230姓名:李斌目录实验准备------------------------------------------------------------------------3 实验一运算器实验-----------------------------------------------------------7 实验二数据通路实验-------------------------------------------------------13 实验三微控制器实验--------------------------------------------------------18 实验四基本模型机的设计与实现------------------------------------------22实验准备一、DVCC实验机系统硬件设备1、运算器模块运算器由两片74LS181构成8位字长的ALU。
它是运算器的核心。
可以实现两个8位的二进制数进行多种算术或逻辑运算,具体由74181的功能控制条件M、CN、S3、S2、S1、S0来决定,见下表。
两个参与运算的数分别来自于暂存器U29和U30(采用8位锁存器),运算结果直接输出到输出缓冲器U33(采用74LS245,由ALUB信号控制,ALUB=0,表示U33开通,ALUB=1,表示U33不通,其输出呈高阻),由输出缓冲器发送到系统的数据总线上,以便进行移位操作或参加下一次运算。
进位输入信号来自于两个方面:其一对运算器74LS181的进位输出/CN+4进位倒相所得CN4;其二由移位寄存器74LS299的选择参数S0、S1、AQ0、AQ7决定所得。
触发器的输出QCY就是ALU结果的进位标志位。
QCY为“0”,表示ALU结果没有进位,相应的指示灯CY灭;QCY为“1”,表示ALU结果有进位,相应的指示灯CY点亮。
实验4:ALU设计一、实验目的1、掌握快速加法器CLA和先行进位逻辑CLU的设计方法。
2、掌握32位先行进位加法器及相关标志位的实现方法。
3、掌握ALU的设计方法,根据指令要求实现6种操作的ALU器件。
二、实验环境Logisim-ITA V2.16.1.0。
三、实验内容1、根据下图给出的电路原理图(参照其他原理图亦可),实现并验证4位快速加法器CLA。
2、 根据给出的逻辑表达式,选择合适的逻辑门,实现并验证 4 位先行进位逻辑单元 CLU 。
3、 据给出的逻辑表达式和电路原理图,在4位CLA 中增加支持组间并联的Gg 、Pg 输出端,加上4位CLU ,设计并实现16位先行进位加法器。
4、 利用两个16位先行进位加法器构建一个 32 位加法器,并根据给出的标志位生成电路原理图,在32位加法器中生成CF 、SF 、OF 、ZF 标志位。
32105、根据给出的电路原理图和ALU引脚定义,设计一个支持9条RV32I指令所包含的6种操作(add、or、slt、sltu、srcB、sub(判0))的32位ALU,并对ALU的功能进行验证。
ALU设计原理图对应的ALU操作控制信号取值ALUctr的一种四位编码方案四、思考题1、若需要增加一条“sub rd, rs1, rs2”指令,则在所设计的32位ALU中要做哪些修改?2、若需要增加一条“sll rd, rs1, rs2”指令,则在所设计的32位ALU中要做哪些修改?3、如何验证运算器的结果是否正确?五、实验报告1、根据本次实验内容的要求,写出实验操作步骤,包括:电路原理图、功能表、仿真检测图、输入输出对应表、错误现象及原因分析、思考题等内容。
以word或PDF格式提交2、将实验报告和电路图.circ文件打包上传到教学支撑平台的网站中。
大连理工大学城市学院FPGA实验报告实验内容:8位ALU系别班级:电子1004班学号:姓名:日期:2013.4.14一.设计概述:一种基于可编程逻辑器件FPGA和硬件描述语言的8位的ALU的设计方法。
该ALU采用层次设计方法,有寄存器模块、控制模块和显示模块组成,能实现8位无符号数的取值、加减和4种逻辑运算(与、或、异或、同或)。
该ALU在QuartusII软件环境下进行功能仿真,通过DE2验证。
二.设计功能:1、该处理器的数据宽度为8bit,可以实现算术加法、减法、逻辑与、逻辑或、逻辑非、逻辑与非、逻辑或非和逻辑异或等8种运算。
2、用选择端opcode [2:0] 选择8种运算,2个操作数分别是a_r [7:0]和b_r[7:0],运算结果是alu_out[7:0];并定义选择如下。
3、使用DE2板上的3个拨码开关设置当前ALU的运算功能,再由8个拨码开关给定数据A 和数据B,由一个按键key手动提供脉冲。
三.设计方案:本设计共有5个模块。
1)脉冲输出器(key手动脉冲),计数依次产生4个脉冲到各个部件,第一个脉冲启动信号。
2)寄存器A,第二个脉冲来时锁存数据A,并在数码管上显示。
3)寄存器B,第三个脉冲来时锁存数据B,并在数码管上显示。
4)8位ALU,第四个脉冲来时进行运算,并锁存结果alu_out。
5)结果显示器,将结果显示通过DE2上的数码管显示。
四.程序分析:主程序模块:module alu8(clk,clk_r,rst,a,b,alu_out,opcode,sw_ab,HEX1, HEX0, HEX7, HEX6, HEX5, HEX4);input clk,rst,clk_r;input [7:0] sw_ab;input [2:0] opcode;output [6:0] HEX1, HEX0, HEX7, HEX6, HEX5, HEX4;output [7:0] a;output [7:0] b;output [7:0] alu_out;rega U1(.clk(clk),.rst(rst),.sw_ab(sw_ab),.a_r(a),.clk_r(clk_r),.HEX7(HEX7),. HEX6(HEX6));regb U2(.clk(clk),.rst(rst),.sw_ab(sw_ab),.b_r(b),.clk_r(clk_r),.HEX5(HEX5),. HEX4(HEX4));alur U3(.clk(clk),.rst(rst),.a_r(a),.b_r(b),.alu_out(alu_out),.opcode(opcode)); digital U4(.clk_r(clk_r),.rst(rst),.alu_out(alu_out),.HEX1(HEX1),. HEX0(HEX0)); endmodule第一位数A模块:module rega (clk,clk_r,rst,sw_ab,a_r,HEX7,HEX6);input [7:0] sw_ab;input clk,clk_r,rst;output [7:0] a_r;reg [7:0] a_r;output reg[6:0] HEX7,HEX6;reg [3:0] cnt;always @(posedge clk or negedge rst)if(!rst) cnt<=1'd0;else if(cnt==5) cnt<=1'd0;else cnt<=cnt+1'd1;always @(posedge clk or negedge rst)if(!rst) a_r=0;else if(cnt==1) a_r=sw_ab;else a_r=a_r;parameter seg0=7'b1000000,seg1=7'b1111001,seg2=7'b0100100,seg3=7'b0110000,seg4=7'b0011001,seg5=7'b0010010 ,seg6=7'b0000010,seg7=7'b1111000,seg8=7'b0000000,seg9=7'b0010000,sega=7'b0001000,segb=7'b0000011 ,segc=7'b1000110,segd=7'b0100001,sege=7'b0000110,segf=7'b0001110;always @(posedge clk_r)case(a_r[3:0])4'h0: HEX6[6:0]=seg0;4'h1: HEX6[6:0]=seg1;4'h2: HEX6[6:0]=seg2;4'h3: HEX6[6:0]=seg3;4'h4: HEX6[6:0]=seg4;4'h5: HEX6[6:0]=seg5;4'h6: HEX6[6:0]=seg6;4'h7: HEX6[6:0]=seg7;4'h8: HEX6[6:0]=seg8;4'h9: HEX6[6:0]=seg9;4'ha: HEX6[6:0]=sega;4'hb: HEX6[6:0]=segb;4'hc: HEX6[6:0]=segc;4'hd: HEX6[6:0]=segd;4'he: HEX6[6:0]=sege;4'hf: HEX6[6:0]=segf;default:HEX6[6:0]=seg0;endcasealways @(posedge clk_r)case(a_r[7:4])4'h0: HEX7[6:0]=seg0;4'h1: HEX7[6:0]=seg1;4'h2: HEX7[6:0]=seg2;4'h3: HEX7[6:0]=seg3;4'h4: HEX7[6:0]=seg4;4'h5: HEX7[6:0]=seg5;4'h6: HEX7[6:0]=seg6;4'h7: HEX7[6:0]=seg7;4'h8: HEX7[6:0]=seg8;4'h9: HEX7[6:0]=seg9;4'ha: HEX7[6:0]=sega;4'hb: HEX7[6:0]=segb;4'hc: HEX7[6:0]=segc;4'hd: HEX7[6:0]=segd;4'he: HEX7[6:0]=sege;4'hf: HEX7[6:0]=segf;default:HEX7[6:0]=seg0;endcaseendmodule第二位数B模块:module regb (clk,clk_r,rst,sw_ab,b_r,HEX5,HEX4); input [7:0] sw_ab;input clk,clk_r,rst;output [7:0] b_r;reg [7:0] b_r;output reg[6:0] HEX5,HEX4;reg [3:0] cnt;always @(posedge clk or negedge rst)if(!rst) cnt<=1'd0;else if(cnt==5) cnt<=1'd0;else cnt<=cnt+1'd1;always @(posedge clk or negedge rst)if(!rst) b_r=0;else if(cnt==2) b_r=sw_ab;else b_r=b_r;parameter seg0=7'b1000000,seg1=7'b1111001,seg2=7'b0100100,seg3=7'b0110000,seg4=7'b0011001,seg5=7'b0010010,seg6=7'b0000010 ,seg7=7'b1111000,seg8=7'b0000000,seg9=7'b0010000,sega=7'b0001000,segb=7'b0000011 ,segc=7'b1000110,segd=7'b0100001,sege=7'b0000110,segf=7'b0001110;always @(posedge clk_r)case(b_r[3:0])4'h0: HEX4[6:0]=seg0;4'h1: HEX4[6:0]=seg1;4'h2: HEX4[6:0]=seg2;4'h3: HEX4[6:0]=seg3;4'h4: HEX4[6:0]=seg4;4'h5: HEX4[6:0]=seg5;4'h6: HEX4[6:0]=seg6;4'h7: HEX4[6:0]=seg7;4'h8: HEX4[6:0]=seg8;4'h9: HEX4[6:0]=seg9;4'ha: HEX4[6:0]=sega;4'hb: HEX4[6:0]=segb;4'hc: HEX4[6:0]=segc;4'hd: HEX4[6:0]=segd;4'he: HEX4[6:0]=sege;4'hf: HEX4[6:0]=segf;default:HEX4[6:0]=seg0;endcasealways @(posedge clk_r)case(b_r[7:4])4'h0: HEX5[6:0]=seg0;4'h1: HEX5[6:0]=seg1;4'h2: HEX5[6:0]=seg2;4'h3: HEX5[6:0]=seg3;4'h4: HEX5[6:0]=seg4;4'h5: HEX5[6:0]=seg5;4'h6: HEX5[6:0]=seg6;4'h7: HEX5[6:0]=seg7;4'h8: HEX5[6:0]=seg8;4'h9: HEX5[6:0]=seg9;4'ha: HEX5[6:0]=sega;4'hb: HEX5[6:0]=segb;4'hc: HEX5[6:0]=segc;4'hd: HEX5[6:0]=segd;4'he: HEX5[6:0]=sege;4'hf: HEX5[6:0]=segf;default:HEX5[6:0]=seg0;endcaseendmodule运算模块:module alur(clk,rst,alu_out,a_r,b_r,opcode,zero);output [7:0] alu_out;output zero;input [7:0] a_r,b_r;input [2:0] opcode;input clk,rst;reg [7:0] alu_out;reg [3:0] cnt;parameterquA=3'b000,quB=3'b001,ADD=3'b010,DEC=3'b011,ANDD=3'b100,XORR=3'b101,XOR=3'b110, NXOP=3'b111;assign zero=!a_r;always @(posedge clk or negedge rst)if(!rst) cnt<=1'd0;else if(cnt==5) cnt<=1'd0;else cnt<=cnt+1'd1;always @(posedge clk or negedge rst)if(!rst) alu_out=0;else if(cnt==3) begincasex(opcode)quA: alu_out<=a_r;quB: alu_out<=b_r;ADD: alu_out<=a_r+b_r;DEC: alu_out<=a_r-b_r;ANDD: alu_out<=a_r&b_r;XORR: alu_out<=a_r|b_r;XOR: alu_out<=a_r^b_r;NXOP: alu_out<=a_r^~b_r;default: alu_out<=8'bxxxx_xxxx;endcaseendelse alu_out=0;endmodule结果显示模块:module digital(clk_r,rst,alu_out,HEX1,HEX0);input [7:0] alu_out;input clk_r,rst;output reg[6:0] HEX1,HEX0;parameter seg0=7'b1000000,seg1=7'b1111001,seg2=7'b0100100,seg3=7'b0110000,seg4=7'b0011001,seg5=7'b0010010,seg6=7'b0000010 ,seg7=7'b1111000,seg8=7'b0000000,seg9=7'b0010000,sega=7'b0001000,segb=7'b0000011 ,segc=7'b1000110,segd=7'b0100001,sege=7'b0000110,segf=7'b0001110;always @(posedge clk_r)case(alu_out[3:0])4'h0: HEX0[6:0]=seg0;4'h1: HEX0[6:0]=seg1;4'h2: HEX0[6:0]=seg2;4'h3: HEX0[6:0]=seg3;4'h4: HEX0[6:0]=seg4;4'h5: HEX0[6:0]=seg5;4'h6: HEX0[6:0]=seg6;4'h7: HEX0[6:0]=seg7;4'h8: HEX0[6:0]=seg8;4'h9: HEX0[6:0]=seg9;4'ha: HEX0[6:0]=sega;4'hb: HEX0[6:0]=segb;4'hc: HEX0[6:0]=segc;4'hd: HEX0[6:0]=segd;4'he: HEX0[6:0]=sege;4'hf: HEX0[6:0]=segf;default: HEX0[6:0]=seg0;endcasealways @(posedge clk_r)case(alu_out[7:4])4'h0: HEX1[6:0]=seg0;4'h1: HEX1[6:0]=seg1;4'h2: HEX1[6:0]=seg2;4'h3: HEX1[6:0]=seg3;4'h4: HEX1[6:0]=seg4;4'h5: HEX1[6:0]=seg5;4'h6: HEX1[6:0]=seg6;4'h7: HEX1[6:0]=seg7;4'h8: HEX1[6:0]=seg8;4'h9: HEX1[6:0]=seg9;4'ha: HEX1[6:0]=sega;4'hb: HEX1[6:0]=segb;4'hc: HEX1[6:0]=segc;4'hd: HEX1[6:0]=segd;4'he: HEX1[6:0]=sege;4'hf: HEX1[6:0]=segf; default: HEX1[6:0]=seg0; endcaseendmodule五.仿真实现:整体图:波形图:六.硬件实现:1.引脚图:2.分析结果说明:开关0~2是算法选择,具体算法类型见设计功能第2项开关10~17数字输入,用8位二进制数表示两个十六进制数,每四位表示一位按键0是锁存及运算,当开关10~17输入一个数A时,按下按键0,数据就是锁存,再输入数就是数B,而当数据B也锁存后,再次按下按键0,就会显示运算结果按键1是复位键七.总结:通过这次FPGA实验课让我明白了真正的编程不像是那些C语言小程序那么简单,为了这次实验算是绞尽脑汁,最后为了读懂程序,还去专门找了Verilog语言辅导书,不管过程再怎么复杂曲折,总算是顺利的完成了实验任务,到了现在回顾为期6周的学习过程,也有一些时候是因为上课不认真,为后来的程序设计增加了难度,也有一些原因是因为自己本身能力不足导致设计接连失败,不得不说,也有一部分原因是因为学习实验室的器件不足,限制了实验设计的范围,也使实验难度增加。
EDA技术与应用实验报告(四)实验名称:ALU(算术逻辑运算单元)的设计姓名:陈丹学号:100401202班级:电信(2)班时间:2012.12.11南京理工大学紫金学院电光系一、实验目的1、学习包集和元件例化语句的使用。
2、学习ALU电路的设计。
二、实验原理1、ALU原理ALU的电路原理图如图1 所示,主要由算术运算单元、逻辑单元、选择单元构成。
图1ALU功能表如表1 所示。
表12、元件、包集在结构体的层次化设计中,采用结构描述方法就是通过调用库中的元件或者已经设计好的模块来完成相应的设计。
在这种结构体中,功能描述就像网表一样来表示模块和模块之间的互联。
如ALU 是由算术单元、逻辑单元、多路复用器互相连接而构成。
而以上三个模块是由相应的VHDL 代码产生的,在VHDL 输入方式下,如果要将三个模块连接起来,就要用到元件例化语句。
元件例化语句分为元件声明和元件例化。
1、元件声明在VHDL 代码中要引入设计好的模块,首先要在结构体的说明部分对要引入的模块进行说明。
然后使用元件例化语句引入模块。
元件声明语句格式:component 引入的元件(或模块)名port(端口说明);end component;注意:元件说明语句要放在“architecture”和“begin”之间。
2、元件例化语句为将引入的元件正确地嵌入到高一层的结构体描述中,就必须将被引用的元件端口信号与结构体相应端口信号正确地连接起来,元件例化语句可以实现该功能。
元件例化语句格式:标号名:元件名(模块名)port map(端口映射);标号名是元件例化语句的唯一标识,且结构体中的标识必须是唯一的;端口映射分为:位置映射、名称映射。
位置映射指port map 中实际信号的书写顺序与component 中端口说明中的信号书写顺序一致,位置映射对书写顺序要求很严格,不能颠倒;名称映射指port map 中将引用的元件的端口信号名称赋予结构体中要使用元件的各个信号,名称映射的书写顺序要求不严格,顺序可以颠倒。
《计算机组成原理》运算器实验报告实验目录:一、实验1 Quartus Ⅱ的使用(一)实验目的(二)实验任务(三)实验要求(四)实验步骤(五)74138、74244、74273的原理图与仿真图二、实验2 运算器组成实验(一)实验目的(二)实验任务(三)实验要求(四)实验原理图与仿真图三、实验3 半导体存储器原理实验(一)实验目的(二)实验要求(三)实验原理图与仿真图四、实验4 数据通路的组成与故障分析实验(一)实验目的(二)实验电路(三)实验原理图与仿真图五、本次实验总结及体会:一、实验1 Quartus Ⅱ的使用(一)实验目的1.掌握Quartus Ⅱ的基本使用方法。
2.了解74138(3:8)译码器、74244、74273的功能。
3.利用Quartus Ⅱ验证74138(3:8)译码器、74244、74273的功能。
(二)实验任务1、熟悉Quartus Ⅱ中的管理项目、输入原理图以及仿真的设计方法与流程。
2、新建项目,利用原理编辑方式输入74138、74244、74273的功能特性,依照其功能表分别进行仿真,验证这三种期间的功能。
(三)实验要求1.做好实验预习,掌握74138、74244、74273的功能特性。
2.写出实验报告,内容如下:(1)实验目的;(2)写出完整的实验步骤;(3)画出74138、74244和74273的仿真波形,有关输入输出信号要标注清楚。
(四)实验步骤1.新建项目:首先一个项目管理索要新建的各种文件,在Quartus Ⅱ环境下,打开File,选择New Project Wizard后,打开New Project Wizard:Introduction窗口,按照提示创建新项目,点击“Next”按钮,再打开的窗口中输入有关的路径名和项目名称后,按“Finish”按钮,完成新建项目工作。
2.原理图设计与编译:原理图的设计与编译在Compile Mode(编译模式)下进行。
2.1.新建原理图文件打开File菜单,选择New,打开“新建”窗口。
实验一运算器组成实验一、实验目的1、掌握运算器的组成及工作原理;2、了解4位函数运算器74LS181的组合功能,熟悉运算器执行算术和逻辑操作的具体实现过程;3、验证带进位控制的运算器功能。
二、实验设备1、EL-JY系列计算机组成及系统结构实验系统一套2、排线若干。
三、工作原理:算术逻辑单元ALU是运算器的核心。
集成电路74LS181是4位运算器,四片74LS181以并/串形式构成16位运算器。
它可以对两个16位二进制数进行多种算术或逻辑运算,74LS181 有高电平和低电平两种工作方式,高电平方式采用原码输入输出,低电平方式采用反码输入输出,这里采用高电平方式。
三态门74LS244作为输出缓冲器由ALU-G信号控制,ALU-G 为“0”时,三态门开通,此时其输出等于其输入;ALU-G 为“1”时,三态门关闭,此时其输出呈高阻。
四片74LS273作为两个16数据暂存器,其控制信号分别为LDR1和LDR2,当LDR1和LDR2 为高电平有效时,在T4脉冲的前沿,总线上的数据被送入暂存器保存。
四、实验内容:验证74LS181运算器的逻辑运算功能和算术运算功能。
五、实验步骤1、按照实验指导说明书连接硬件系统;2、启动实验软件,打开实验课题菜单,选中实验课题打开实验课题参数对话窗口:1)、在数据总线上输入有效数据,按"Ldr1",数据送入暂存器1;2)、在数据总线上输入有效数据,按"Ldr2",数据送入暂存器2;3)、在S3...Ar上输入有效数据组合,按"ALU功能选择端",运算器按规定进行运算,运算结果送入数据缓冲器;4)、按"ALU_G",运算结果送入数据总线。
5)、执行完后,按"回放",可对已执行的过程回看。
6)、回放结束后,按"继续"(继续按钮在点击回放后出现),进行下次数据输入。
计算机组成与系统结构
算术逻辑部件实验报告
姓名:
同组成员:
指导老师:
实验时间:2012年3月28日
一、实验名称:算术逻辑部件的设计
二、实验设备:DE2-70仿真实验板
三、实验原理:输入为两个4位操作数A和B,其中,核心部件是能够进行加减运算的加法器,加法器的输出除了和、差的结果Add-Result以外,还有进位标志外,还有进位标志Add-carry、零标志Zero、溢出标志Add-Overflow和标志符号Add-Sign。
在操作控制端ALUctr的控制下,在ALU中执行“加法”、“减法”、“按位或”、“带符号整数比较小于置1”和“无符号数比较小于置1”等运算,Result作为ALU运算的结果被输出,同时,零标志Zero和溢出标志Overflow也被作为ALU的结果标志信息输出。
ALU的操作由一个ALU操作控制信号生成部件产生的控制信号来控制,该控制信号逻辑的输入是ALUctr信号,,输出有4个控制信号:1、SUBctr用来控制ALU执行加法还是减法运算,当SUBctr=1时做减法,当SUBctr=0时做加法;2、OPctr用来控制选择哪种运算的结果作为Result的输出,因为11条目标指令中只有三种运算结果可能:加减,按位或和小于置1,所以OPctr需要两位;3、OVctr用来控制是否要进行溢出判断,当OVctr=1时,需要判断溢出,此时,若结果发生溢出,则溢出标志Overflow为1;当OVctr=0时,无须判断溢出,此时,即使结果发生溢出,溢出标志Overflow也不为1;4、SIGctr信号控制ALU是执行“带符号整数比较小于置于1”还是“无符号数比较小于置1”功能,当SIGctr=0,则执行“无符号数比较小于置1”,当SIGctr=1,则执行“带符号整数比较小于置1”。
ALUctr的三位编码及其对应的操作类型和ALU控制信号
ALUctr<2:0> 操作类型SUBctr OVctr SIGctr OPctr<1:0> OPctr的含义
0 0 0 addu 0 0 ×0 0 选择加法器的输出结果
0 0 1 add 0 1 ×0 0 选择加法器的输出结果
0 1 0 or ×0 ×0 1 选择”按位或”结果输出
0 1 1 (未用)
1 0 0 subu 1 0 ×0 0 选择加法器的输出结果
1 0 1 sub 1 1 ×0 0 选择加法器的输出结果
1 1 0 sltu 1 0 0 1 0 选择小于置位结果输出
1 1 1 slt 1 0 1 1 0 选择小于置位结果输出
四、实验结果:通过控制ALUctr、SUBctr、OVctr、SIGctr以及OPctr等控制端来选择需要进行的操作,通过拨动开关来设置我所需要的操作数,通过二极管的发光情况来记录对操作数计算后得到的结果,然后将实际结果与预期结果相匹配,将所有的操作进行过后,比较后发现实际结果均与预期结果全部一致,实验验证成功。
五、Verilog源代码:
module ALU(A,B,ALUctr,Zero,Overflow,Result);
parameter n=4;
input [n-1:0] A,B;
input [2:0] ALUctr;
output Zero,Overflow;
output [n-1:0] Result;
wire SUBctr,OVctr,SIGctr,SignA,SignB,Cin;
wire [1:0] OPctr;
wire [n-1:0] X,Y,Z,Less,M,N,Add_Result;
wire Add_Carry,Add_Overflow,Add_Sign;
assign M={n{1'b0}};
assign N={n{1'b1}};
assign SUBctr=ALUctr[2];
assign OVctr=!ALUctr[1]&ALUctr[0];
assign SIGctr=ALUctr[0];
assign OPctr[1]=ALUctr[2]&ALUctr[1];
assign OPctr[0]=!ALUctr[2]&ALUctr[1]&!ALUctr[0];
assign Cin=SUBctr;
assign X=B^{n{SUBctr}};
assign Y=A|B;
assign SignA=Cin^Add_Carry;
assign SignB=Add_Overflow^Add_Sign;
assign Overflow=Add_Overflow&OVctr;
Adder ad(Cin,A,X,Add_Carry,Add_Overflow,Add_Sign,Add_Result,Zero); MUX2_1 m1(SignA,SignB,Less,SIGctr);
defparam m1.k=1;
MUX2_1 m2(M,N,Z,Less);
MUX3_1 m3(Add_Result,Y,Z,Result,OPctr);
endmodule
module MUX2_1(X,Y,Z,ctr);
parameter k=4;
input [k-1:0] X,Y;
output reg [k-1:0] Z;
input ctr;
always @(X or Y or ctr)
if(ctr) Z<=X;
else Z<=Y;
endmodule
module MUX3_1(A,B,C,D,ctr);
parameter k=4;
input [k-1:0] A,B,C;
output reg [k-1:0] D;
input [1:0] ctr;
always @(A or B or C or ctr)
if(ctr==00) D=A;
else
if(ctr==01) D=B;
else
if(ctr==10) D=C;
endmodule
module Adder(Cin,X,Y,Add_Carry,Add_Overflow,Add_Sign,Add_Result,Zero); parameter k=4;
input [k-1:0] X,Y;
input Cin;
output reg [k-1:0] Add_Result;
output Add_Carry,Add_Overflow,Add_Sign,Zero;
reg Add_Carry;
assign Zero=~|Add_Result;
assign Add_Sign=Add_Result[k-1];
assign Add_Overflow=Add_Carry^Add_Result[k-1]^X[k-1]^Y[k-1];
always @(X or Y or Cin)
{Add_Carry,Add_Result}=X+Y+Cin;
Endmodule。