您的位置:首页 > 理论基础

计算机组成原理课程设计之设计RISC处理器

2008-08-18 22:31 726 查看

[/b]
[/b]
[/b]
计[/b]算[/b]机[/b]组成系[/b]统实验[/b](硬件)[/b]

[/b]
题目:设计一台嵌入式RISC模型机[/b]
[/b]
[/b]
[/b]
[/b]
学 号: 072031108 [/b]
姓 名: 刘同来 [/b]
指导教师: 陈智勇老师 [/b]
专 业: 计算机应用技术 [/b][/b]
[/b]
[/b]
[/b]
日期:[/b]2008[/b]-[/b]5[/b]-[/b]30[/b]
[/b]
目[/b] [/b]录[/b][/b]
1 实验题目... 3
2 嵌入式RISC模型机数据通路框图... 4
3.操作控制器的逻辑框图... 5
4.模型机的指令系统和所有指令的指令格式... 6
4.1 指令格式... 6
4.2 数据格式... 7
4.3 指令系统... 7
5 所有机器指令的CPU操作流程图... 8
6.嵌入式RISC模型计算机的顶层电路图... 9
7 汇编语言源程序... 11
7.1算法简单描述:... 11
7.2汇编程序... 11
8 机器语言源程序... 13
9 时序仿真波形图... 15
10.故障现象和故障分析... 17
11.学习体会... 17
参考文献... 18
附录:软件源程序... 18
1 ALU单元源程序... 18
2 状态条件寄存器单元源程序... 19
3 暂存器、通用寄存器、地址寄存器、指令寄存器单元源程序... 20
4 1:2分配器单元源程序... 20
5 三选一选择器单元源程序... 21
6 四选一单元源程序... 22
7 程序计数器单元源程序... 22
8 ROM16单元源程序... 23
9 RAM单元源程序... 25
10 时序产生器单元源程序... 26
11 选择从PC或者BUS中读入数据到AR的二选一选择器单元源程序... 27
12 选择对ROM或者RAM进行操作的二选一选择器单元源程序... 27
13 MODE_CONTROL中央控制器单元源程序... 28
[/b]
[/b]
[/b]
[/b]
[/b]
[/b]

1 实验题目

设计一台嵌入式RISC模型机,采用定长CPU周期,要求具有以下验证程序所要求的功能:
要求:输入包含10个整数(补码表示)的数组M,将其分成正数数组P和负数数组N,依次输出正数数组P中的整数及正数的个数。

2 嵌入式RISC模型机数据通路框图

嵌入式RISC模型机

图2-1模型机数据通路框图

3.操作控制器的逻辑框图

启动
停止
时钟
复位
...
Mk
M1
T1
...
Ti





. . .

B1
Bj
状态反馈信息
指令译码器
I1
Im
指令寄存器IR
具有时间标志的操作控制信号
[/b]
[/b]
组合逻辑线路
节拍电位/节拍脉冲
发生器
启动

图3-1 操作控制器的逻辑框图

4.模型机的指令系统和所有指令的指令格式

4.1 指令格式

为了完成输入包含10个整数(补码表示)的数组M,将其分成正数数组P和负数数组N,依次输出正数数组P中的整数及正数的个数的功能。本系统设计了9条指令:
IN1: 接收外部设备输入的数据送到目的寄存器;
MOV:将一个立即数送目的寄存器;
MOVRM:将源寄存器中的数据存储到目的寄存器所指向的地址单元;
MOVMR:将源寄存器所指向的地址单元中的数送入目的寄存器;
CMP: 源寄存器中的数和目的寄存器中的数进行比较并置状态寄存器FZ,FC值,锁存;
INC: 将目的寄存器中的数据自加1;
JB: 有条件转移指令(小于转移),判断状态寄存器中FC,FZ的值,若FC=1,FZ=0(表示在上一条指令中,比较的结果为小于),则转移到指定行,否则顺序执行。
JMP: 无条件转移指令.转移到指定行
OUT1: 将源寄存器数据输出到LED。
下面系统中采用的九条指令及其格式,其中Rs为源寄存器,Rd为目的寄存器。
(1)I/O指令
输入(IN1)指令采用单字节指令,其格式如下:

7 6 5 43 21 0
操作码× ×Rd
输出(OUT1)指令采用单字节指令,其格式如下:

7 6 5 43 21 0
操作码Rs× ×
(2)转移指令(“地址”中的值就是要转移的地址值)
无条件转移指令(JMP)采用双字节指令,其格式如下:

7 6 5 43 2 1 0
操作码× × × ×
地 址
条件转移指令(JB)采用双字节指令,其格式如下:

7 6 5 43 2 1 0
操作码× × × ×
地 址
(3)MOV指令
MOV指令采用双字节指令,其格式如下:

7 6 5 43 21 0
操作码× ×Rd
立 即 数
(4)MOVRM和MOVMR指令
MOVRM,MOVMR指令采用单字节指令,其格式如下:

7 6 5 43 21 0
操作码Rs Rd
(5)自增指令
自增1指令(INC)采用单字节指令,其格式如下:

7 6 5 43 21 0
操作码× ×Rd
(6)比较指令
比较指令(CMP)采用单字节指令,其格式如下:

7 6 5 43 21 0
操作码RsRd
(7)对Rs和Rd的规定:

Rs或Rd选定的寄存器
0 0R0
0 1R1
1 0R2

4.2 数据格式

模型机规定数据的标识采用定点补码标识,且字长为8位,其格式如下

7 6 5 4 3 2 1 0
符号位尾数

4.3 指令系统

本模型机共有9条指令,下表列出了每条指令的格式、汇编符号和指令功能。
助记符号指令格式功 能
IN1 Rd
1 0 0 0××Rd
接收数据存到Rd寄存器
CMP Rs, Rd
1 1 0 0RsRd
(Rs)-(Rd),锁存CY和ZI
MOV Rd, Data
1 0 0 1××Rd
Data
data → Rd
MOVRM Rs, [Rd]
0 1 0 1RsRd
(Rs) → ((Rd))
MOVMR [Rs], Rd
1 0 1 0RsRd
((Rs)) → Rd
INC Rd
1 1 0 1××Rd
(Rd)+1 → Rd
JB addr
1 0 1 1××××
addr
若小于,则addr → PC
JMP addr
1 1 1 0××××
addr
addr → PC
OUT1 Rs
1 1 1 1Rs××
(Rs)→ LED
表4.1 指令系统格式表

5 所有机器指令的CPU操作流程图

机器指令的CPU操作流程图是根据模型机的硬件设计、指令系统、所有指令的解释过程和控制信号的时序设计出来的,如图5.1所示。图中每一个方框执行的时间为一个时钟周期(或称T周期),四个T周期为一个节拍电位。由于每条指令的执行的时间最多为两个节拍电位,因此在VHDL软件中用一个触发器M的状态来表示目前处于哪一个节拍电位(在第一个节拍电位时,M=0;在第二个节拍电位时M=1)。

CS_I↓
ID_RM=0,
SW_B=1,CS=0
LDRD↑
RS_B=0,Led_B=1
WR_FEN2=1
SW_B=1,WR=0
CS=1,CS_D↓
WE=0
CS_D↓WR=1
ID_RM=1
SW_B=1
CS=0,LDRD↑
CS_I↓
ID_RM=0
SW_B=1,CS=0
LOAD=0,LDPC↑
S1=1,S0=0,CS=1
ALU_B=0,LED_B=1
WR_FEN2=1
SW_B=1,LDRD↑
IID_PC=1
LDAR↑
LDPC↑
LDAD=1
ID_PC=1
LDAR↑
LDPC↑
LDAD=1
Rs_B=0
LED_B=0
WR_FEN2=0
Rd-B=0,LED_B=1WR_FEN2=1,
SW_B=1,CS=1
,LDAC↑
CMP Rs,Rd
Rs_B=0,LED_B=1
WR_FEN2=1
SW_B=1,CS=1
LDAC↑
Rd-B=0,Led_B=1
WR_FEN2=1
SW_B=1,CS=1
ID_PC=0,LDAR↑
LDAR↑
Rs-B=0,Led_B=1
WR_FEN2=1
SW_B=1,CS=1
ID_PC=0,LDAR↑
LDAR↑
ID_PC=1
LDAR↑
LDPC↑,LOAD=1
S1=0,S0=1
LDFR↑
Rd-B=0,LED_B=1
WR_FEN2=1
SW_B=1,CS=1,LDDR↑
SW_B=0
LDRD↑
ID_PC=1,LDAR↑,LDPC↑,LOAD=1
CS_I↓,ID_RM=0,SW_B=1,CS=0,LDIR↑
PC→AR , PC+1
RD M , BUS→IR
指令译码
SW→BUS
BUS→Rd
Rd→BUS
BUS→AR
PC→AR
PC+1
PC→AR
PC+1
Rd→BUS
BUS→AC
ROM→BUS
BUS→PC
AC+1→BUS
BUS→Rd
IN1 Rd
MOV Rd,data
JMP addr
MOVMR [Rs],Rd
OUT1 Rs
MOVRM Rs,[Rd]
Rs→BUS
BUS→AR
Rs→LED
ROM→BUS
BUS→Rd
Rs→BUS
WR RAM
[/b]
RD RAM
BUS→Rd
图5.1 机器指令CPU操作流程图
Rs→BUS
BUS→AC
PC→AR
PC+1
测FC,FZ
RD ROM
BUS→PC
FZ=0,CS_I↓
RE=0,ID_RM=0
SW_B=1,CS=0,
LDPC↑,LOAD=0
Rd→BUS
BUS→DR
AC-DR
锁存FC,FZ
JB addr
INC Rd

6.嵌入式RISC模型计算机的顶层电路图

顶层电路图由一个输入(INPUT)和一个输出(OUTPUT),以及七个寄存器(R0,R1,R3,AR,IR,AC,DR),两个二选一选择器(MUX2_PC,MUX2_RM),一个三选一选择器(MUX3),一个ALU运算器,一个计数器PC,一个时序产生器,一个状态条件寄存器,一个一分二分配器,一个ROM存储器、一个RAM存储器和中央控制器组成,如下图(图6.1)所示。
其中二选一选择器MUX2_PC实现将PC或BUS数据送AR,MUX2_RM将RAM或ROM数据送三选一选择器,再送内部数据总线。中间3个寄存器,从上向下依次编号为R0、R1、R2,用来暂存数据和交换数据之用,初始R0用于接收10个数存入RAM,然后再用R0作为游标指向10个数据RAM中首地址,R1、R2分别用于数据传递。而MODE_CONTROL则是本系统的核心之一:译码与控制模块。指令序列存储在ROM里面,数据存储在RAM中,分为正数存储区、负数存储区以及所有10个原数据存储区。PC是计数器,COUNTER是时序产生器. ALU为加法计算器,FR为状态条件寄存器。

图6.1 顶层设计原理图

7 汇编语言源程序

7.1算法简单描述:

1. R1接收数据,R0为游标,指向12H开始的RAM中连续的10个存储空间的首地址
2. R0下移,并与1CH比较判断是否已经输入10个数据。
3. R1指针回指到10个原数据的首地址开始取数,读数进行正负判断,为正数则输出并将其保存到00H起始的存放正数的内存单元,并将正数存储单元中下一个待存数的地址写回1DH存储单元 中,负数则直接另存到以09H为首地址的存储单元中,同样存入数后将下一个待存数的地址写回到1EH存储单元中。
4. R0与1CH比较判断是否已将10个数据全部读完,取完输出1DH存储单元中正数计数器值即为正数个数

输入包含10个整数(补码表示)的数组M,存放在1CH开始的10个存储单元中,00H向后的9个地址用来保存正数数组P,09H向后的9个地址用来保存负数数组N,12H向后的10个地址用来保存输入的所有数即数组M,1DH用来存放正数尾地址,同时也作为正数计数器,1EH用来指向负数尾地址, R0为游标,指向数组M。
注:由于内存开辟32个存储单元时,MEM才能在仿真图中调出,帮将保存正数和负数的空间修改为9个存储单元。

7.2汇编程序

Mov R0,12H 数据组M内存起始地址送R0
L1: IN1 R1 R1用于接收数据
MovRM R1,[R0] (R1)->((R0))
INC R0 R0指针下移
Mov R2,1CH 1CH->R2
CMP R0,R2 判断是否已经将10个数据输完
JB L1 小于说明未达到10个数继续接收数据,否则向下执行初始化工作。
Mov R1,1DH 1DH->R1,保存正数存储单元中下一个待存数据的地址
Mov R2,00H 00H->R2
MovRM R2,[R1] (R2)->((R1)),将1D存储单元初始化为00H
Mov R1,1EH 1EH->R1,保存负数存储单元中下一个待存数据的地址
Mov R2,09H 09H->R2
MovRM R2,[R1] (R2)->((R1)),将1D存储单元初始化为09H
Mov R0,12H R0指针回指到数组M的首地址,用于读数的游标
L2: Mov R1,80H 80H->R1
MovMR [R0],R2 ((R0))->R2
CMP R2,R1 比较正负
JB L3 小于80H为正数,跳转L3执行
Mov R1,1EH 1EH->R1,取负数存储单元当前地址值
MovMR [R1],R2 ((R1))->R2, 负数存储单元当前地址值送R2
MovMR [R0],R1 ((R0))->R1,当前数送R1
MovRM R1,[R2] (R1)->((R2)),当前负数送R2指向的负数存储单元当前地址中
INC R2 (R2)+1->R2, 负数存储单元当前地址加一
Mov R1,1EH 1EH->R1,负数计数器地址送R1
MovRM R2,[R1] 负数地址块中待存数的地址回送到1EH存储单元中
JMP L4 跳转到L4
L3: OUT1 R2 输入当前正数
Mov R1,1DH 1DH->R1正数计数器地送R1,取正数当前待存地址
MovMR [R1],R2 ((R1))->R2,正数存储区当前待存数地址送R2
MovMR [R0],R1 ((R1))->R1,当前数送R1
MovRM R1,[R2] (R1)->((R2)),当前数保存到R2指向的内存单元
INC R2 (R2)+1->R2
Mov R1,1DH 正数计数器地址1DH->R1
MovRM R2,[R1] 正数存储区下一个待存数据的地址保存到1DH
L4:INC R0 指向所有数的游标下移
Mov R1,1CH 1CH->R1,用于判断是否已经取完10个数
CMP R0,R1 比较取数游标与1CH
JB L2 小于则未取完10个数,否则取正数计数器值,输出正数个数
Mov R1,1DH 正数计数器地址1DH->R1
MovMR [R1],R2 正数计数器值送R2
OUT1 R2 输出正数个数

8 机器语言源程序

根据设计的指令格式,将汇编语言源程序手工汇编成机器代码
如下表:
助记符地址(十六进制)机器代码功能
Mov R0,12H 001001000012->R0
 0100100000 
L1: IN1 R1 0210000001(SW)->R1
MovRM R1,[R0] 0301010100(R1)->((R0))
INC R0 0411010000(R0)+1->R0
Mov R2,1CH 05100100101C->R2
 0600101010 
CMP R0,R2 0711000010(R0)-(R2),锁存CY和ZI
JB L1 0810110000若小于,则L1->PC
 0900000010 
Mov R1,1DH 0A100100011D->R1
 0B00110000 
Mov R2,00H 0C1001001000->R2
 0D00000000 
MovRM R2,[R1] 0E01011001(R2)->((R1))
Mov R1,1EH 0F100100011E->R1
 1000110001 
Mov R2,09H 111001001009->R2
 1200010000 
MovRM R2,[R1] 1301011001(R2)->((R1))
Mov R0,12H 141001000012->R0
 1500100000 
L2: Mov R1,80H161001000180->R1
 1710000000 
MovMR [R0],R2 1810100010((R0))->(R2)
CMP R2,R1 1911001001(R2)-(R1),锁存CY和ZI
JB L3 1A10110000L3->PC
 1B00100111 
Mov R1,1EH 1C100100011E->R1
 1D00110001 
MovMR [R1],R2 1E10100110((R1))->R2
MovMR [R0],R1 1F10100001((R0))->R1
MovRM R1,[R2] 2001010110(R1)->((R2))
INC R2 2111010010(R2)+1->R2
Mov R1,1EH 22100100011E->R1
 2300110001 
MovRM R2,[R1] 2401011001(R2)->((R1))
JMP L4 2511100000L4->PC
 2600110001 
L3: OUT1 R2 2711111000(R2)->LED
Mov R1,1DH 28100100011D->R1
 2900110000 
MovMR [R1],R2 2A10100110((R1))->R2
MovMR [R0],R1 2B10100001((R0))->R1
MovRM R1,[R2] 2C01010110(R1)->((R2))
INC R2 2D11010010(R2)+1->R2
Mov R1,1DH 2E100100011D->R1
 2F00110000 
MovRM R2,[R1] 3001011001()->(())
L4:INC R0 3111010000(R0)+1->R0
Mov R1,1CH 32100100011C->R1
 3300101010 
CMP R0,R1 3411000001 
JB L2 3510110000L2->PC
 3600010110 
Mov R1,1DH 37100100011D->R1
 3800110000 
MovMR [R1],R2 3910100110((R1))->R2
OUT1 R2 3A11111000(R2)->LED
表8-1机器机器语言源程序

9 时序仿真波形图

在仿真输出波形图上,挑选显示的项为Q,CLR,, PC, AR, IR, R0,R1,R2, MEM, INPUT[7..0]以及OUTPUT[7..0],Q设置为时钟脉冲,CLR清零信号除开始一小段时间为低电平之外,其余时间均为高电平。
下面进行仿真输入,在IR值为81处对应的INPUT输入口输入一组排序数,输入数据90,02,03,81,82,06,84,85,09,87。
输入:

输出:

内存:

图9.1 仿真波形图

图9.2 仿真输出波形图
可以通过OUTPUT观察输出数据或者从内存MEM可以看出是否正确
OUTPUT输出结果为:02 03 06 09 04 其中最后一个数为正数个数
从MEM中得结果如下
正数数组:02 03 06 09
负数数组: 90 81 82 84 85 87
所有数: 90 02 03 81 82 06 84 85 09 87
显然可以看出结果正确。

10.故障现象和故障分析

1.MEM在仿真波形图中无法调出
解决办法:RAM为64,128个存储单元时都不会出现MEM, 只有改为32个存储单元才可以在仿真波形图中调出MEM
2.Project does not fit in specified device[s]
解决办法:未分配硬件设备目标芯片。选择菜单”Assign”->”Device”->”ACEX1K”->”ep1k30tc144-a”
3.汇编程序只执行了一半
解决办法:查看中央控制器代码,发现将JMP控制信号写错
4.unexpected end- of –file –try using the Text Editor’s Syntax Coloring command to find the missing delimiter or keyword
解决办法:在对应的行上加上右括号

11.学习体会

本实验内容是设计一台嵌入式RISC模型机,与本科时CISC模型机相比,有一定的复杂度,当然在这短暂的几个星期的实验中,我在陈智勇老师的指导和同学们的耐心帮助之下成功完成了本次实验,并得到了办好的实验结果,学到了很多方面的知识,对计算机系统结构,VHDL等相关的资料的学习,掌握了设计软件MAX+plus II的使用。通过本次实验的设计,使我对计算机系统结构有了进一步的了解,也对RISC模型微处理器的设计以及其内部运作有了一个初步的理解。本实验的算法设计我想到了三种方法,唯独最后的一种方法既节省了寄存器,又节省了较少的指令条数,当然事事并无完美之处,在我的程序中,增加了读存和写存的过程,牺牲了时间的基础上实现的。
最后,对给予我细心指导的陈智勇老师和同学们表示衷心的感谢。

参考文献

[1]陈智勇 编. 计算机组成系统实验. 桂林电子工业学院计算机系. 2002年09月
[2]潘松,王国栋 编著. VHDL实用教程. 电子科技大学出版社. 2001年02月
[3]白中英 编. 《计算机组成原理》. 科学出版社. 1997年10月
[4] David A. Patterson,John L. Hennessy 计算机体系结构量化研究方法 机械工业出版社 2002年9月
[5]曾繁泰 编 VHDL程序设计 清华大学出版社 2001年3月

附录:软件源程序

1 ALU单元源程序

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY ALU IS
PORT(
A:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
B:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
S1,S0:IN STD_LOGIC;
BCDOUT:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
CY,ZI:OUT STD_LOGIC

);
END ALU;
ARCHITECTURE A OF ALU IS
SIGNAL AA,BB,TEMP:STD_LOGIC_VECTOR(8 DOWNTO 0);
BEGIN
PROCESS(S1,S0)
BEGIN
IF(S1='0' AND S0='0') THEN
AA<='0'&A;
BB<='0'&B;
TEMP<=AA+BB;
BCDOUT<=TEMP(7 DOWNTO 0);
CY<=TEMP(8);
IF(TEMP="100000000") THEN
ZI<='1';
ELSE
ZI<='0';
END IF;
ELSIF(S1='0' AND S0='1') THEN
BCDOUT<=A-B;
IF(A<B) THEN
CY<='1';
ZI<='0';
ELSIF(A=B) THEN
CY<='0';
ZI<='1';
ELSE
CY<='0';
ZI<='0';
END IF;
ELSIF(S1='1' AND S0='0') THEN
AA<='0'&A;
TEMP<=AA+1;
BCDOUT<=TEMP(7 DOWNTO 0);
CY<=TEMP(8);
IF(TEMP="100000000") THEN
ZI<='1';
ELSE
ZI<='0';
END IF;
ELSE
BCDOUT<="00000000";
CY<='0';
ZI<='0';
END IF;
END PROCESS;
END A;

2 状态条件寄存器单元源程序

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY LS74 IS
PORT(
LDFR:IN STD_LOGIC;
CY,ZI:IN STD_LOGIC;
FC,FZ:OUT STD_LOGIC
);
END LS74;
ARCHITECTURE A OF LS74 IS
BEGIN
PROCESS(LDFR)
BEGIN
IF(LDFR'EVENT AND LDFR='1')THEN
FC<=CY;
FZ<=ZI;
END IF;
END PROCESS;
END A;

3 暂存器、通用寄存器、地址寄存器、指令寄存器单元源程序

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY LS273 IS
PORT
(
D:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
CLK:IN STD_LOGIC;
O:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
);
END LS273;
ARCHITECTURE A OF LS273 IS
BEGIN
PROCESS(CLK)
BEGIN
IF(CLK'EVENT AND CLK='1')THEN
O<=D;
END IF;
END PROCESS;
END A;

4 1:2分配器单元源程序

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY FEN2 IS

PORT(
X: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
LED_B,WR_FEN2: IN STD_LOGIC;
W1,W2: OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
);
END FEN2;

ARCHITECTURE A OF FEN2 IS
BEGIN
PROCESS(LED_B,WR_FEN2)
BEGIN
IF(LED_B='0' AND WR_FEN2='0') THEN --TO OUTPUT
W2 <= X;
ELSe --TO MUX3
W1 <= X;
END IF;
END PROCESS;
END A;

5 三选一选择器单元源程序

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY MUX3 IS
PORT(
SW_B,CS:IN STD_LOGIC;
INPUT:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
IN_FEN2,IN_RM:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
TO_DBUS:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
);
END MUX3;
ARCHITECTURE A OF MUX3 IS
BEGIN
PROCESS(SW_B,CS)
BEGIN
IF(SW_B='0') THEN
TO_DBUS<=INPUT; --外部输入数据
ELSIF(CS='0')THEN
TO_DBUS<=IN_RM; --将ROM,RAM读出的数据送内部总线
ELSE
TO_DBUS<=IN_FEN2; --经4选1选择器输入送内部总线
END IF;
END PROCESS;
END A;

6 四选一单元源程序

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY MUX4 IS
PORT(
C,D,E,F:IN STD_LOGIC;
X1,X2,X3,X4:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
W:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
);
END MUX4;
ARCHITECTURE A OF MUX4 IS
SIGNAL SEL:STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
SEL<=F&E&D&C;
PROCESS(SEL)
BEGIN
IF(SEL="1110")THEN
W<=X1;
ELSIF(SEL="1101")THEN
W<=X2;
ELSIF(SEL="1011")THEN
W<=X3;
ELSIF(SEL="0111")THEN
W<=X4;
ELSE
NULL;
END IF;
END PROCESS;
END A;

7 程序计数器单元源程序

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY PC IS
PORT(
LOAD,LDPC,CLR:IN STD_LOGIC;
D:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
O:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
);
END PC;
ARCHITECTURE A OF PC IS
SIGNAL QOUT:STD_LOGIC_VECTOR(7 DOWNTO 0);
BEGIN
PROCESS(LDPC,CLR,LOAD)
BEGIN
IF(CLR='0') THEN
QOUT<="00000000";--将PC清0
ELSIF(LDPC'EVENT AND LDPC='1')THEN
IF(LOAD='0') THEN
QOUT<=D;--将数据总线的内容送PC
ELSE
QOUT<=QOUT+1;--PC+1
END IF;
END IF;
END PROCESS;
O<=QOUT;
END A;

8 ROM16单元源程序

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY ROM16 IS
PORT(

ADDR:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
CS_I:IN STD_LOGIC ;
DOUT:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
);
END ROM16;
ARCHITECTURE A OF ROM16 IS
BEGIN
Process(CS_I)
BEGIN
IF(CS_I'EVENT AND CS_I='0') THEN

CASE ADDR IS
WHEN "00000000"=>DOUT<="10010000";--00 Mov R0,12H
WHEN "00000001"=>DOUT<="00010010";--01
WHEN "00000010"=>DOUT<="10000001";--02 L1: IN1 R1
WHEN "00000011"=>DOUT<="01010100";--03 MovRM R1,[R0]
WHEN "00000100"=>DOUT<="11010000";--04 INC R0
WHEN "00000101"=>DOUT<="10010010";--05 Mov R2,1CH
WHEN "00000110"=>DOUT<="00011100";--06
WHEN "00000111"=>DOUT<="11000010";--07 CMP R0,R2
WHEN "00001000"=>DOUT<="10110000";--08 JB L1
WHEN "00001001"=>DOUT<="00000010";--09
WHEN "00001010"=>DOUT<="10010001";--0A Mov R1,1DH
WHEN "00001011"=>DOUT<="00011101";--0B
WHEN "00001100"=>DOUT<="10010010";--oC Mov R2,00H
WHEN "00001101"=>DOUT<="00000000";--OD
WHEN "00001110"=>DOUT<="01011001";--OE MovRM R2,[R1]
WHEN "00001111"=>DOUT<="10010001";--OF Mov R1,1EH

WHEN "00010000"=>DOUT<="00011110";--10
WHEN "00010001"=>DOUT<="10010010";--11 Mov R2,09H
WHEN "00010010"=>DOUT<="00001001";--12
WHEN "00010011"=>DOUT<="01011001";--13 MovRM R2,[R1]
WHEN "00010100"=>DOUT<="10010000";--14 Mov R0,12H
WHEN "00010101"=>DOUT<="00010010";--15
WHEN "00010110"=>DOUT<="10010001";--16 L2: Mov R1,80H
WHEN "00010111"=>DOUT<="10000000";--17
WHEN "00011000"=>DOUT<="10100010";--18 MovMR [R0],[R2]
WHEN "00011001"=>DOUT<="11001001";--19 CMP R2,R1
WHEN "00011010"=>DOUT<="10110000";--1A JB L3
WHEN "00011011"=>DOUT<="00100111";--1B
WHEN "00011100"=>DOUT<="10010001";--1C Mov R1,1EH
WHEN "00011101"=>DOUT<="00011110";--1D
WHEN "00011110"=>DOUT<="10100110";--1E MovMR [R1],R2
WHEN "00011111"=>DOUT<="10100001";--1F MovMR [R0],R1

WHEN "00100000"=>DOUT<="01010110";--20 MovRM R1,[R2]
WHEN "00100001"=>DOUT<="11010010";--21 INC R2
WHEN "00100010"=>DOUT<="10010001";--22 Mov R1,1EH
WHEN "00100011"=>DOUT<="00011110";--23
WHEN "00100100"=>DOUT<="01011001";--24 MovRM R2,[R1]
WHEN "00100101"=>DOUT<="11100000";--25 JMP L4
WHEN "00100110"=>DOUT<="00110001";--26
WHEN "00100111"=>DOUT<="11111000";--27 L3: OUT1 R2
WHEN "00101000"=>DOUT<="10010001";--28 Mov R1,1DH
WHEN "00101001"=>DOUT<="00011101";--29
WHEN "00101010"=>DOUT<="10100110";--2A MovMR [R1],R2
WHEN "00101011"=>DOUT<="10100001";--2B MovMR [R0],R1
WHEN "00101100"=>DOUT<="01010110";--2C MovRM R1,[R2]
WHEN "00101101"=>DOUT<="11010010";--2D INC R2
WHEN "00101110"=>DOUT<="10010001";--2E Mov R1,1DH
WHEN "00101111"=>DOUT<="00011101";--2F

WHEN "00110000"=>DOUT<="01011001";--30 MovRM R2,[R1]
WHEN "00110001"=>DOUT<="11010000";--31 L4:INC R0
WHEN "00110010"=>DOUT<="10010001";--32 Mov R1,1CH
WHEN "00110011"=>DOUT<="00011100";--33
WHEN "00110100"=>DOUT<="11000001";--34 CMP R0,R1
WHEN "00110101"=>DOUT<="10110000";--35 JB L2
WHEN "00110110"=>DOUT<="00010110";--36
WHEN "00110111"=>DOUT<="10010001";--37 Mov R1,1DH
WHEN "00111000"=>DOUT<="00011101";--38
WHEN "00111001"=>DOUT<="10100110";--39 MovMR [R1],R2
--WHEN "00111010"=>DOUT<="11010010";--3A INC R2
WHEN "00111011"=>DOUT<="11111000";--3B OUT1 R2

WHEN OTHERS=>NULL;
END CASE;

END IF;
END PROCESS;
END A;

9 RAM单元源程序

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY RAM IS
PORT(
WR,CS_D:IN STD_LOGIC;
DIN:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
DOUT:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
ADDR:IN STD_LOGIC_VECTOR(7 DOWNTO 0)
);
END RAM;
ARCHITECTURE A OF RAM IS
TYPE MEMORY IS ARRAY(0 TO 31) OF STD_LOGIC_VECTOR(7 DOWNTO 0);
BEGIN
PROCESS(CS_D,WR)
VARIABLE MEM:MEMORY;
BEGIN
IF(CS_D'EVENT AND CS_D='0') THEN
IF(WR='0') THEN --写内存
MEM(CONV_INTEGER(ADDR(4 DOWNTO 0))):=DIN;
ELSIF(WR='1') THEN --读RAM
DOUT<=MEM(CONV_INTEGER(ADDR(4 DOWNTO 0)));
END IF;
END IF;
END PROCESS;
END A;

10 时序产生器单元源程序

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY COUNTER IS
PORT(
Q,CLR:IN STD_LOGIC;
T1,T2,T3,T4:OUT STD_LOGIC
);
END COUNTER;
ARCHITECTURE A OF COUNTER IS
SIGNAL X:STD_LOGIC_VECTOR(1 DOWNTO 0);
BEGIN
PROCESS(Q,CLR)
BEGIN
IF(CLR='0') THEN
T1<='0';
T2<='0';
T3<='0';
T4<='0';
X<="00";
ELSIF(Q'EVENT AND Q='1') THEN
X<=X+1;
T1<=(NOT X(1)) AND (NOT X(0));
T2<=(NOT X(1)) AND X(0);
T3<=X(1) AND (NOT X(0));
T4<=X(1) AND X(0);
END IF;
END PROCESS;
END A;

11 选择从PC或者BUS中读入数据到AR的二选一选择器单元源程序

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;

ENTITY MUX2_PC IS
PORT(
ID_PC: IN STD_LOGIC;
IN_BUS,IN_PC: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
TO_AR: OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
);
END MUX2_PC;

ARCHITECTURE A OF MUX2_PC IS
BEGIN
PROCESS (ID_PC,IN_BUS,IN_PC)
BEGIN
IF (ID_PC= '0') THEN
TO_AR<= IN_BUS;
ELSIF (ID_PC= '1') THEN
TO_AR<= IN_PC;
END IF;
END PROCESS;
END A;

12 选择对ROM或者RAM进行操作的二选一选择器单元源程序

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;

ENTITY MUX2_RM IS
PORT(
ID_RM: IN STD_LOGIC;
IN_RAM,IN_ROM: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
D_OUT: OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
);
END MUX2_RM;

ARCHITECTURE A OF MUX2_RM IS
BEGIN
PROCESS (ID_RM,IN_ROM,IN_RAM)
BEGIN
IF (ID_RM= '1') THEN
D_OUT <= IN_RAM;
ELSIF (ID_RM= '0') THEN
D_OUT <= IN_ROM;
END IF;
END PROCESS;
END A;

13 MODE_CONTROL中央控制器单元源程序

LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY MODE_CONTROL IS
PORT(
DIN:IN STD_LOGIC_VECTOR(7 DOWNTO 0);--IR
Q,T1,T2,T3,T4,CLR:IN STD_LOGIC;
FZ,FC:IN STD_LOGIC;

LOAD,LDPC:OUT STD_LOGIC;--PC
LDAR:OUT STD_LOGIC;--AR
LDIR:OUT STD_LOGIC;--IR
LDR0,LDR1,LDR2:OUT STD_LOGIC;--控制R0,R1,R2输入
R0_B,R1_B,R2_B,ALU_B:OUT STD_LOGIC;--控制R0,R1,R2输出
S1,S0:OUT STD_LOGIC;--ALU
SW_B,CS:OUT STD_LOGIC;
CS_I:OUT STD_LOGIC;--控制ROM的片选信号
CS_D,WR:OUT STD_LOGIC;--控制RAM的片选及其读写信号
ID_PC:OUT STD_LOGIC;
ID_RM:OUT STD_LOGIC;
LDAC:OUT STD_LOGIC;
LDDR:OUT STD_LOGIC;
LED_B,WR_FEN2:OUT STD_LOGIC;
LDFR:OUT STD_LOGIC

);
END MODE_CONTROL;
ARCHITECTURE A OF MODE_CONTROL IS
SIGNAL YIMA:STD_LOGIC_VECTOR(8 DOWNTO 0);
SIGNAL IN1,MOV,MOVRM,MOVMR,CMP,JB,INC,JMP,OUT1:STD_LOGIC;
SIGNAL LDRi,RS_B,RD_B:STD_LOGIC;
SIGNAL M:STD_LOGIC:='0';
BEGIN
P1:PROCESS(CLR,T4)
BEGIN
IF(CLR='0')THEN
M<='0';
ELSIF(T4'EVENT AND T4='0')THEN
IF((IN1 OR MOV OR MOVRM OR MOVMR OR INC OR JB OR JMP OR OUT1)='1')THEN
M<='0';
ELSIF(CMP ='1')THEN
M<=NOT M;
END IF;
END IF;
END PROCESS P1;
P2:PROCESS(Q,CLR)
BEGIN
CASE DIN(7 DOWNTO 4)IS
WHEN"1000"=>YIMA<="000000001";--IN1
WHEN"1001"=>YIMA<="000000010";--Mov
WHEN"0101"=>YIMA<="000000100";--MovRM
WHEN"1010"=>YIMA<="000001000";--MovMR
WHEN"1100"=>YIMA<="000010000";--CMP
WHEN"1011"=>YIMA<="000100000";--JB
WHEN"1101"=>YIMA<="001000000";--INC
WHEN"1110"=>YIMA<="010000000";--JMP
WHEN"1111"=>YIMA<="100000000";--OUT1
WHEN OTHERS=>YIMA<="000000000";
END CASE;

LDAC<=(CMP OR INC) AND T3 AND (NOT Q) AND (NOT M);
LDDR<=CMP AND T4 AND (NOT Q) AND (NOT M);
ALU_B<=NOT(INC AND T4 AND (NOT M));
LOAD<=NOT((JMP AND T4 AND (NOT M) ) OR( JB AND T4 AND(NOT M)AND(FC AND (NOT FZ))));
LDPC<=(T1 AND (NOT Q)AND (NOT M)) OR((MOV OR JB or JMP)AND T3 AND(NOT Q)AND (NOT M))OR(JB AND T4 AND (NOT Q)AND(NOT M)AND(FC AND(NOT
FZ))) OR (JMP AND T4 AND (NOT Q) AND (NOT M)); LDIR<=T2 AND (NOT Q)AND(NOT M);
LDFR<=CMP AND T1 AND (NOT Q)AND M;
RS_B<=NOT((( MOVMR OR CMP OR OUT1)AND T3 AND (NOT M))OR(MOVRM AND T4 AND (NOT M)));
RD_B<=NOT(((MOVRM OR INC )AND T3 AND (NOT M))OR (CMP AND T4 AND(NOT M)));
R0_B<=(RS_B OR DIN(3)OR DIN(2))AND(RD_B OR DIN(1)OR DIN(0));
R1_B<=(RS_B OR DIN(3)OR(NOT DIN(2)))AND(RD_B OR DIN(1)OR(NOT DIN(0)));
R2_B<=(RS_B OR(NOT DIN(3))OR DIN(2))AND(RD_B OR(NOT DIN(1))OR DIN(0));

LDRi<=(IN1 AND T3 AND(NOT Q)AND(NOT M))OR((MOV OR MOVMR OR INC )AND T4 AND(NOT Q)AND(NOT M));
LDR0<=LDRi AND(NOT DIN(1))AND(NOT DIN(0));
LDR1<=LDRi AND(NOT DIN(1))AND DIN(0);
LDR2<=LDRi AND DIN(1)AND(NOT DIN(0));

S1<=INC AND T4 AND(NOT M);
S0<=CMP AND T1 AND M;
CS<=NOT((T2 AND(NOT M))OR((MOV OR MOVMR OR JMP)AND T4 AND(NOT M))OR(JB AND T4 AND(NOT M)AND((NOT FZ)AND FC)));
LDAR<=(T1 AND(NOT M))OR((MOV OR JB OR JMP)AND T3 AND(NOT M))OR((MOVRM OR MOVMR) AND T3 AND(NOT Q)AND(NOT M));
SW_B<=NOT(IN1 AND T3 AND(NOT M));
LED_B<=NOT(OUT1 AND T3 AND(NOT M));
WR_FEN2<=NOT(OUT1 AND T3 AND (NOT M));
ID_PC<=NOT((MOVRM OR MOVMR)AND T3 AND(NOT M));
ID_RM<=MOVMR AND T4 AND(NOT M);
CS_D<=NOT( (MOVRM AND T4 AND(NOT Q)AND(NOT M)) OR (MOVMR AND T4 AND(NOT M)) );
WR<=NOT(MOVRM AND T4 AND(NOT M));
--WR<=MOVMR AND T4 AND (NOT M);
CS_I<=NOT( (T2 AND(NOT M)) OR (MOV AND T4 AND(NOT M)) OR (JMP AND T4 AND (NOT M)) OR (JB AND T4 AND(NOT M)AND((NOT FZ)AND FC) ) );

END PROCESS P2;

OUT1<=YIMA(8);
JMP<=YIMA(7);
INC<=YIMA(6);
JB<=YIMA(5);
CMP<=YIMA(4);
MOVMR<=YIMA(3);
MOVRM<=YIMA(2);
MOV<=YIMA(1);
IN1<=YIMA(0);
END A;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: