计算机组成原理课程设计报告.docx

上传人:b****6 文档编号:9241691 上传时间:2023-02-03 格式:DOCX 页数:55 大小:272.24KB
下载 相关 举报
计算机组成原理课程设计报告.docx_第1页
第1页 / 共55页
计算机组成原理课程设计报告.docx_第2页
第2页 / 共55页
计算机组成原理课程设计报告.docx_第3页
第3页 / 共55页
计算机组成原理课程设计报告.docx_第4页
第4页 / 共55页
计算机组成原理课程设计报告.docx_第5页
第5页 / 共55页
点击查看更多>>
下载资源
资源描述

计算机组成原理课程设计报告.docx

《计算机组成原理课程设计报告.docx》由会员分享,可在线阅读,更多相关《计算机组成原理课程设计报告.docx(55页珍藏版)》请在冰豆网上搜索。

计算机组成原理课程设计报告.docx

计算机组成原理课程设计报告

 

计算机组成原理课程设计报告

 

一、课程设计的目的

本课程设计是在学完本课程教学大纲规定的全部容、完成所有实践环节的基础上,旨在深化学生学习的计算机组成原理课程基本知识,进一步领会计算机组成原理的一些算法,并进行具体实现,提高分析问题、解决问题的综合应用能力。

二、课程设计的容

1.题目:

计算机组成原理算法实现(三)

2.功能:

课题③能够实现逻辑运算(逻辑非、逻辑加、逻辑乘、逻辑异)、定点整数的单符号位补码加减运算、定点整数的原码一位乘法运算和浮点数的加减运算。

3.实现步骤:

(1)系统进入(主)窗体的设计:

菜单需要在输入口令正确后方可激活使用。

口令输入错误时要给出重新输入口令的提示,三次口令输入错误应该禁止使用。

 

(2)选择主窗体中“逻辑运算”时进入下图所示的窗体:

在上面的窗体中按“输入”按扭时,将输入焦点设置为最上面的一个文本框上。

依次输入两个(或一个)二进制数(如11001100或00111010)后,按“逻辑非”、“逻辑加”、“逻辑乘”或“逻辑异”按扭中的任一个后,将在第三个文本框中显示对应操作的结果。

选择“返回”按扭时回到主窗体。

(3)进行定点整数单符号位补码加减法的实现时都是在主窗体选择对应的菜单项后进入对应窗体再进行具体操作。

操作时首先选择“输入”按扭输入参与运算的数据,然后再选操作按扭。

各自窗体的参考图如下所示:

 

在第一个数中输入+11001100在第二个数中输入-01011100点击加法按钮和减法按钮可得加法

结果和减法结果

进行定点整数定点整数原码乘法的实现时都是在主窗体选择对应的菜单项后进入对应窗体再进行具体操作。

操作时首先选择“输入”按扭输入参与运算的数据,然后再选操作按扭。

各自窗体的参考图如下所示:

进行定点整数单符号位补码加减法、定点整数原码乘法、浮点加减法的实现时都是在主窗体选择对应的菜单项后进入对应窗体再进行具体操作。

操作时首先选择“输入”按扭输入参与运算的数据,然后再选操作按扭。

各自窗体的参考图如下所示:

如需帮助,可按帮助按钮,得到以下窗口:

三、主要技术指标及特点

数据表示方法:

计算机中常用的数据表示格式有两种,一是定点格式,二是浮点格式。

(1)定点表示:

约定机器中所有数据的小数点位置是固定的。

由于约定在固定的位置,所以小数点就不再使用记号“.”来表示。

(2)浮点表示:

定点数表示的数的围有限,为了扩展数的表示围,按照科学记数法表示数据的方式,任何一个二进制数N都可以表示成如下的格式:

N=M*2e

M:

尾数,是一个纯小数,决定数据的表示精度

e:

指数,又称为阶码,是一个整数,决定数据的表示围

数的机器码表示:

一般书写所表示的数据称为真值,在计算机中为了表示符号位,通常把符号位和数字位一起编码来表示相应的数,形成了各种数据的存储和表示方法,这些编码称为机器码。

常用的机器码有原码、反码、补码和移码。

(1)原码:

原码的数值部分是该数的绝对值,最高位表示符号位,最高位为0是正数,最高位为1是负数。

(2)反码:

正数的反码等于原码,负数的反码等于除符号位外其余二进制数码0变成1,1变成0。

正数:

[x]反=[x]原=x

负数:

符号位不变,其余变反

(3)补码:

正数的补码等于原码,负数的补码等于反码加1。

正数:

[x]补=[x]原

负数:

[x]补=[x]反+1

定点加、减法运算:

结论:

任何两数的补码只和等于两数只和的补码

v补码加法

基本公式:

[x]补+[y]补=[x+y]补

v补码减法

基本公式:

[x]补-[y]补=[x]补+[-y]补

当负数用补码表示后,符号位作为数据的一部分一起参加运算,运算器不用考虑参加加法运算的操作数的正负以及结果的正负,任意数的加法就可以化作正数加法来作。

v溢出:

在定点数机器中,数的大小超出了定点数能表示的围,叫溢出。

(1)在定点小数机中数的表示围是-1

(2)在定点整数机(8位)中数的表示围是-128

双符号位法:

将符号位扩展为2位,具体说就是对于正数两个符号位是“00”,对于负数两个符号位是“11”。

两个符号位都看作数码一样参加运算。

两个数相加后,其结果的符号位出现“01”或“10”两种组合时,表示发生溢出。

Ø符号位“01”,上溢出

Ø符号位“10”,下溢出

Ø符号位“00”或者“11”,未溢出

从[y]补求[-y]补的法则是:

对[y]补“包括符号位求反且最末位加1”,即可得到[-y]补

定点乘法运算:

在定点计算机中,两个原码表示的数相乘的运算规则是:

乘积的符号位由两数的符号位按异或运算得到,而乘积的数值部分则是两个正数相乘之积。

设n位被乘数和乘数用定点小数表示(定点整数也同样适用) 

被乘数  [x]原=xf.xn-1…x1x0

 乘数  [y]原=yf.yn-1…y1y0

则乘积

 [z]原=(xf⊕yf)+(0.xn-1…x1x0)(0.yn-1…y1y0)

式中,xf为被乘数符号,yf为乘数符号。

机器算法:

机器中一种方法是多次采用”加法-移位“的方法来完成,称为串行乘法器,它的硬件结构简单,但是速度慢,目前广泛使用的是流水式阵列乘法器,称为并行乘法器。

无符号数m乘以n会产生m*n个位积,出现m+n个列和,并行乘法器的关键是快速产生m*n个位积,对位积进行相加运算产生m+n个列和。

第一步:

位积的产生

观察乘法运算:

0*0=0,0*1=0,1*0=0,1*1=1

相当于:

a∩b

所以m*n个位积可以由m*n个与门并行产生。

第二步:

列和的产生:

利用全加器

浮点数的加减法运算:

浮点数的加减法运算分为六个步骤:

(1)0操作数检查

浮点加减运算过程比定点运算过程复杂。

如果判知两个操作数x或y中有一个数为0,即可得知运算结果而没有必要再进行后续的一系列操作以节省运算时间。

0操作数检查步骤则用来完成这一功能。

参加加法运算的数据都是非零,进入下一步。

(2)比较价码大小并完成对阶

为了便于直观理解,假设两数均以补码表示,阶码采用双符号位,尾数采用单符号位。

两浮点数进行加减,首先要看两数的阶码是否相同,若二数阶码不同,表示小数点位置没有对齐,此时必须使二数阶码相同,这个过程叫作对阶。

对阶操作规定使尾数右移,尾数右移后阶码作相应增加,因此对阶时,总是使小阶向大阶看齐。

(3)尾数进行加减运算

对阶结束后,即可进行尾数的求和运算。

不论加法运算还是减法运算,都按加法进行操作(减法利用补码减法转换成补码的加法来做),其方法与定点加减法运算完全一样。

(4)结果规格化

a.采用双符号位表示尾数时,如果两符号位为01或10时,应将结果尾数右移一位,阶码加1(叫“右规”)。

b.如果尾数最高数值位与符号位相同,应将尾数左移,阶码减1,直至数值位最高位与符号位相反(叫“左规”)。

(5)舍入运算

在对阶向右规格化,尾数向右移位,这样被右移的尾数的低位部分会被丢掉,从而造成一定误差,要进行舍入处理。

简单的舍入方法有两种:

一种是“0舍1入”法,即如果右移时被丢掉数位的最高位为0则舍去,为1则将尾数的末位做加加1运算。

另一种是“恒置1”法,即只要数位被移掉,就在尾数的末尾恒置1。

(6)判断结果是否溢出

阶码为00011,阶码的符号位为00,根据补码的双符号检测溢出的方法确定阶码不溢出。

登陆窗口流程图

逻辑运算流程图

 

定点整数单符号位补码加减法流程图

定点整数的原码乘法窗体流程图

 

附件

主体窗口代码如下:

packagegyj;

importjava.awt.*;

importjava.awt.event.*;

importjavax.swing.JOptionPane;

publicclassMainFrameextendsFrameimplementsActionListener

{

staticinti=0;

staticintm=1;

Labela1,a2,a22;

TextFieldtext1;

Buttonbutton1,m1,m2,m3,m4;Fontf;

MainFrame(Strings)

{

super(s);

setLayout(null);

f=newFont("楷体",Font.BOLD,20);

m1=newButton("逻辑运算");

m2=newButton("定点整数单符号位补码加减");

m3=newButton("定点整数原码一位乘法");

m4=newButton("浮点加减法");

m1.addActionListener(this);

m2.addActionListener(this);

m3.addActionListener(this);

m4.addActionListener(this);

m1.setBounds(10,30,120,25);

m2.setBounds(140,30,150,25);

m3.setBounds(300,30,120,25);

m4.setBounds(430,30,80,25);

add(m1);add(m2);add(m3);add(m4);

a1=newLabel("计算机组成原理算法实现(三)",Label.CENTER);

a2=newLabel("输入口令(学号):

");

a22=newLabel("密码正确,请选择上面菜单进行操作",Label.CENTER);

a1.setBounds(150,100,300,40);

a1.setBackground(Color.WHITE);

a1.setFont(f);

a2.setBounds(150,200,90,25);

a2.setBackground(Color.white);

a22.setBounds(200,200,200,25);

a22.setForeground(Color.white);

a22.setBackground(Color.blue);

a22.setVisible(false);

text1=newTextField(18);

text1.setEchoChar('●');

text1.setBounds(240,200,200,25);

button1=newButton("确认");

button1.setBounds(270,250,70,30);

button1.addActionListener(this);

add(a1);add(a2);add(a22);add(text1);add(button1);

setBackground(Color.white);

setBounds(100,100,610,400);

setVisible(true);

validate();

addWindowListener(newWindowAdapter()

{publicvoidwindowClosing(WindowEvente)

{System.exit(0);}

});

}

publicstaticvoidmain(Stringargs[])

{

MainFramegyj=newMainFrame("计算机组成原理");

}

publicvoidactionPerformed(ActionEvente)

{

Strings=newString("2");

if(e.getSource()==button1)

{

while(i==0&&m<=3&&(!

(text1.getText().equals(""))))

{

if(text1.getText().equals(s))

{

i=1;

JOptionPane.showMessageDialog(this,"口令正确,请选择菜单栏的操作",

"正确",JOptionPane.INFORMATION_MESSAGE);

text1.setEnabled(false);

text1.setVisible(false);

a22.setVisible(true);

a2.setVisible(false);

}

else{

m++;

JOptionPane.showMessageDialog(this,"您输入的口令不正确",

"警告",JOptionPane.WARNING_MESSAGE);

text1.setText(null);

}

}

if(m>3)

{

JOptionPane.showMessageDialog(this,"您三次口令错误,已被禁用",

"警告",JOptionPane.ERROR_MESSAGE);

}

}

if(i==1)

{

if(e.getSource()==m1)

{

luojiyunsuans1=newluojiyunsuan("逻辑运算");

s1.setVisible(true);

}

elseif(e.getSource()==m2)

{

zhengshujiajianf1=newzhengshujiajian();

f1.setTitle("定点整数单符号位补码加减");

f1.setVisible(true);

}

elseif(e.getSource()==m3)

{

zhengshuchengfaf2=newzhengshuchengfa();

f2.setTitle("定点整数原码一位乘法");

f2.setVisible(true);

}

elseif(e.getSource()==m4)

{

fudianyunsuanf5=newfudianyunsuan("浮点加减法");

f5.setVisible(true);

}

}

}

}

逻辑运算代码如下:

packagegyj;

importjava.awt.*;

importjava.awt.event.*;

importjavax.swing.JOptionPane;

publicclassluojiyunsuanextendsFrameimplementsActionListener

{

intme=0;

Labelb1,b2,b3,b4;Fontf;

TextFieldt1,t2,t3;

Buttonbutton1,button2,button3,button4,button5,button6;

luojiyunsuan(Strings)

{

super(s);setLayout(null);

f=newFont("楷体",Font.BOLD,20);

b1=newLabel("逻辑运算",Label.CENTER);

b2=newLabel("请输入第一个数:

");

b3=newLabel("请输入第二个数:

");

b4=newLabel("结果");

b1.setBounds(180,100,250,40);

b1.setFont(f);

b1.setBackground(Color.white);

b2.setBounds(100,200,120,25);

b3.setBounds(100,250,120,25);

b2.setBackground(Color.white);

b3.setBackground(Color.white);

b4.setBounds(100,300,120,25);

t1=newTextField(15);

t2=newTextField(15);

t3=newTextField(15);

t1.setBounds(250,200,200,25);

t2.setBounds(250,250,200,25);

t3.setBounds(250,300,200,25);

button1=newButton("输入");button2=newButton("逻辑非");

button3=newButton("逻辑加");button4=newButton("逻辑乘");

button5=newButton("逻辑异");button6=newButton("返回");

button1.setBounds(80,350,70,25);button2.setBounds(160,350,70,25);

button3.setBounds(240,350,70,25);button4.setBounds(320,350,70,25);

button5.setBounds(400,350,70,25);button6.setBounds(480,350,70,25);

setBounds(100,100,600,400);

setBackground(Color.white);

add(b1);add(b2);add(b3);add(b4);add(t1);add(t2);add(t3);

add(button1);add(button2);add(button3);add(button4);

add(button5);add(button6);

button1.addActionListener(this);

button2.addActionListener(this);

button3.addActionListener(this);

button4.addActionListener(this);

button5.addActionListener(this);

button6.addActionListener(this);

validate();

addWindowListener(newWindowAdapter()

{publicvoidwindowClosing(WindowEvente)

{setVisible(false);}

});

}

publicvoidactionPerformed(ActionEvente)

{

if(e.getSource()==button1)

{me=1;

t1.requestFocusInWindow();

}

elseif(me==1)

{

if(e.getSource()==button2)

{

b4.setText("逻辑非:

");

Stringsg=t1.getText();

intindex=sg.indexOf("+");

intl=sg.length();

StringBuffers=newStringBuffer(sg);

for(inti=0;i

{

if(s.charAt(i)=='0')

s.setCharAt(i,'1');

else

s.setCharAt(i,'0');

}

Stringss=s.substring(index+1);

t3.setText(ss);

}

elseif(e.getSource()==button3)

{

b4.setText("逻辑加:

");

Stringsg=t1.getText();

Stringsg2=t2.getText();

if(sg.length()!

=sg2.length())

{

JOptionPane.showMessageDialog(this,"您输入的两个参数长度不一样",

"警告对话框",JOptionPane.WARNING_MESSAGE);

}

else{

intindex=sg.indexOf("+");

//Stringss=sg.substring(index+1);

StringBuffers=newStringBuffer(sg);

StringBuffers2=newStringBuffer(sg2);

for(inti=0;i

{

if(s.charAt(i)=='1'||s2.charAt(i)=='1')

s.setCharAt(i,'1');

else

s.setCharAt(i,'0');

}

Stringss=s.substring(index+1);

t3.setText(ss);

}

}

elseif(e.getSource()==button4)

{

b4.setText("逻辑乘:

");

Stringsg=t1.getText();

Stringsg2=t2.getText();

if(sg.length()!

=sg2.length())

{

JOptionPane.showMessageDialog(this,"您输入的两个参数长度不一样",

"警告对话框",JOptionPane.WARNING_MESSAGE);

}

else{

intindex=sg.indexOf("+");

//Stringss=sg.substring(index+1);

StringBuffers=newStringBuffer(sg);

StringBuffers2=newStringBuffer(sg2);

for(inti=0;i

{

if(s.charAt(i)=='1'&&s2.charAt(i)=='1')

s.setCharAt(i,'1');

else

s.setCharAt(i,'0');

}

Stringss=s.substring(

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

当前位置:首页 > 经管营销 > 金融投资

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

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