简单CPU系统设计及实现Word文档格式.docx
《简单CPU系统设计及实现Word文档格式.docx》由会员分享,可在线阅读,更多相关《简单CPU系统设计及实现Word文档格式.docx(22页珍藏版)》请在冰豆网上搜索。
2.2.2系统状态转移图
如上图,系统共有3个状态:
S0、S1、S2。
分别为S0:
在这一状态,通过拨码和按键录入要执行的指令。
S1:
在这一状态,CPU执行程序,即S0录入的指令。
S2:
在这一状态,CPU执行完全部程序,等待再次执行或等待录入指令。
2.2.3求解最大公约数的程序框图
设a,b为给定的两个整数,用辗转相减法求解他们的最大公约数:
开始
a<
=a-b
判断:
a=0是否成立?
不成立
a>
b是否成立?
a、b交换
成立
成立
b为所求最大公约数。
程序结束
2.3分块设计
2.3.1DIV(分频器)
DIV将电路板所提供的时钟分频,产生CPU工作所需要的时钟以及数码管扫描所需要的时钟。
2.3.2MCU(控制器)
MCU用来产生系统内部所有寄存器、运算单元所需的控制信号,以及执行各条指令所需要的微操作。
它是整个系统设计的核心所在。
2.3.3ALU(算术逻辑运算单元)
ALU完成数据的算术和逻辑运算。
ALU有5个输入端和2个输出端,其中一个操作数固定来自累加器acc(具体编程时可用变量或信号表示),另一个操作数来自端口mbr_in(通过数据总线接到寄存器MBR)。
参加运算的操作数在ALU中进行规定的操作运算,运算结束后,一方面将结果送至累加器,同时将操作结果的特征状态送标志寄存器。
2.3.4MAR(地址寄存器)
MAR存放着要被读取或写入的内存单元地址。
其中,读操作时,CPU从内存读。
而写操作时,CPU把数据写入内存。
2.3.5MBR(缓冲寄存器)
MBR存放了将要存储到内存的数据或者从内存中读取的最新数据。
MBR连接到系统总线中的地址总线。
2.3.6RAM(随机存取存储器)
RAM有着相对独立的输入输出管脚,在本系统设计中它作为内存使用。
它不是CPU内部的寄存器,不属于CPU的一部分。
但要测试所设计的CPU的性能,需要把RAM加进系统设计中。
2.3.7SMG(数码管显示)
SMG负责将运算结果转化为BCD码形式,然后用数码馆显示。
3仿真波形及波形分析
根据波形图可以看出状态机的运行,其中一个状态占两个时钟周期。
该仿真相当于CPU执行指令的时序图,反映了程序运行情况。
还包括了辗转相减法的仿真,和rst的清零仿真。
可以看出该CPU系统的仿真结果正确,达到下载的要求。
4源程序(含注释)
各个部件对应的源程序如下(最后的连接是用图形连接完成的):
4.1DIV(分频器)
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityDIVis
port
(
clk_in:
instd_logic;
clk_out1:
outstd_logic;
clk_out2:
outstd_logic
);
endDIV;
architecturebehaveofDIVis
signaltmp:
std_logic_vector(15downto0);
begin
process(clk_in,tmp)
if(clk_in'
eventandclk_in='
1'
)then
tmp<
=tmp+1;
endif;
clk_out1<
=tmp(0);
clk_out2<
=tmp
(1);
endprocess;
endbehave;
4.2MCU(控制器)
entityMCUis
clk:
start:
opcode:
instd_logic_vector(3downto0);
cmp:
ctr:
outstd_logic_vector(10downto0)
endMCU;
architecturebehaveofMCUis
process(clk,start)
variablestatus:
std_logic_vector(4downto0):
="
00000"
;
if(start='
status:
00001"
elsif(clk'
eventandclk='
casestatusis
when"
=>
ctr<
"
status:
=status+1;
--MBR<
-RAM
00010"
--MAR<
-MBR
00011"
--DECODING
caseopcodeis
0001"
00100"
--Store--MBR<
-ACC
0010"
00101"
--Load--MBR<
0011"
00111"
--Add--MBR<
0100"
01001"
--Sub--MBR<
0101"
11111"
--SHL--ACC<
-ACC<
<
1
0110"
--SHR--ACC<
-ACC>
>
0111"
01011"
--And--MBR<
1000"
01101"
--Or--MBR<
1001"
--Not--ACC<
-NOTACC
1010"
--Jump
1011"
if(cmp='
0'
)then--JumpZ
else
1100"
10000000000"
--Smg
1111"
--Halt
whenothers=>
endcase;
--Store--RAM<
--Load--BR<
-MBR;
ACC<
-0
00110"
--ACC<
-ACC+BR
--Add--BR<
01000"
--Sub--BR<
01010"
-ACC-BR
--And--BR<
01100"
-ACCANDBR
--Or--BR<
01110"
-ACCORBR
01111"
--Mutiply--BR<
10000"
-ACC*BR
--PC<
-PC+1;
MAR<
-PC
endprocess;
4.3ALU(算术逻辑运算单元)
entityALUis
rst:
mbr_in:
instd_logic_vector(11downto0);
mbr_e:
ctrl:
overflow:
acc:
outstd_logic_vector(11downto0)
endALU;
architecturebehaveofALUis
process(clk,rst)
variablebr:
std_logic_vector(11downto0);
variabledata_acc:
std_logic_vector(11downto0);
if(clk'
eventand