050410104麚鹏绲成功理诺程誾诫.docx

上传人:b****6 文档编号:7056447 上传时间:2023-01-16 格式:DOCX 页数:14 大小:130.73KB
下载 相关 举报
050410104麚鹏绲成功理诺程誾诫.docx_第1页
第1页 / 共14页
050410104麚鹏绲成功理诺程誾诫.docx_第2页
第2页 / 共14页
050410104麚鹏绲成功理诺程誾诫.docx_第3页
第3页 / 共14页
050410104麚鹏绲成功理诺程誾诫.docx_第4页
第4页 / 共14页
050410104麚鹏绲成功理诺程誾诫.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

050410104麚鹏绲成功理诺程誾诫.docx

《050410104麚鹏绲成功理诺程誾诫.docx》由会员分享,可在线阅读,更多相关《050410104麚鹏绲成功理诺程誾诫.docx(14页珍藏版)》请在冰豆网上搜索。

050410104麚鹏绲成功理诺程誾诫.docx

050410104麚鹏绲成功理诺程誾诫

 

计算机组成原理

课程设计报告

 

班级:

0504101

设计人:

龚鹏

院系:

计算机科学与技术学院

目录

设计框图及功能分析1

设计目的1

模块分析1

仿真设计框图2

I/O模块详细设计2

控制模块详细设计2

进位链模块模块设计3

时钟模块详细设计3

仿真过程及仿真结果4

仿真结果截图4

测试用例:

4

设计心得5

附录一:

仿真源代码1

附录二:

测试用例1

设计框图及功能分析

设计目的

1)学习CPLD/FPGA开发流程,学习通过CPLD/FPGA进行系统设计

2)掌握计算机系统工作原理以及CPU的组成和工作原理

3)掌握运算器的构成及设计方法,

4)掌握CPU的VHDL描述方法

5)掌握指令系统的设计及实现方法

6)掌握Modelsim仿真软件的使用

模块分析

本次课程设计要实现的功能是实现8位补码乘法。

程序分为四个模块:

I/O模块,控制模块,进位链模块和时钟模块。

下面分别做简要说明:

I/O模块:

根据题目要求,输入部分为a、b两个8位信号,输出为16位信号,四个一位信号ZF,CF,OF,SF。

控制模块:

该模块实现了芯片的内部逻辑控制,是芯片的核心。

主模块的设计原理可以根据计算机定点乘法的方法,每一次乘乘数的最低位,然后移位,共循环8次。

在加法的过程中,可以调用快速进位链模块,加快加法的速度,节省时间。

进位链模块:

使用快速进位链可以加快加法的速度,节省时间,提高乘法器的运算效率。

时钟模块:

在芯片运算中,各个模块需要时钟产生的脉冲来进行同步或者等待时钟脉冲来执行下一步操作。

芯片引脚设计如图1-1和图1-2所示

图1-1控制模块引脚设计图1-2进位链模块引脚设计

仿真设计框图

图1-3仿真设计框图

I/O模块详细设计

该模块设计比较简单,针对题目要求设计了接口(详见图1-1和图1-2)。

其中用户输入是通过激励文件实现的。

输入、输出显示都放到了WAVE图上。

控制模块详细设计

该模块实现了芯片的内部逻辑控制,是芯片的核心。

它里面有一个主调模块和两个子模块,分别用于移位和8位加法。

主模块的设计原理计算机定点乘法的方法,每一次乘乘数的最底位,然后移位,共循环8次;8位加法子模块主要负责每一次乘完之后,将本次结果与当前的结果相加;移位子模块主要负责每一次加法之后进行右移位的工作。

在加法模块中,又调用了快速进位链模块,此外,经过多次对比,在加法部分还对课本上的原理进行了一定的创新,减少了一次移位操作,减少了一个变量位置(详细见设计心得部分)。

进位链模块模块设计

在普通的进位运算中,高位运算必须等低位进位来到后才能进行。

这使得运算过程中的延迟比较大。

因此引入了进位产生函数(G)、进位传输函数(P):

若Gn为1,必定产生进位;若Pn为1,则向高位传输(低位)进位(Cn),低位进位越过本位直接向高位进位,从而将迭代关系去掉,使得各位彼此独立,进位传播不复存在。

因此,总的延迟是两级门的延迟。

速度大大提高。

时钟模块详细设计

始终模块参照了ModelSimSE(v5.8c)软件中自带的compare实例,声明了一个时间型变量PERIOD,并赋值为20ns,将其作为一个周期。

然后在clkk(process)中用while循环语句实现时钟信号(clock),每隔半个周期(PERIOD/2)实现一次0/1信号转换,然后每个一个周期(PERIOD)实现一次复位。

此外还设置了一个全局信号(signaldone:

boolean)来表示计算是否完成。

done初始值为false,当完成操作后置为true,在clkk(process)中检测到该变化后跳出while循环。

仿真过程及仿真结果

仿真结果截图

图6-1仿真结果截图

测试用例:

所有测试用例见附录二。

在这里,测试用例分别用两个文件进行保存,cmpdata.txt为使用计算器得到的结果,testdata.txt为试验测试的数据,通过使用UltraCompare进行智能文本比较(如图6-2所示),所得到的结果相同。

图6-2UltraCompare智能文本比较

设计心得

这次课程设计中,我选择的是软件部分,主要是考虑到这个课程设计还是比较注重基础理论的,同时模拟的可靠度也比较高。

总的来看我的这次课程设计,我认为是比较成功的。

较快的掌握了VHDL的基本语法规则,然后通过分析附加的例子,简单学会了如何去使用VHDL。

使用的基本原理来自课本,在设计8位乘法器的过程中,有针对其原理做了简单的改进(如图图7-1所示),这样减少了一次移位操作,减少一个变量位置,在一定程度上节约了时间和成本。

图7-1乘法中执行一次加法示意图

在8位乘法中,可以分解为8次移位和加法操作。

如图7-1所示,这里描述了一次相加的过程。

这里设置了16位的temp用来保存计算过程中的数据结果。

如果乘数当前位为1,则在相加的过程中,使用的是7~14位来和被乘数相加,然后进位直接保存在第15位中,然后进行以为操作;如果乘数当前位为0,则在跳过相加的过程,直接进行移位操作。

在课本原理上使用的8~15进行操作,然后再设置一个标志为来表示是否有进位产生。

课本上的原来需要在第8次进行移位,将进位标示的变量移入,产生最终结果,经过我的上述改进之后,这里在第8次加法操作之后,产生的就是最终结果,无需第8次移位,从而变原来的8次移位为7次移位。

同时,这样的设计也不用再设置进位储存位,减少了一个变量。

此外,我还进一步地锻炼了自我学习的能力,在课程设计之前,我们大家都没有接触过VHDL以及相关程序设计,但是在我们有需求的时候,我能够知道如何去学习,能够快速上手,这是在收获知识之外更大的收获。

还有,在课程设计中一个最大的体会就是团队的力量,在我对VHDL有了一定的基础之后,经常帮助同学去解决问题,在这个过程中,又一次的体会到了教学相长,他们的很多问题都是我没有考虑到的。

我们的相互交流、探讨,进一步增强了我们对于知识的理解和掌握。

附录一:

仿真源代码

文件multi.vhd

--multi.vhd

--lastchangedat08.03.12

LIBRARYieee;

USEieee.std_logic_1164.ALL;

USEieee.numeric_std.ALL;

entitymultiis

port(

a:

inbit_vector(7downto0);

b:

inbit_vector(7downto0);

result:

outbit_vector(15downto0);

zero_flag:

outbit;

carry_flag:

outbit;

over_flag:

outbit;

sign_flag:

outbit

);

endmulti;

architecturemulti8ofmultiis

componentadder_4bits

port(

x,y:

inbit_vector(3downto0);

c0:

inbit;

sum:

outbit_vector(3downto0);

G0,P0:

outbit);

endcomponent;

proceduremove(signalclock:

instd_logic;

signaldata16:

inoutbit_vector(15downto0))is

begin

forcountin0to14loop

data16(count)<=data16(count+1);

endloop;

data16(15)<='0';

endmove;

procedureset_flag(

signaldata16:

inbit_vector(15downto0);

signalzero_f:

outbit;

signalc_flag:

outbit;

signalo_flag:

outbit;

signals_flag:

outbit

)is

variablet_f:

bit:

='1';

begin

t_f:

='1';

forcountin0to15loop

if(data16(count)='1')then

t_f:

='0';

exit;

endif;

endloop;

zero_f<=t_f;

t_f:

='1';

forcountin8to15loop

if(data16(count)='1')then

t_f:

='0';

exit;

endif;

endloop;

c_flag<=t_f;

o_flag<=t_f;

s_flag<=t_f;

endset_flag;

proceduremulti1(

signalG0,G1,P0,P1:

inbit;

signalsum:

inbit_vector(7downto0);

signalhigh_result:

outbit;

signalresult_8bit:

outbit_vector(7downto0))is

begin

high_result<=G1or(P1andG0)or(P1andP0and'0');

result_8bit<=sum;

endmulti1;

constantPERIOD:

Time:

=20ns;

signalclk:

std_ulogic:

='0';

signaldone:

boolean:

=FALSE;

signaltmp:

bit_vector(15downto0);

signalG0,G1,P0,P1:

bit;

signalsum:

bit_vector(7downto0);

--thisisusedtomove

aliashigh_result:

bitistmp(15);

--thisisusedtoadd

aliasresult_8bit:

bit_vector(7downto0)istmp(14downto7);

begin

add1:

adder_4bitsportmap(a(3downto0),result_8bit(3downto0),'0',sum(3downto0),G0,P0);

--here,c1=gor(pandci),ci=0;

add2:

adder_4bitsportmap(a(7downto4),result_8bit(7downto4),G0,sum(7downto4),G1,P1);

test:

process

begin

waituntilclk'eventandclk='1';

waituntilclk'eventandclk='1';

if(b(0)='1')then

multi1(G0,G1,P0,P1,sum,high_result,result_8bit);

endif;

forcountin1to7loop

waituntilclk'eventandclk='1';

move(clk,tmp);

waituntilclk'eventandclk='1';

if(b(count)='1')then

multi1(G0,G1,P0,P1,sum,high_result,result_8bit);

endif;

endloop;

--here,youneedwaitforaclktoo.

waituntilclk'eventandclk='1';

set_flag(tmp,zero_flag,carry_flag,over_flag,sign_flag);

result<=tmp;

done<=TRUE;

wait;

endprocesstest;

clkk:

process

begin

while(notdone)loop

clk<='0','1'afterPERIOD/2;

waitforPERIOD;

endloop;

wait;

endprocessclkk;

endmulti8;

 

文件adder_4bits.vhd

--adder_4bits.vhd

libraryieee;

useieee.std_logic_1164.all;

entityadder_4bitsis

port(

x,y:

inbit_vector(3downto0);

c0:

inbit;

sum:

outbit_vector(3downto0);

G0,P0:

outbit

);

endadder_4bits;

architectureadder_4bitsofadder_4bitsis

signalc:

bit_vector(3downto0);

signalg,p:

bit_vector(3downto0);

begin

G1:

foriin0to3generate

g(i)<=x(i)andy(i);

p(i)<=x(i)xory(i);

sum(i)<=p(i)xorc(i);

endgenerate;

c(0)<=c0;

c

(1)<=g(0)or(p(0)andc0);

c

(2)<=g

(1)or(p

(1)andg(0))or(p

(1)andp(0)andc0);

c(3)<=g

(2)or(p

(2)andg

(1))or(p

(2)andp

(1)andg(0))or(p

(2)andp

(1)andp(0)andc0);

G0<=g(3)or(p(3)andg

(2))or(p(3)andp

(2)andg

(1))or(p(3)andp

(2)andp

(1)andg(0));

P0<=p(3)andp

(2)andp

(1)andp(0);

endadder_4bits;

 

文件test.do

vlibwork

vcommulti.vhd

vsimmulti

addwave*

force/a000000110

force/b000000110

run400ns

 

文件set.do

vlibwork

vcommulti.vhdadder_4bits.vhd

vsimmultiadder_4bits

quit-sim

附录二:

测试用例

cmpdata.txt

force/a111111110

force/b101010100

result1010100101010110

force/a111111110

force/b010101010

result101010010101011

force/a111111110

force/b000000010

result11111111

force/a111111110

force/b100000000

result111111110000000

force/a100000000

force/b111111110

result111111110000000

force/a000000010

force/b111111110

result11111111

force/a101010100

force/b111111110

result1010100101010110

force/a010101010

force/b111111110

result101010010101011

force/a000000000

force/b000000000

result0

force/a111111110

force/b111111110

result1111111000000001

 

 

testdata.txt

force/a111111110

force/b101010100

result1010100101010110

force/a111111110

force/b010101010

010*********

force/a111111110

force/b000000010

result0000000011111111

force/a111111110

force/b100000000

result0111111110000000

force/a100000000

force/b111111110

result0111111110000000

force/a000000010

force/b111111110

result0000000011111111

force/a101010100

force/b111111110

result1010100101010110

force/a010101010

force/b111111110

010*********

force/a000000000

force/b000000000

result0000000000000000

force/a111111110

force/b111111110

result1111111000000001

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

当前位置:首页 > 求职职场 > 自我管理与提升

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

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