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