1305王瑞琦运算单元ALU的设计及实现.docx
- 文档编号:27009622
- 上传时间:2023-06-25
- 格式:DOCX
- 页数:24
- 大小:442.48KB
1305王瑞琦运算单元ALU的设计及实现.docx
《1305王瑞琦运算单元ALU的设计及实现.docx》由会员分享,可在线阅读,更多相关《1305王瑞琦运算单元ALU的设计及实现.docx(24页珍藏版)》请在冰豆网上搜索。
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,上学期听的时候还有些后怕怀疑自己能不能做出来实验,看到书上的一些电路图和老师给的十分详细的实验指导后突然对这学期的计组实验产生了兴趣,很期待最后的数据通路实验。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 1305 王瑞琦 运算 单元 ALU 设计 实现
![提示](https://static.bdocx.com/images/bang_tan.gif)