1305王瑞琦运算单元ALU的设计及实现.docx

上传人:b****4 文档编号:27009622 上传时间:2023-06-25 格式:DOCX 页数:24 大小:442.48KB
下载 相关 举报
1305王瑞琦运算单元ALU的设计及实现.docx_第1页
第1页 / 共24页
1305王瑞琦运算单元ALU的设计及实现.docx_第2页
第2页 / 共24页
1305王瑞琦运算单元ALU的设计及实现.docx_第3页
第3页 / 共24页
1305王瑞琦运算单元ALU的设计及实现.docx_第4页
第4页 / 共24页
1305王瑞琦运算单元ALU的设计及实现.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

1305王瑞琦运算单元ALU的设计及实现.docx

《1305王瑞琦运算单元ALU的设计及实现.docx》由会员分享,可在线阅读,更多相关《1305王瑞琦运算单元ALU的设计及实现.docx(24页珍藏版)》请在冰豆网上搜索。

1305王瑞琦运算单元ALU的设计及实现.docx

1305王瑞琦运算单元ALU的设计及实现

中央民族大学

计算机组成原理实验报告

 

运算单元ALU的设计及实现

 

目录

一、实验目的3

一、实验设备3

二、实验要求及内容3

三、实验功能概要3

四、设计详细描述4

5.12-4译码器的设计描述4

详细设计4

功能仿真波形图5

封装符号图5

功能描述5

5.2三态门的设计描述5

详细设计5

功能仿真波形图6

封装符号图6

功能描述6

5.3八位寄存器的设计描述6

详细设计6

功能仿真波形图7

封装符号图7

功能描述7

5.44选1数据选择器的设计描述7

详细设计7

功能仿真波形图8

封装符号图8

功能描述9

5.574181的设计描述9

详细设计9

功能仿真波形图10

封装符号图10

功能描述10

5.6运算器的设计描述11

详细设计11

功能仿真波形图12

封装符号图13

功能描述18

五、实验注意事项18

六、实验问题及解决19

七、实验总结及感想19

一、实验目的

1、掌握运算单元ALU分模块、分层次结构化设计的方法;

2、理解运算单元ALU的工作原理和过程;

3、进一步学习VerilogHDL进行电路设计的方法和技巧;

4、进一步学习QuartusⅡ和Modelsim进行电路设计和仿真的方法和技巧。

一、实验设备

PC机+QuartusⅡ10.0+FPGA(DE2-115开发板)+TEC-8实验箱

二、实验要求及内容

1、用VerilogHDL设计ALU所需的各个功能模块,并用modelsim仿真;

2、在DE2-115开发板或在TEC-8实验箱上验证;

3、将设计的运算器进行封装,用于后续的综合实验

三、实验功能概要

如图为ALU逻辑功能框图,向R0,R1,R2,R3寄存器写入数据,通过数据选择器选择将数据传到某个端口并进行运算,运算结果由DBUS数据总线传出。

以此构成数据通路的运算器部分。

四、设计详细描述

5.12-4译码器的设计描述

详细设计

modulede2_4(en,in,out);

input[2:

1]in;

inputen;

output[4:

1]out;

reg[4:

1]out;

always@(enorin)

if(en)

case(in)

2'b00:

out=4'b0001;

2'b01:

out=4'b0010;

2'b10:

out=4'b0100;

2'b11:

out=4'b1000;

default:

out=4'b0000;

endcase

elseout=4'b0000;

endmodule

功能仿真波形图

封装符号图

功能描述

输入

输出

操作

RD1

RD0

LR3

LR2

LR1

LR0

0

0

0

0

0

1

写入R0

0

1

0

0

1

0

写入R1

1

0

0

1

0

0

写入R2

1

1

1

0

0

0

写入R3

5.2三态门的设计描述

详细设计

moduletri_74244(en,Din,Dout);

inputen;

wireen;

input[7:

0]Din;

wire[7:

0]Din;

output[7:

0]Dout;

reg[7:

0]Dout;

always@(enorDin)

begin

if(en)

Dout<=Din;

else

Dout<=8'bzzzzzzzz;

end

endmodule

功能仿真波形图

封装符号图

功能描述

用于控制数据的读写。

5.3八位寄存器的设计描述

详细设计

modulereg8(T3,DOUT,D);

inputT3;

wireT3;

input[7:

0]D;

wire[7:

0]D;

output[7:

0]DOUT;

reg[7:

0]DOUT;

always@(posedgeT3)

begin

DOUT<=D;

end

endmodule

功能仿真波形图

封装符号图

功能描述

用于暂存写入的数据,通过之后的数据选择器将数据递入运算模块。

5.44选1数据选择器的设计描述

详细设计

modulemux4_1(

d1,

d2,

d3,

d4,

se1,

se2,

dout

);

input[7:

0]d1;

input[7:

0]d2;

input[7:

0]d3;

input[7:

0]d4;

inputse1;

inputse2;

outputdout;

reg[7:

0]dout;

always@(d1ord2ord3ord4orse1orse2)

case({se2,se1})

2'b00:

dout=d1;

2'b01:

dout=d2;

2'b10:

dout=d3;

2'b11:

dout=d4;

endcase

endmodule

功能仿真波形图

封装符号图

功能描述

Se2

Se1

dout

0

0

dout=d1

0

1

dout=d2

1

0

dout=d3

1

1

dout=d4

5.574181的设计描述

详细设计

直接调用74181模块,生成VerilogHDL语言。

PS:

进行功能仿真时,为了便于写vt脚本,将wire类型的AN,BN,S变量全部换成了总线形式,如下

modulesymbol_74181(

S,

BN,

AN,

CN,

M,

FN,

AEQB,

PN,

CN4,

GN,

);

inputwire[3:

0]S;

inputwire[3:

0]BN;

inputwire[3:

0]AN;

inputwireCN;

inputwireM;

outputwireAEQB;

outputwire[3:

0]FN;

outputwirePN;

outputwireCN4;

outputwireGN;

其余均为自动生成的语句。

功能仿真波形图

M=1逻辑运算

M=0算术运算

封装符号图

实际调用时直接调用模块

功能描述

本实验调用的74181ALU为高电平有效,CN4进位端低电平有效。

它具有16中算术运算功能和16种逻辑运算功能。

选择方式

M=1逻辑运算

M=0算术运算

S3

S2

S1

S0

逻辑运算

CN=1

0

0

0

0

F=/A

F=A

0

0

0

1

F=/(A+B)

F=(A+B)

0

0

1

0

F=(/A)B

F=A+/B

0

0

1

1

F=0

F=-1(补码形式)

0

1

0

0

F=/(AB)

F=A加A(/B)

0

1

0

1

F=/B

F=(A+B)加A/B

0

1

1

0

F=A减B减1

0

1

1

1

F=A/B

F=(AB/)减1

1

0

0

0

F=/A+B

F=A加AB

1

0

0

1

F=A加B

1

0

1

0

F=B

F=(A+/B)加AB

1

0

1

1

F=AB

F=AB减1

1

1

0

0

F=1

F=A加A

1

1

0

1

F=A+/B

F=(A+B)加A

1

1

1

0

F=A+B

F=(A+/B)加A

1

1

1

1

F=A

F=A减1

5.6运算器的设计描述

详细设计

将此电路图转成VerilogHDL语言进行功能仿真。

功能仿真波形图

当A=55H,B=AAH,S=0000~1111,M=0,CIN=1时功能仿真波形/*写入操作*/

算术加运算仿真波形图

算术减运算仿真波形图

逻辑与运算仿真波形图

封装符号图

moduleALU(

ABUS,

M,

CIN,

LDC,

T3,

DRW,

SBUS,

RD,

RS,

S,

SD,

C,

Z,

overflow,

DBUS

);

 

inputwireABUS;

//inputwireM;

//inputwireCIN;

//inputwireLDC;

inputwireT3;

//inputwireDRW;

inputwireSBUS;

inputwire[1:

0]RD;

inputwire[1:

0]RS;

inputwire[3:

0]S;

inputwire[7:

0]SD;

outputregC;

outputwireZ;

outputwireoverflow;

outputwire[7:

0]DBUS;

wire[7:

0]A;

wire[7:

0]B;

wireC_ALTERA_SYNTHESIZED4;

wire[7:

0]DB;

wire[7:

0]DBUS_ALTERA_SYNTHESIZED;

wire[3:

0]LR;

wire[7:

0]R0;

wire[7:

0]R1;

wire[7:

0]R2;

wire[7:

0]R3;

wireSYNTHESIZED_WIRE_0;

wireSYNTHESIZED_WIRE_1;

wireSYNTHESIZED_WIRE_2;

wireSYNTHESIZED_WIRE_3;

wireSYNTHESIZED_WIRE_4;

wireSYNTHESIZED_WIRE_5;

wireSYNTHESIZED_WIRE_6;

wireSYNTHESIZED_WIRE_7;

wireSYNTHESIZED_WIRE_8;

wireSYNTHESIZED_WIRE_9;

wireSYNTHESIZED_WIRE_10;

wireSYNTHESIZED_WIRE_11;

wireSYNTHESIZED_WIRE_12;

 

assignSYNTHESIZED_WIRE_8=SYNTHESIZED_WIRE_0&SYNTHESIZED_WIRE_1&DBUS_ALTERA_SYNTHESIZED[7];

assignSYNTHESIZED_WIRE_7=SYNTHESIZED_WIRE_2&A[7]&B[7];

 

mux4_1b2v_Anum(

.se1(RD[0]),

.se2(RD[1]),

.d1(R0),

.d2(R1),

.d3(R2),

.d4(R3),

.dout(A));

 

mux4_1b2v_Bnum(

.se1(RS[0]),

.se2(RS[1]),

.d1(R0),

.d2(R1),

.d3(R2),

.d4(R3),

.dout(B));

 

\74181b2v_inst(

.B0N(B[4]),

.A0N(A[4]),

.A1N(A[5]),

.B1N(B[5]),

.A3N(A[7]),

.B2N(B[6]),

.A2N(A[6]),

.M(M),

.CN(C_ALTERA_SYNTHESIZED4),

.B3N(B[7]),

.S2(S[2]),

.S1(S[1]),

.S0(S[0]),

.S3(S[3]),

.F3N(DB[7]),

.F1N(DB[5]),

.F0N(DB[4]),

.CN4(SYNTHESIZED_WIRE_3),

.F2N(DB[6]));

assignSYNTHESIZED_WIRE_9=T3&LR[0];

assignSYNTHESIZED_WIRE_10=T3&LR[1];

assignSYNTHESIZED_WIRE_11=T3&LR[2];

assignSYNTHESIZED_WIRE_12=T3&LR[3];

assignSYNTHESIZED_WIRE_5=~SYNTHESIZED_WIRE_3;

assignSYNTHESIZED_WIRE_4=LDC&T3;

 

always@(posedgeSYNTHESIZED_WIRE_4)

begin

begin

C<=SYNTHESIZED_WIRE_5;

end

end

 

\74181b2v_inst18(

.B0N(B[0]),

.A0N(A[0]),

.A1N(A[1]),

.B1N(B[1]),

.A3N(A[3]),

.B2N(B[2]),

.A2N(A[2]),

.M(M),

.CN(CIN),

.B3N(B[3]),

.S2(S[2]),

.S1(S[1]),

.S0(S[0]),

.S3(S[3]),

.F3N(DB[3]),

.F1N(DB[1]),

.F0N(DB[0]),

.CN4(C_ALTERA_SYNTHESIZED4),

.F2N(DB[2]));

 

tri_74244b2v_inst2(

.en(ABUS),

.Din(DB),

.Dout(DBUS_ALTERA_SYNTHESIZED));

 

de2_4b2v_inst3(

.en(DRW),

.in(RD),

.out(LR));

assignZ=~SYNTHESIZED_WIRE_6;

assignSYNTHESIZED_WIRE_0=~A[7];

assignSYNTHESIZED_WIRE_1=~B[7];

assignSYNTHESIZED_WIRE_2=~DBUS_ALTERA_SYNTHESIZED[7];

assignoverflow=SYNTHESIZED_WIRE_7|SYNTHESIZED_WIRE_8;

assignSYNTHESIZED_WIRE_6=DB[0]|DB[2]|DB[1]|DB[3]|DB[5]|DB[4]|DB[6]|DB[7];

 

reg8b2v_Reg0(

.T3(SYNTHESIZED_WIRE_9),

.D(DBUS_ALTERA_SYNTHESIZED),

.DOUT(R0));

 

reg8b2v_Reg1(

.T3(SYNTHESIZED_WIRE_10),

.D(DBUS_ALTERA_SYNTHESIZED),

.DOUT(R1));

 

reg8b2v_Reg2(

.T3(SYNTHESIZED_WIRE_11),

.D(DBUS_ALTERA_SYNTHESIZED),

.DOUT(R2));

 

reg8b2v_Reg3(

.T3(SYNTHESIZED_WIRE_12),

.D(DBUS_ALTERA_SYNTHESIZED),

.DOUT(R3));

 

tri_74244b2v_SWD(

.en(SBUS),

.Din(SD),

.Dout(DBUS_ALTERA_SYNTHESIZED));

assignDBUS=DBUS_ALTERA_SYNTHESIZED;

endmodule

功能描述

逻辑功能表

(1)写寄存器(例如:

向通用寄存器R0-R3分别写入数据55H/AAH/03H/04H)

T3

RD

DRW

SBUS

ABUS

DBUS[7..0]

功能(写R)

00

1

1

0

55H

55H→R0

01

1

1

0

AAH

AAH→R1

10

1

1

0

03H

03H→R2

11

1

1

0

04H

04H→R3

(2)选择将R0送74181的A端口,R1送B端口,进行算术功能验算

M

Cn

S[3..0]

RD

RS

DRW

SBUS

ABUS

DBUS[7..0]

0

1

0000

00

01

0

0

1

55

0

1

0001

00

01

0

0

1

ff

……

0

1

1111

00

01

0

0

1

54

(3)选择将R0送74181的A端口,R1送B端口,进行逻辑功能验算

M

Cn

S[3..0]

RD

RS

DRW

SBUS

ABUS

DBUS[7..0]

1

0

0000

00

01

0

0

1

AA

1

0

0001

00

01

0

0

1

00

……

1

0

1111

00

01

0

0

1

55

五、实验注意事项

1.引脚编号不可与调用模块名称一样,否则报错。

2.引脚名称一定要写对,尤其是用到总线时,大小写务必区分开,并且注意模块名和引脚名的不一致。

3.即使是调用的功能模块也要注意默认模块名称的不重复,否则可能会报如下错:

Error(275062):

LogicfunctionoftypeNOTandinstance"inst"isalreadydefinedasasignalnameoranotherlogicfunction

此问题的出现因为调用了一个非门,默认名称为“inst”,而之前已有一个或门被默认为“inst”,因而出错。

4.输入变量不可写成reg类型,可直接修改wire类型变量为总线形式(针对自动生成的VerilogHDL语言需要仿真时方便写脚本)。

5.74181模块命名不可全数字,否则无法找到上层文件。

六、实验问题及解决

问题一:

进行74181模块仿真时无法打开modelsim-altera,而是跳出警告框,提示查看某文档。

解决方案:

根据该文档提示“无法找到相应的VerilogHDL语言”,确认已经从该工程目录下移走bdf文件后,发现74181工程命名全数字,且又是直接调用的模块,导致生成的testbench文件中文件名自动变成了“\74181”,删去前面的“\”仍然提示无法找到语言,重新建立工程重新命名得以解决。

问题二:

进行总电路图的连接时总是出现因为引脚名称错误导致的编译失败。

解决方案:

根据各功能给引脚起名,输入输出放在一起使得电路看起来不太混乱避免出错。

问题三:

在DE2-115上进行仿真时,SBUS=1时无法将数存入寄存器。

解决方案:

T3应该设为按钮引脚,可是我最初分配成了50MHZ的CLK引脚,使得结果不正确,重新分配引脚后问题解决。

七、实验总结及感想

这次的实验感觉难度并不大,因为实验指导差不多给了90%的内容,除了部分仿真文件和溢出等一些小电路设计,对我而言学到的更多是对于运算器内部结构的了解。

因为控制信号很多,所以在copy-paste实验指导的仿真文件时更多时间是在读懂脚本,弄清楚这一步是干什么的,现在对于运算器的内部结构及操作原理比以前熟悉了很多。

结合课堂上的还有第六章的知识,对于总线的概念也比以前清楚了。

虽然没有实际设计模块,但看了书上的实验电路图之后对于模块封装的概念又加深了印象。

我认为这学期的实验比上学期的有意思,听过上一届同学说他们最后的计组实验是做一个cpu,上学期听的时候还有些后怕怀疑自己能不能做出来实验,看到书上的一些电路图和老师给的十分详细的实验指导后突然对这学期的计组实验产生了兴趣,很期待最后的数据通路实验。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 成人教育 > 远程网络教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1