目录
一、课设题目
设计一台嵌入式 CISC 模型计算机或嵌入式 RISC模型计算机(采用定长 CPU 周期或变
长 CPU周期),并运行能完成一定功能的机器语言程序进行验证,输入包含十个整数(无符号数)的数组 M,按从小到大的顺序输 出这十个整数。
二、系统的总体设计
2.1 嵌入式 CISC 模型机的数据通路框图
![](https://i-blog.csdnimg.cn/direct/d5601b67332d4640b48d1d2c1eebe0df.png)
2.2 系统的操作控制器的逻辑框图
![](https://i-blog.csdnimg.cn/direct/f431e4598c7d4695b1c6cbeb4be6c1da.png)
2.3 设计机器指令格式和指令系统
为了完成这次课程设计的功能,本次设计设计了10条指令:LAD(将源寄存器所指向的地址单元中的数送入目的寄存器),STO1(将源寄存器中的数据存储到目的寄存器所指向的地址单元),MOV(将一个立即数数送入寄存器),INC(自加1),DEC(自减1),JMP(无条件跳转),CMP(将目的寄存器和源寄存器所指向的地址单元中的数据进行比较)IN1(输入),JNS(大于跳转),OUT1(输出),如下用到的Rs和Rd分别表示源寄存器和目的寄存器。下表列出了每条指令的格式、汇编符号和指令功能。
2.3.1机器指令格式和指令系统
指令助记符 | 指令格式 | 功能 | |||
---|---|---|---|---|---|
15-12 | 11-10 | 9-8 | 7-0 | ||
STO1 Rs (Rd) | 0001 | Rs | Rd | XXXXXXX | (Rs)->((Rd)) |
LAD (RS) Rd | 0010 | Rs | Rd | XXXXXXX | ((Rs))->Rd |
MOV imm Rd | 0011 | XX | Rd | imm | (imm)->Rd |
INC Rd | 0100 | XX | Rd | XXXXXXX | (Rd)+1->Rd,锁存SF,ZF |
DEC Rd | 0101 | XX | Rd | XXXXXXX | (Rd)-1->Rd,锁存SF,ZF |
JMP addr | 0110 | XX | XX | addr | addr->PC |
CMP Rs Rd | 0111 | Rs | Rd | XXXXXXX | (Rs)-(Rd) |
JB addr | 1000 | XX | XX | addr | 小于跳转,addr->PC |
IN1 Rd | 1001 | XX | Rd | XXXXXXX | 输入->Rd |
OUT1 Rs | 1010 | Rs | XX | XXXXXXX | Rs->输出 |
2.3.2对Rs和Rd格式规定
Rs或Rd | 选定的寄存器 |
0 | R0 |
1 | R1 |
10 | R2 |
11 | R3 |
2.3.3算数逻辑单元ALU的功能表
S2 | S1 | S0 | 功能 |
0 | 0 | 0 | X+Y,修改SF和ZF |
0 | 0 | 1 | X-Y,修改SF和ZF |
0 | 1 | 0 | Y+1,修改SF和ZF |
0 | 1 | 1 | Y-1,修改SF和ZF |
1 | 0 | 0 | X∧Y,修改SF和ZF |
1 | 0 | 1 | X∨Y,修改SF和ZF |
1 | 1 | 0 | Y |
2.3.4程序计数器PC的功能表
CLR | LOAD | LDPC | 功能 |
0 | X | X | 将PC清0 |
1 | 0 | ↑ | BUS-->PC |
1 | 1 | 0 | 不装入,也不计数 |
1 | 1 | ↑ | PC+1 |
2.3.5时序产生器
本实验采用的是微程序控制器的时序产生器,如下图
![](https://i-blog.csdnimg.cn/direct/e2f5da84272a4afa94a65fad44777c79.png)
2.3.6数据格式
模型机规定数据的为无符号整数,且字长为8位,其格式如下:
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
数据 |
三、微程序控制器的设计全过程
3.1微程序控制器的设计
微程序控制器的设计包括以下几个阶段:
(1)根据微处理器结构图、指令格式和功能设计所有机器指令的微程序流程图,并确定每条微指令的微地址和后继微地址;
(2)设计微指令格式和微指令代码表;
(3)设计地址转移逻辑电路;
(4)设计微程序控制器中的其它逻辑单元电路,包括微地址寄存器、微命令寄存器和控制存储器;
(5)设计微程序控制器的顶层电路(由多个模块组成)。
3.2地址转移逻辑电路的设计
地址转移逻辑电路是根据微程序流程图中的棱形框部分及多个分支微地址,利用微地址寄存器的异步置“1”端,实现微地址的多路转移。由于微地址寄存器中的触发器异步置“1”端低电平有效,与µA5~µA0对应的异步置“1”控制信号SE5~SE0的逻辑表达式为:
3.3汇编语言程序
本题目为:输入包含10个整数(无符号数)的数组M,按从小到大的顺序输出这十个整数。
冒泡排序:两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止。
算法思想: 输入10个数,用R0存放最外层的循环次数,R1存放地址,R2和R3存放比较的两个数,从对应的R1的地址读入.R3存放大的数.如果有更大的数,则交换.最后下沉的就为一个最大的数.然后自减R0.进入下次循环.到循环结束.
汇编程序源码及对应注释如下:
//* 输入10个数 */
MOV 0AH R0 //设置循环值10
MOV 00H R1 //设置RAM的初始地址00
L1: IN1 R2 //从开关输入任意一个整数到R2
STO1 R2 (R1) //将R2存入地址为R1的RAM单元中
INC R1 //自增R1
CMP R1 R0 //比较R1,R0的大小,R1小于R0跳转L1
JB L1
//* 冒泡排序 */
MOV 0AH R0 //设置外循环值为10
MOV 00H R1 //设置RAM的初始地址00
L2: LAD (R1) R2 //取地址为R1的RAM内容到R2
INC R1 //自增R1
CMP R1 R0 //比较R0,R1的大小,R1>R0跳转L4
JB L4
LAD (R1) R3 //取地址为R1的RAM内容到R3
CMP R2 R3 //比较R3,R2的大小,R3小于R2跳转L3
JB L3
JMP L2 //无条件跳转L2
//* 交换两个数 */
L3: STO1 R2 (R1) //将R2存入地址为R1的RAM单元中
DEC R1 //自减R1
STO1 R3 (R1) //将R3存入地址为R1的RAM单元中
INC R1 //自增R1
JMP L2 //无条件跳转L2
L4: DEC R0 //循环值自减1
MOV 00H R1 //设置R1的值为0
CMP R0 R1 //比较R1和R0的大小,R1小于R0跳转L2
JB L2
//* 输出 */
MOV 0AH R0 //设置循环值10
MOV 00H R1 //设置RAM的初始地址00
L5: LAD (R1) R2 //取地址为R1的RAM内容到R2
INC R1 //自增R1
OUT1 R2 //输出R2到LED
CMP R0 R1 //比较R1和R0的大小,R1小于R0跳转L5
JB L5
L6: OUT1 R2 //输出R2到LED
JMP L6 //持续输出
3.4机器语言源程序
根据指令格式将汇编语言源程序手工汇编成机器代码如下表:
地址 | 汇编语言源程序 | 机器语言源程序 | 机器语言源程序 |
(十六进制) | (二进制) | (十六进制) | |
00 | MOV 0AH R0 | 0011 00 00 0000 1010 | 300A |
01 | MOV 00H R1 | 0011 00 01 0000 0000 | 3100 |
02 | L1: IN1 R2 | 1001 00 10 0000 0000 | 9200 |
03 | STO1 R2 (R1) | 0001 10 01 0000 0000 | 1900 |
04 | INC R1 | 0100 00 01 0000 0000 | 4100 |
05 | CMP R1 R0 | 0111 01 00 0000 0000 | 7400 |
06 | JNS L1 | 1000 00 00 0000 0010 | 8002 |
07 | MOV 0AH R0 | 0011 00 00 0000 1010 | 300A |
08 | MOV 00H R1 | 0011 00 01 0000 0000 | 3100 |
09 | L2: LAD (R1) R2 | 0010 01 10 0000 0000 | 2600 |
0A | INC R1 | 0100 00 01 0000 0000 | 4100 |
0B | CMP R0 R1 | 0111 00 01 0000 0000 | 7100 |
0C | JB L4 | 1000 00 00 0001 0110 | 8016 |
0D | LAD (R1) R3 | 0010 01 11 0000 0000 | 2700 |
0E | CMP R3 R2 | 0111 11 10 0000 0000 | 7E00 |
0F | JB L3 | 1000 00 00 0001 0001 | 8011 |
10 | JMP L2 | 0110 00 00 0000 1001 | 6009 |
11 | L3: STO1 R2 (R1) | 0001 10 01 0000 0000 | 1900 |
12 | DEC R1 | 0101 00 01 0000 0000 | 5100 |
13 | STO1 R3 (R1) | 0001 11 01 0000 0000 | 1000 |
14 | INC R1 | 0100 00 01 0000 0000 | 4100 |
15 | JMP L2 | 0110 00 00 1000 1001 | 6089 |
16 | L4: DEC R0 | 0101 00 00 0000 0000 | 5000 |
17 | MOV 00H R1 | 0011 00 00 0000 0000 | 3100 |
18 | CMP R1 R0 | 0111 01 00 0000 0000 | 7400 |
19 | JB L2 | 1000 00 00 0000 1001 | 8009 |
1A | MOV 0AH R0 | 0011 00 00 0000 1010 | 300A |
1B | MOV 00H R1 | 0011 00 01 0000 0000 | 3100 |
1C | L5: LAD (R1) R2 | 0010 01 10 0000 0000 | 2600 |
1D | INC R1 | 0100 00 01 0000 0000 | 4100 |
1E | OUT1 R2 | 1010 10 00 0000 0000 | A800 |
1F | CMP R1 R0 | 0111 01 00 0000 0000 | 7400 |
20 | JB L5 | 1000 00 00 0001 1100 | 801C |
21 | L6: OUT1 R2 | 1010 10 00 0000 0000 | A800 |
22 | JMP L6 | 0110 00 00 0010 0001 | 6021 |
3.5微程序流程图如下所示:
![](https://i-blog.csdnimg.cn/direct/6dd712972bc946d7a7cb51091e928e98.png)
3.6微指令的设计
CISC模型机系统使用的微指令采用全水平型微指令,字长位26位,其中微命令字段位18位,P字段2位,后继微地址为6位。
微地址 | LOAD | LDPC | LDAR | LIR | LREG | LPSW | RS_B | S2 | S1 | S0 | ALU_B | SW_B | LED_B | RD_D | CS_D | RAM_B | CS_I | ADR_B | P1 | P2 | uA5~uA0 | |
00 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 0 | 000000 | |
sto1 | 01 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 001011 |
lad | 02 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 001100 |
mov | 03 | 1 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 000000 |
inc | 04 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 000000 |
dec | 05 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 000000 |
jmp | 06 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 000000 |
cmp | 07 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 000000 | |
jb空格 | 08 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 000000 |
in1 | 09 | 1 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 000000 |
out1 | 0A | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 000000 |
sto 第2步 | 0B | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 000000 |
lad 第2步 | 0C | 1 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 000000 |
jns 第2步 | 10 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 000000 |
有效 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | S2 | S1 | S0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | p1 | p2 |
四、MAX_PLUS2仿真软件清单
TOP.GDF
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(
X: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
Y: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
S2,S1,S0: IN STD_LOGIC;
ALUOUT: OUT STD_LOGIC_VECTOR(7 DOWNTO 0) ;
CF,ZF: OUT STD_LOGIC
);
END ALU;
ARCHITECTURE A OF ALU IS
SIGNAL AA,BB,TEMP:STD_LOGIC_VECTOR(8 DOWNTO 0);
SIGNAL TEMP1:STD_LOGIC_VECTOR(7 DOWNTO 0);
BEGIN
PROCESS
BEGIN
IF(S2='0' AND S1='0' AND S0='0') THEN --ADD
AA<='0'&X;
BB<='0'&Y;
TEMP<=AA+BB;
ALUOUT<=TEMP(7 DOWNTO 0);
CF<=TEMP(8);
IF (TEMP="100000000" OR TEMP="000000000") THEN
ZF<='1';
ELSE
ZF<='0';
END IF;
ELSIF(S2='0' AND S1='0' AND S0='1') THEN --CMP(SUB)
ALUOUT<=X-Y;
IF(X<Y) THEN
CF<='1';
ZF<='0';
ELSIF(X=Y) THEN
CF<='0';
ZF<='1';
ELSE
CF<='0';
ZF<='0';
END IF;
ELSIF(S2='0' AND S1='1' AND S0='0') THEN --INC
AA<='0'&Y;
TEMP<=AA+1;
ALUOUT<=TEMP(7 DOWNTO 0);
CF<=TEMP(8);
IF (TEMP="100000000") THEN
ZF<='1';
ELSE
ZF<='0';
END IF;
ELSIF(S2='0' AND S1='1' AND S0='1') THEN --DEC
AA<='0'&Y;
TEMP<=AA-1;
ALUOUT<=TEMP(7 DOWNTO 0);
CF<=TEMP(8);
IF (TEMP="000000000") THEN
ZF<='1';
ELSE
ZF<='0';
END IF;
ELSIF(S2='1' AND S1='0' AND S0='0') THEN --AND
TEMP1<=X AND Y;
ALUOUT<=TEMP1;
CF<='0';
IF (TEMP1="00000000") THEN
ZF<='1';
ELSE
ZF<='0';
END IF;
ELSIF(S2='1' AND S1='0' AND S0='1') THEN --OR
TEMP1<=X OR Y;
ALUOUT<=TEMP1;
CF<='0';
IF (TEMP1="00000000") THEN
ZF<='1';
ELSE
ZF<='0';
END IF;
ELSIF(S2='1' AND S1='1' AND S0='0') THEN --Rd->BUS
ALUOUT<=Y;
ELSE
ALUOUT<="00000000" ;
CF<='0';
ZF<='0';
END IF;
END PROCESS;
END A;
2.PSW
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY PSW IS
PORT(
C,Z:IN STD_LOGIC;
LDPSW:IN STD_LOGIC;
CF,ZF:OUT STD_LOGIC
);
END PSW;
ARCHITECTURE A OF PSW IS
BEGIN
PROCESS(LDPSW)
BEGIN
IF(LDPSW'EVENT AND LDPSW='1')THEN
CF<=C;
ZF<=Z;
END IF;
END PROCESS;
END A;
3.LS273(即R0,R1,R2,R3等)
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.PC
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;
ELSE
QOUT<=QOUT+1;
END IF;
END IF;
END PROCESS;
O<=QOUT;
END A;
5.ROM
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY ROM IS
PORT(
DOUT:OUT STD_LOGIC_VECTOR(15 DOWNTO 0);
ADDR:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
CS_I:IN STD_LOGIC
);
END ROM ;
ARCHITECTURE A OF ROM IS
BEGIN
DOUT<=
"0011000000001010" WHEN ADDR="00000000" AND CS_I='0' ELSE
"0011000100000000" WHEN ADDR="00000001" AND CS_I='0' ELSE
"1001001000000000" WHEN ADDR="00000010" AND CS_I='0' ELSE
"0001100100000000" WHEN ADDR="00000011" AND CS_I='0' ELSE
"0100000100000000" WHEN ADDR="00000100" AND CS_I='0' ELSE
"0111010000000000" WHEN ADDR="00000101" AND CS_I='0' ELSE
"1000000000000010" WHEN ADDR="00000110" AND CS_I='0' ELSE
"0011000000001010" WHEN ADDR="00000111" AND CS_I='0' ELSE
"0011000100000000" WHEN ADDR="00001000" AND CS_I='0' ELSE
"0010011000000000" WHEN ADDR="00001001" AND CS_I='0' ELSE
"0100000100000000" WHEN ADDR="00001010" AND CS_I='0' ELSE
"0111000100000000" WHEN ADDR="00001011" AND CS_I='0' ELSE
"1000000000010110" WHEN ADDR="00001100" AND CS_I='0' ELSE
"0010011100000000" WHEN ADDR="00001101" AND CS_I='0' ELSE
"0111111000000000" WHEN ADDR="00001110" AND CS_I='0' ELSE
"1000000000010001" WHEN ADDR="00001111" AND CS_I='0' ELSE
"0110000000001001" WHEN ADDR="00010000" AND CS_I='0' ELSE
"0001100100000000" WHEN ADDR="00010001" AND CS_I='0' ELSE
"0101000100000000" WHEN ADDR="00010010" AND CS_I='0' ELSE
"0001110100000000" WHEN ADDR="00010011" AND CS_I='0' ELSE
"0100000100000000" WHEN ADDR="00010100" AND CS_I='0' ELSE
"0110000000001001" WHEN ADDR="00010101" AND CS_I='0' ELSE
"0101000000000000" WHEN ADDR="00010110" AND CS_I='0' ELSE
"0011000100000000" WHEN ADDR="00010111" AND CS_I='0' ELSE
"0111010000000000" WHEN ADDR="00011000" AND CS_I='0' ELSE
"1000000000001001" WHEN ADDR="00011001" AND CS_I='0' ELSE
"0011000000001011" WHEN ADDR="00011010" AND CS_I='0' ELSE
"0011000100000000" WHEN ADDR="00011011" AND CS_I='0' ELSE
"0010011000000000" WHEN ADDR="00011100" AND CS_I='0' ELSE
"0100000100000000" WHEN ADDR="00011101" AND CS_I='0' ELSE
"1010100000000000" WHEN ADDR="00011110" AND CS_I='0' ELSE
"0111010000000000" WHEN ADDR="00011111" AND CS_I='0' ELSE
"1000000000011100" WHEN ADDR="00100000" AND CS_I='0' ELSE
"1010100000000000" WHEN ADDR="00100001" AND CS_I='0' ELSE
"0110000000100001" WHEN ADDR="00100010" AND CS_I='0' ELSE
"0000000000000000";
END A;
6.IR
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY IR IS
PORT(
D:IN STD_LOGIC_VECTOR(15 DOWNTO 0);
CLK:IN STD_LOGIC;
O:OUT STD_LOGIC_VECTOR(15 DOWNTO 0)
);
END IR;
ARCHITECTURE A OF IR IS
BEGIN
PROCESS(CLK)
BEGIN
IF(CLK'EVENT AND CLK='1')THEN
O<=D;
END IF;
END PROCESS;
END A;
7.RAM
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_SIGNED.ALL;
ENTITY RAM IS
PORT(
RD_D,CS_D:IN STD_LOGIC;
DIN:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
ADDR:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
DOUT:OUT 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)
VARIABLE MEM:MEMORY;
BEGIN
IF(CS_D'EVENT AND CS_D='0') THEN
IF(RD_D='0') THEN --?RAM
MEM(CONV_INTEGER(ADDR(4 DOWNTO 0))):=DIN;
ELSE --?RAM
DOUT<=MEM(CONV_INTEGER(ADDR(4 DOWNTO 0)));
END IF;
END IF;
END PROCESS;
END A;
8.DECODER
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY DECODER IS
PORT(
I9,I8:IN STD_LOGIC;
Y0,Y1,Y2,Y3:OUT STD_LOGIC
);
END DECODER;
ARCHITECTURE A OF DECODER IS
BEGIN
PROCESS(I9,I8)
BEGIN
IF(I9='0' AND I8='0')THEN
Y0<='1';
Y1<='0';
Y2<='0';
Y3<='0';
ELSIF(I9='0' AND I8='1')THEN
Y0<='0';
Y1<='1';
Y2<='0';
Y3<='0';
ELSIF(I9='1' AND I8='0')THEN
Y0<='0';
Y1<='0';
Y2<='1';
Y3<='0';
ELSE
Y0<='0';
Y1<='0';
Y2<='0';
Y3<='1';
END IF;
END PROCESS;
END A;
9.COUNTER
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY COUNTER IS
PORT(
CLK,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):="00";
BEGIN
PROCESS(CLK,CLR)
BEGIN
IF(CLR='0') THEN
T2<='0';
T3<='0';
T4<='0';
X<="00";
ELSIF(CLK'EVENT AND CLK='1') THEN
X<=X+1;
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;
10.CONVERT
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY CONVERT IS
PORT(
IRCODE:IN STD_LOGIC_VECTOR(15 DOWNTO 0);
OP:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
I11,I10,I9,I8:OUT STD_LOGIC;
A:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
);
END CONVERT;
ARCHITECTURE A OF CONVERT IS
BEGIN
OP<=IRCODE(15 DOWNTO 12);
I11<=IRCODE(11);
I10<=IRCODE(10);
I9<=IRCODE(9);
I8<=IRCODE(8);
A<=IRCODE(7 DOWNTO 0);
END A;
11.FEN2
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY FEN2 IS
PORT(
LED_B:IN STD_LOGIC;
DBUS:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
FENOUT,OUTBUS:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
);
END FEN2;
ARCHITECTURE A OF FEN2 IS
BEGIN
PROCESS
BEGIN
IF(LED_B='0') THEN
OUTBUS<=DBUS;
ELSE
FENOUT<=DBUS;
END IF;
END PROCESS;
END A;
12.MUX3_1
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY MUX3_1 IS
PORT(
INBUS,RAMOUT,FEN2OUT:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
SW_B,RAM_B:IN STD_LOGIC;
DBUS:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
);
END MUX3_1;
ARCHITECTURE A OF MUX3_1 IS
BEGIN
PROCESS
BEGIN
IF(SW_B='0') THEN
DBUS<=INBUS;
ELSIF(RAM_B='0')THEN
DBUS<=RAMOUT;
ELSE
DBUS<=FEN2OUT;
END IF;
END PROCESS;
END A;
13.MUX3_2
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY MUX3_2 IS
PORT(
ALUOUT,RSOUT,AOUT:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
ALU_B,RS_B,ADDR_B:IN STD_LOGIC;
DBUS:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
);
END MUX3_2;
ARCHITECTURE A OF MUX3_2 IS
BEGIN
PROCESS
BEGIN
IF(ALU_B='0') THEN
DBUS<=ALUOUT;
ELSIF(RS_B='0') THEN
DBUS<=RSOUT;
ELSIF(ADDR_B='0') THEN
DBUS<=AOUT;
ELSE
DBUS<="00000000";
END IF;
END PROCESS;
END A;
14.MUX4
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY MUX4 IS
PORT(
A,B:IN STD_LOGIC;
X0,X1,X2,X3:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
W:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
);
END MUX4;
ARCHITECTURE A OF MUX4 IS
BEGIN
PROCESS
BEGIN
IF(A='0'AND B='0')THEN
W<=X0;
ELSIF(A='0'AND B='1')THEN
W<=X1;
ELSIF(A='1'AND B='0')THEN
W<=X2;
ELSE
W<=X3;
END IF;
END PROCESS;
END A;
15.CROM.GDF
16.CONTROM
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY CONTROM IS
PORT(
ADDR:IN STD_LOGIC_VECTOR(5 DOWNTO 0);
UA:OUT STD_LOGIC_VECTOR(5 DOWNTO 0);
D:OUT STD_LOGIC_VECTOR(19 DOWNTO 0)
);
END CONTROM;
ARCHITECTURE A OF CONTROM IS
SIGNAL DATAOUT:STD_LOGIC_VECTOR(25 DOWNTO 0);
BEGIN
PROCESS(ADDR)
BEGIN
CASE ADDR IS
WHEN "000000"=>DATAOUT<="11010010001111110110000000";
WHEN "000001"=>DATAOUT<="10100011100111111100001011";
WHEN "000010"=>DATAOUT<="10100000001111111100001100";
WHEN "000011"=>DATAOUT<="10001010001111111000000000";
WHEN "000100"=>DATAOUT<="10001110100111111100000000";
WHEN "000101"=>DATAOUT<="10001110110111111100000000";
WHEN "000110"=>DATAOUT<="01000010001111111000000000";
WHEN "000111"=>DATAOUT<="10000110011111111100000000";
WHEN "001000"=>DATAOUT<="10000010001111111101000000";
WHEN "001001"=>DATAOUT<="10001010001011111100000000";
WHEN "001010"=>DATAOUT<="10000000001101111100000000";
WHEN "001011"=>DATAOUT<="10000000001111001100000000";
WHEN "001100"=>DATAOUT<="10001010001110011100000000";
WHEN "010000"=>DATAOUT<="01000010001111111000000000";
WHEN OTHERS=>NULL;
END CASE;
UA(5 DOWNTO 0)<=DATAOUT(5 DOWNTO 0);
D(19 DOWNTO 0)<=DATAOUT(25 DOWNTO 6);
END PROCESS;
END A;
17.CROM_F1
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY CROM_F1 IS
PORT(
UA5,UA4,UA3,UA2,UA1,UA0:IN STD_LOGIC;
D:OUT STD_LOGIC_VECTOR(5 DOWNTO 0)
);
END CROM_F1;
ARCHITECTURE A OF CROM_F1 IS
BEGIN
D(5)<=UA5;
D(4)<=UA4;
D(3)<=UA3;
D(2)<=UA2;
D(1)<=UA1;
D(0)<=UA0;
END A;
18.CROM_F2
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY CROM_F2 IS
PORT(
D:IN STD_LOGIC_VECTOR(5 DOWNTO 0);
UA5,UA4,UA3,UA2,UA1,UA0:OUT STD_LOGIC
);
END CROM_F2;
ARCHITECTURE A OF CROM_F2 IS
BEGIN
UA5<=D(5);
UA4<=D(4);
UA3<=D(3);
UA2<=D(2);
UA1<=D(1);
UA0<=D(0);
END A;
19.CROM_F3
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY CROM_F3 IS
PORT(
D:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
UA3,UA2,UA1,UA0: OUT STD_LOGIC
);
END CROM_F3;
ARCHITECTURE A OF CROM_F3 IS
BEGIN
UA3<=D(3);
UA2<=D(2);
UA1<=D(1);
UA0<=D(0);
END A;
20.ADDR
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY ADDR IS
PORT(
I15,I14,I13,I12:IN STD_LOGIC;
CF,ZF,T4,P1,P2:IN STD_LOGIC;
SE5,SE4,SE3,SE2,SE1,SE0:OUT STD_LOGIC
);
END ADDR;
ARCHITECTURE A OF ADDR IS
BEGIN
SE5<='1';
SE4<=NOT((NOT ZF) AND CF AND P2 AND T4);
SE3<=NOT(I15 AND P1 AND T4);
SE2<=NOT(I14 AND P1 AND T4);
SE1<=NOT(I13 AND P1 AND T4);
SE0<=NOT(I12 AND P1 AND T4);
END A;
21.MCOMMAND
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY MCOMMAND IS
PORT(
T2,T3,T4:IN STD_LOGIC;
D:IN STD_LOGIC_VECTOR(19 DOWNTO 0);
P1,P2,LOAD,LDPC,LDAR,LDIR,LDRI,LDPSW,RS_B,S2,S1,S0,
ALU_B,SW_B,LED_B,RD_D,CS_D,RAM_B,CS_I,ADDR_B:OUT STD_LOGIC
);
END MCOMMAND;
ARCHITECTURE A OF MCOMMAND IS
SIGNAL DATAOUT:STD_LOGIC_VECTOR(19 DOWNTO 0);
BEGIN
PROCESS(T2)
BEGIN
IF(T2'EVENT AND T2='1') THEN
DATAOUT(19 DOWNTO 0)<=D(19 DOWNTO 0);
END IF;
LOAD<=DATAOUT(19);
LDPC<=DATAOUT(18) AND T4;
LDAR<=DATAOUT(17) AND T3;
LDIR<=DATAOUT(16) AND T3;
LDRI<=DATAOUT(15) AND T4;
LDPSW<=DATAOUT(14) AND T4;
RS_B<=DATAOUT(13);
S2<=DATAOUT(12);
S1<=DATAOUT(11);
S0<=DATAOUT(10);
ALU_B<=DATAOUT(9);
SW_B<=DATAOUT(8);
LED_B<=DATAOUT(7);
RAM_B<=DATAOUT(6);
CS_D<=NOT(NOT DATAOUT(5) AND T3);
RD_D<=NOT(NOT DATAOUT(4) AND (T2 OR T3));
CS_I<=DATAOUT(3);
ADDR_B<=DATAOUT(2);
P1<=DATAOUT(1);
P2<=DATAOUT(0);
END PROCESS;
END A;
22.AAA.GDF
23.MMM
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY MMM IS
PORT(
SE:IN STD_LOGIC;
CLK:IN STD_LOGIC;
D:IN STD_LOGIC;
CLR:IN STD_LOGIC;
UA:OUT STD_LOGIC
);
END MMM;
ARCHITECTURE A OF MMM IS
BEGIN
PROCESS(CLR,SE,CLK)
BEGIN
IF(CLR='0') THEN
UA<='0';
ELSIF(SE='0')THEN
UA<='1';
ELSIF(CLK'EVENT AND CLK='1') THEN
UA<=D;
END IF;
END PROCESS;
END A;
五、仿真过程及结果
输入
本实验的输入指令为9200,在此范围区间内可以输入数字,可以输入十个无符号整数,并需检查输入的数值是否存到MEM中。最后能在outbus中输出排完序的大小。至于仿真end time问题,可能每个人的电脑仿真时间都不相同,刚开始可以设计久一点的,看自己的程序运行到什么时候结束,再修改。如果出现问题,首先可以检查gdf图是否连接正确,其中代码是否正确,或者跟着指令走一遍,看看每条指令是否都实现其功能,如果检查出错误,修正应该就可以了。如果还是检查不出来错误,可以将跟着数据通路走一遍,在输入输出的地方增加output,看某个数据经过这块是否有异常,或是一些信号是否出现毛刺,包括这个软件的一些使用规范问题等等等等都有可能导致结果不呈现。不要急,耐心点,可以自己解决掉这些bug,应该会很有成就感的!
结果