资源描述
第28页
一. 课设题目:
设计一台嵌入式CISC模型计算机(采用定长CPU周期、联合控制方式),并运行能完成一定功能的机器语言程序进行验证,实现方法可从以下4类中任选一个:
●连续输入5个有符号整数(8位二进制补码表示,用十六进制数输入),求最大的负数并输出显示。
说明:①5个有符号数从外部输入;
②一定要使用符号标志位(比如说SF),并且要使用为负的时候转移(比如JS)或不为负的时候转移(比如JNS)指令。
二.CISC模型机数据通路框图
操作控制器和
时序产生器
状态条件
寄存器
FC
FZ
ALU
AC
DR
R0
R1
R2
PC
AR
ROM
IR
具有时间标志的
操作控制信号
输入设备
输出设备
嵌入式CISC模型机
外部时钟
复位信号
三.操作控制器的逻辑框图
…
…
指令寄存器IR
操作码
微地址寄存器
地址译码
控制存储器
地址转移
逻辑
状态条件
微命令寄存器
P字段
操作控制字段
微命令信号
说明:
在T4内形成微指令的微地址,并访问控制存储器,在T2的上边沿到来时,将读出的微指令打入微指令寄存器,即图中的微命令寄存器和微地址寄存器。
四.模型机的指令系统和所有指令的指令格式
由此可见,本模型机中的指令系统中共有8条基本指令,下表列出了每条指令的格式、汇编符号和指令功能。
助记符号
指令格式
功 能
IN1 Rd
1 0 0 0
××
Rd
将数据存到Rd寄存器
OUT1 Rs
1 1 1 1
Rs
××
(Rs)→LED
MOV1 Rs,Rd
1 1 0 0
Rs
Rd
(Rs)→(Rd)
CMP Rs,Rd
1 0 1 0
Rs
Rd
(Rs)-(Rd),锁存FS
INC Rd
1 1 0 1
××
Rd
(Rd)+1→Rd
MOV Rd,data
1 0 0 1
××
Rd
data
data→Rd
JMP addr
1 1 1 0
××××
addr
addr→PC
JNC addr
1 0 1 1
××××
addr
若小于,则addr→PC
TEST Rd
0 1 1 1
××
Rd
测试是否 >0,锁存FS
说明:①对Rs和Rd的规定:
Rs或Rd
选定的寄存器
0 0
R0
0 1
R1
1 0
R2
②模型机规定数据的表示采用定点整数补码表示,单字长为8位,其格式如下:
7
6 5 4 3 2 1 0
符号位
尾数
五.所有机器指令的微程序流程图
00
PC→AR
PC+1
02
RD M
BUS→IR
00
P(1)
TEST
OUT1
JMP
INC
MOV1
JNS
CMP
MOV
IN1
07
0F
0E
0D
OC
0B
0A
09
08
Rd→BUS
BUS→AC
Rs→BUS
BUS→AC
Rs→LED
Rd→BUS
BUS→AC
Rs→BUS
BUS→AC
PC→AR
PC+1
PC→AR
PC+1
PC→AR
PC+1
SW→BUS
BUS→Rd
20
06
00
13
12
04
03
锁存FS
00
00
P(2)
ROM→BUS
BUS→PC
Rd→BUS
BUS→DR
ROM→BUS
BUS→Rd
AC+1→BUS
BUS→Rd
00
00
00
05
00
AC-DR
锁存FS
FS=1
FS=0
00
30
20
ROM→BUS
BUS→PC
00
00
设计操作控制器单元(即微程序控制器)
(1)设计微指令格式和微指令代码表
CISC模型机系统使用的微指令采用全水平型微指令,字长为25位,其中微命令字段为17位,P字段为2位,后继微地址为6位,其格式如下:
24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
LOAD LDPC LDAR LDIR LDRi RD_B RS_B S1 S0 ALU_B LDAC LDDR WR CS SW_B LED_B LDFR P1 P2 后继微地址
由微指令格式和微程序流程图编写的微指令代码表如下所示,在微指令的代码表中微命令字段从左边到右代表的微命令信号依次为:LOAD、LDPC、LDAR、LDIR、LDRi、RD_B、RS_B、S1、S0、ALU_B、LDAC、LDDR、WR、CS、SW_B、LED_B、LDFR。
微地址
微命令字段
P1
P2
后继微地址
000000
1
1
1
0
0
1
1
0
0
1
0
0
1
1
1
1
0
0
0
000010
000010
1
0
0
1
0
1
1
0
0
1
0
0
1
0
1
1
0
1
0
001000
000011
1
0
0
0
1
1
1
0
0
1
0
0
1
0
1
1
0
0
0
000000
000100
1
0
0
0
0
0
1
0
0
1
0
1
1
1
1
1
0
0
0
000101
000101
1
0
0
0
0
1
1
0
1
1
0
0
1
1
1
1
1
0
0
000000
000110
1
0
0
0
0
1
1
0
0
1
0
0
1
1
1
1
1
0
0
000000
000111
1
0
0
0
0
0
1
0
0
1
1
0
1
1
1
1
0
0
0
000110
001000
1
0
0
0
1
1
1
0
0
1
0
0
1
1
0
1
0
0
0
000000
001001
1
1
1
0
0
1
1
0
0
1
0
0
1
1
1
1
0
0
0
000011
001010
1
0
0
0
0
1
0
0
0
1
1
0
1
1
1
1
0
0
0
000100
001011
1
1
1
0
0
1
1
0
0
1
0
0
1
1
1
1
0
0
1
100000
001100
1
0
0
0
1
1
0
0
0
1
0
0
1
1
1
1
0
0
0
000000
001101
1
0
0
0
0
0
1
0
0
1
1
0
1
1
1
1
0
0
0
010010
001110
1
1
1
0
0
1
1
0
0
1
0
0
1
1
1
1
0
0
0
010011
001111
1
0
0
0
0
1
0
0
0
1
0
0
0
1
1
0
0
0
0
000000
010010
1
0
0
0
1
1
1
1
0
0
0
0
1
1
1
1
0
0
0
000000
010011
0
1
0
0
0
1
1
0
0
1
0
0
1
0
1
1
0
0
0
000000
100000
0
1
0
0
0
1
1
0
0
1
0
0
1
0
1
1
0
0
0
000000
110000
1
0
0
0
0
1
1
0
0
1
0
0
1
1
1
1
0
0
0
000000
(2)设计地址转移逻辑电路
地址转移逻辑电路是根据微程序流程图3-2中的棱形框部分及多个分支微地址,利用微地址寄存器的异步置“1”端,实现微地址的多路转移。
由于微地址寄存器中的触发器异步置“1”端低电平有效,与µA4~µA0对应的异步置“1”控制信号SE5~SE1的逻辑表达式为:(µA5的异步置“1”端SE6实际未使用)
SE5= FS·P(2)·T4
SE4=I7·P(1)·T4
SE3=I6·P(1)·T4
SE2=I5·P(1)·T4
SE1=I4·P(1)·T4
六.嵌入式CISC模型计算机的顶层电路图
七. 汇编语言源程序
MOV R1,00H 功能:将0赋给R1
MOV R2,80H 将80赋给R2
L1:IN1 R0 输入一个数放入R0
INC R1 将R1加1
TEST R0 测试R0的符号位,锁存FS
JNS L1 为正跳转到L1处
CMP R2,R0 (R2)-(R0),锁存FS
JNS L1 大于跳转到L1处
MOV1 R0,R2 ( R0)->(R2),锁存FS
MOV R0,04H 将04存入R0
CMP R1,R0 累加器(R1)-(R0),锁存FS
JNS L2 大于0跳转到L2出输出
JMP L1 否则跳转到L1处
L2:OUT1 R2 输出R2的内容
八.机器语言源程序
助记符 地址(十六进制) 机器代码 机器代码十六进制
MOV R1,00H 00 10010001 91
01 00000000 00
MOV R2,80H 02 10010010 92
03 10000000 80
L1:IN1 R0 04 10000000 80
INC R1 05 11010001 D1
TEST R0 06 01110000 70
JNS L1 07 10110000 B0
08 00000100 04
CMP R2,R0 09 10101000 A8
JNS L1 0A 10110000 B0
0B 00000100 04
MOV1 R0,R2 0C 11000010 C2
MOV R0,04H 0D 10010000 90
0E 00000100 04
CMP R1,R0 0F 10100100 A4
JNS L2 10 10110000 B0
11 00010100 14
JMP L1 12 11100000 E0
13 00000100 04
L2:OUT1 R2 14 11111000 F8
九.机器语言源程序的功能仿真波形图及结果分析
执行MOV R1,0 执行MOV R2,8O
执行IN1 RO 累加器R1+1 TEST RO,锁存FS 执行JNS L1
将88输入到R0
执行CMP R2,R0,比较大小 执行JNS L1 R2<R0,将R0的值赋给R2
执行MOV R0,04 执行CMP R1,R0,看是否输入够了五个数 执行JNS L2,够5个数跳转
执行JMP L1,跳转到L1处继续输入 执行IN1 R0,输入数据 INC R1,R1累加1
当R1累加到5后 够五个数跳转到L2 执行OUT1,R2,输出R2
执行CMP R1,R0
输出为99
十.故障现象和故障分析
故障1:
在进行仿真的时候,输入完一个数后程序执行到最后应该跳转到前面执行第二次输入,但我的仿真结果确实直接就跳到最后输出的那一步啦,刚开始以为是自己的跳转微指令写错啦,但经过检查没有发现错误,然后我又检查了ROM里面的代码,也没有发现错误,就在自己非常郁闷的时候,我的同学告诉我,应该把读取指令周期中P1测试前的08改成00,这样在P1测试后才能进行正常的跳转,后来我一该,果然好了。
故障2:
仿真完了之后没有输出,后来经过老师的帮助才知道自己把微命令写错啦,真是太大意啦。
故障3:
自己修改了 ALU单元里面的内容,然后进行了覆盖,结果仿真完之后还是错啦,然后自己仔细检查自己修改的代码,也没有错误,后来问同学才知道,在修改完之后还要进行整体的编译,没有错误之后才能进行仿真。
十一.心得体会
刚开始接触到这个课设的时候,自己完全傻了眼,看着老师在PPT上演示那些复杂的电路图,自己顿时感到前所未有的压力,刚开始做的时候自己都不知道从哪里学起,真的是老虎吃天—无处下爪啊!后来我自己想了想,我知道自己的基础不行,所以决定先从最基础的看起,我先把计算机组成原理课本上的跟课设有关的内容全都看了一边,看完之后觉得自己对课设有了基本的认识,终于知道要从哪里做起,然后自己又反复的看课设书上的例子,从刚开始的看不懂,到后来的了解,再到后来的深入理解,中间有不懂的地方就和同学一起讨论,然后在问老师,看看自己的理解是否正确,这样就更加深了自己印象,通过几天下来的学习,自己终于知道课设的具体步骤,以及如何实现,先从汇编语言开始,根据老师给的题目来写汇编代码,然后再设计自己的指令格式,设计完之后就要开始写流程图啦,再根据自己的流程图写微指令,然后在制做各个单元,再到最后的连线仿真,在经过一个礼拜的努力之后,自己终于完成了这次的课设,内心真的蛮激动的!这次课设让我学到了很多,任何一件事情看着很难,但当自己付诸实际行动的时候,你就回发现原来它只是一张纸老虎,只要肯努力,你就回成功!
十二.软件清单
1. 运算器和状态条件寄存器单元
a. ALU单元
S1
S0
功能
0
0
TEST测试,锁存FS
0
1
(AC)-(DR),锁存FS
1
0
(AC)+1
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) ;
SF: 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--TEST
SF<=A(7);
ELSIF(S1='0' AND S0='1') THEN --CMP(SUB)
BCDOUT<=A-B;
IF(A>B) THEN
SF<='0';
ELSE
SF<='1';
END IF;
ELSIF(S1='1' AND S0='0') THEN --ADD+1
AA<='0'&A;
TEMP<=AA+1;
BCDOUT<=TEMP(7 DOWNTO 0);
SF<=TEMP(8);
END IF;
END PROCESS;
END A;
b. 状态条件寄存器单元
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY LS74 IS
PORT(
LDFR: IN STD_LOGIC;
SF: IN STD_LOGIC;
FS: OUT STD_LOGIC
);
END LS74;
ARCHITECTURE A OF LS74 IS
BEGIN
PROCESS(LDFR)
BEGIN
IF(LDFR'EVENT AND LDFR='1') THEN
FS<=SF;
END IF;
END PROCESS;
END A;
c.暂存器存储单元
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;
2. 通用寄存器单元
3个通用寄存器(R0、R1、R2、)以及ALU输出的外部控制信号如下表中所示:
R0_B
R1_B
R2_B
ALU_B
功能
1
1
1
0
输出ALU的结果
0
1
1
1
输出(R0)
1
0
1
1
输出(R1)
1
1
0
1
输出(R2)
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;
3.1:2分配器单元
1:2分配器用来将ALU的运算结果或通用寄存器的内容经3选1多路选择器送到数据总线,或者将ALU的运算结果或通用寄存器的内容送往输出设备显示。功能如下表所示。
输入
输出
WR
LED_B
X[7..0]
W1[7..0]
W2[7..0]
0
0
X
X[7..0]
其它取值
X
X[7..0]
X
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY FEN2 IS
PORT(
WR,LED_B:IN STD_LOGIC;
X:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
W1,W2:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
);
END FEN2;
ARCHITECTURE A OF FEN2 IS
BEGIN
PROCESS(LED_B,WR)
BEGIN
IF(LED_B='0' AND WR='0') THEN
W2<=X;
ELSE
W1<=X;
END IF;
END PROCESS;
END A;
4. 3选1数据选择器单元
输入
输出
SW_B
CS
ID[7..0]
N1[7..0]
N2[7..0]
EW[7..0]
0
x
x
x
x
ID[7..0]
1
0
x
x
x
N2[7..0]
1
1
x
x
x
N1[7..0]
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY MUX3 IS
PORT(
ID:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
SW_B,CS:IN STD_LOGIC;
N1,N2:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
EW: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
EW<=ID;
ELSIF(CS='0')THEN
EW<=N2;
ELSE
EW<=N1;
END IF;
END PROCESS;
END A;
5. 4选1数据选择器单元
输入
输出
C
D
E
F
W[7..0]
0
1
1
1
X1[7..0]
1
0
1
1
X2[7..0]
1
1
0
1
X3[7..0]
1
1
1
0
X4[7..0]
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
-- CASE SEL IS
-- WHEN "1110"=>
-- W<=X1;
-- WHEN "1101"=>
-- W<=X2;
-- WHEN "1011"=>
-- W<=X3;
-- WHEN "0111"=>
-- W<=X4;
-- WHEN OTHERS =>
-- NULL;
--END CASE;
IF(SEL="1110") THEN --R0_out
W<=X1;
ELSIF(SEL="1101") THEN --R1_out
W<=X2;
ELSIF(SEL="1011") THEN --R2-out
W<=X3;
ELSIF(SEL="0111") THEN --ALU_out
W<=X4;
ELSE
null;
END IF;
END PROCESS;
END A;
6.程序计数器单元
CLR
LOAD
LDPC
功能
0
x
x
将PC清零
1
0
BUS->PC
1
1
0
不装入,也不计数
1
1
PC+1
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";
ELSIF(LDPC'EVENT AND LDPC='1') THEN
IF(load='0') THEN
QOUT<=D; --BUS->PC
ELSE
QOUT<=QOUT+1; --PC+1
END IF;
END IF;
END PROCESS;
O<=QOUT;
END A;
7. 地址寄存器单元
8. 主存储器单元
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY ROM16 IS
PORT(
DOUT:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
ADDR:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
CS:IN STD_LOGIC
);
END ROM16;
ARCHITECTURE A OF ROM16 IS
BEGIN
DOUT<="10010001" WHEN ADDR="00000000" AND CS='0' ELSE
"00000000" WHEN ADDR="00000001" AND CS='0' ELSE
"10010010" WHEN ADDR="00000010" AND CS='0' ELSE
"10000000" WHEN ADDR="00000011" AND CS='0' ELSE
"10000000" WHEN ADDR="00000100" AND CS='0' ELSE
"11010001" WHEN ADDR="00000101" AND CS='0' ELSE
"01110000" WHEN ADDR="00000110" AND CS='0' ELSE
"10110000" WHEN ADDR="00000111" AND CS='0' ELSE
"00000100" WHEN ADDR="00001000" AND CS='0' ELSE
"10101000" WHEN ADDR="00001001" AND CS='0' ELSE
"10110000" WHEN ADDR="00001010" AND CS='0' ELSE
"00000100" WHEN ADDR="00001011" AND CS='0' ELSE
"11000010" WHEN ADDR="00001100" AND CS='0' ELSE
"10010000" WHEN ADDR="00001101" AND CS='0' ELSE
"00000100" WHEN ADDR="00001110" AND CS='0' ELSE
"10100100" WHEN ADDR="00001111" AND CS='0' ELSE
"10110000" WHEN ADDR="00010000" AND CS='0' ELSE
"00010100" WHEN ADDR="00010001" AND CS='0' ELSE
"11100000" WHEN ADDR="00010010" AND CS='0' ELSE
"00000100" WHEN ADDR="00010011" AND CS='0' ELSE
"11111000" WHEN ADDR="00010100" AND CS='0' ELSE
"00000000";
END A;
9. 指令寄存器单元
10. 时序产生器单元
输入
输出
备注
Q
CLR
T1
T2
T3
T4
当CLR变为1且Q的上升沿到来时,T1为1,T2—T4为0
x
0
0
0
0
0
1
循环右移1次
在当前值的基础上
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;
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
T2<='0';
T3<='0';
T4<='0';
展开阅读全文