根据《计算机组成原理课程设计》的设计要求设计能够执行一定机器指令完成指定任务的CISC模型机。
本次课程设计中本人选题为:输入包含10个整数(有符号数)的数组M,将其分成正整数数组P和负数数组N,依次输出正数数组P中的整数及正数的个数。
1.完成系统的总体设计,画出模型机数据通路框图;
2.设计微程序控制器(CISC模型计算机)的逻辑结构框图;
3.设计机器指令格式和指令系统;
4.设计时序产生器电路;
5.设计所有机器指令的微程序流程图;
6.设计操作控制器单元;在CISC模型计算机中,设计的内容包括微指令格式(议采用全水平型微指令)、微指令代码表(根 据微程序流程图和微指令格式来设计)和微程序控制器硬件电路(包括地址转移逻辑电路、微地址寄存器、微命令寄存和控制 存储器等。具体电路根据微程序控制器的逻辑结构框图、微指令格式和微指令代码来设计)。
7.设计模型机的所有单元电路,并用VHDL语言(也可使用GDF文件----图形描述文件)对模型机中的各个部件进行编程,并使之成为一个统一的整体,即形成顶层电路或顶层文件;
8.由给出的题目和设计的指令系统编写相应的汇编语言源程序;
9.根据设计的指令格式,将汇编语言源程序手工转换成机器语言源程序,并将其设计到模型机中的ROM中去;
10.使用EDA软件进行功能仿真,要保证其结果满足题目的要求;(其中要利用EDA软件提供的波形编辑器,选择合适的输入输出信号及中间信号进行调试。)
说明:在T4内形成微指令的微地址,并访问控制存储器,在T2的上边沿到来时,将读出的微指令打入微指令寄存器,即图中的微命令寄存器和微地址寄存器。
为了完成这次课程设计的功能,本次设计设计了10条指令:IN1(输入),MOV(将一个数送入寄存器),LAD(将寄存器内容送到内存),JMP(无条件跳转),INC(自加1),DEC(自减1),JNS(大于跳转),STO1(将源寄存器值送到目标寄存器),OUT1(输出),TEST(测试),如下用到的Rs和Rd分别表示源寄存器和目的寄存器。
指令助记符 |
指令格式 |
功能 |
|||
15——12 |
11 10 |
9 8 |
7——0 |
||
IN1 Rd |
0001 |
xx |
Rd |
xxxxxxxx |
输入设备→Rd |
MOV Rd,im |
0010 |
xx |
Rd |
im |
立即数→Rd |
LAD (Rs),Rd |
0011 |
Rs |
Rd |
xxxxxxxx |
((Rs)) →Rd |
JMP addr |
0100 |
xx |
xx |
addr |
addr→PC |
INC Rd |
0101 |
xx |
Rd |
xxxxxxxx |
将(Rd)+1→Rd,锁存SF和ZF |
DEC Rd |
0110 |
xx |
Rd |
xxxxxxxx |
将(Rd)-1→Rd,锁存SF和ZF |
JNS addr |
0111 |
xx |
xx |
addr |
若结果小于零,addr->pc |
STO1 Rs,(Rd) |
1000 |
Rs |
Rd |
XXXXXXXX |
(Rs) →((Rd)) |
OUT1 Rs |
1001 |
Rs |
xx |
XXXXXXXX |
(Rs) →输出设备 |
TEST Rd |
1010 |
XX |
Rd |
XXXXXXXX |
测试(Rd)是否为负,锁存SF |
Rs或Rd |
选定的寄存器 |
00 |
R0 |
01 |
R1 |
10 |
R2 |
11 |
R3 |
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 |
Y是否大于零,修改SF和ZF |
1 |
1 |
0 |
Y |
CLR |
LOAD |
LDPC |
功能 |
0 |
X |
X |
将PC清0 |
1 |
0 |
↑ |
BUS-->PC |
1 |
1 |
0 |
不装入,也不计数 |
1 |
1 |
↑ |
PC+1 |
本实验采用的是微程序控制器的时序产生器,如下图
模型机规定数据的表示采用定点整数补码表示,单字长为8位,其格式如下:
7 |
6 5 4 3 2 1 0 |
符号位 |
尾数 |
微程序控制器的设计包括以下几个阶段:
(1)根据微处理器结构图、指令格式和功能设计所有机器指令的微程序流程图,并确定每条微指令的微地址和后继微地址;
(2)设计微指令格式和微指令代码表;
(3)设计地址转移逻辑电路;
(4)设计微程序控制器中的其它逻辑单元电路,包括微地址寄存器、微命令寄存器和控制存储器;
(5)设计微程序控制器的顶层电路(由多个模块组成)。
地址转移逻辑电路是根据微程序流程图中的棱形框部分及多个分支微地址,利用微地址寄存器的异步置“1”端,实现微地址的多路转移。由于微地址寄存器中的触发器异步置“1”端低电平有效,与µA5~µA0对应的异步置“1”控制信号SE5~SE0的逻辑表达式为:
3.3 汇编语言程序
本题目的算法思想为:输入包含10个整数(无符号数)的数组M,将其分成正整数数组P和负数数组N,依次输出正数数组P中的整数及正数的个数。
汇编程序源码及对应注释如下:
MOV R0,00H ;数据存放在RAM中的地址
MOV R1,0AH ;循环次数计数,从0A开始,到01时结束
MOV R3,00H ;保存正整数的个数 (L3中)
L1:
IN1 R2 ;输入一个数到R2中
STO1 R2,(R0) ;将输入的数据存放到地址为(R0)的RAM中
INC R0 ;RAM地址指针+1
DEC R1 ;循环次数-1
TEST R1 ;测试循环次数是否达到10次
JNS L1 ;R1不为负时跳转到L1
MOV R0,00H ;当10个数输入完成后,初始化RAM指针
MOV R1,0AH ;重置循环次数
L2:
LAD (R0),R2 ;将内存中地址为(R0)的数据送到R2
TEST R2 ;测试(R2)是否大于零
JNS L3 ;(R2)大于零时跳转到L3
JMP L4 ;(R2)不大于零时跳转到L4
L3:
OUT1 R2 ;(R2)输出
INC R3 ;正整数计数+1
L4:
INC R0 ;RAM地址指针+1
DEC R1 ;循环次数-1
TEST R1 ;测试循环次数是否达到10次
JNS L2 ;(R2)不为负时跳转到L2
OUT1 R3 ;输出正整数的个数
地址 (十六进制) |
汇编语言源程序 |
机器语言源程序 (二进制) |
机器语言源程序 (十六进制) |
00 |
MOV R0,00H |
0010 00 00 00000000 |
2000 |
01 |
MOV R1,0AH |
0010 00 01 00001010 |
210A |
02 |
MOV R3,00H |
0010 00 11 00000000 |
2300 |
03 |
L1:IN1 R2 |
0001 00 10 00000000 |
1200 |
04 |
STO1 R2,(R0) |
1000 10 00 00000000 |
8800 |
05 |
INC R0 |
0101 00 00 00000000 |
5000 |
06 |
DEC R1 |
0110 00 01 00000000 |
6100 |
07 |
TEST R1 |
1010 00 01 00000000 |
A100 |
08 |
JNS L1 |
0111 00 00 00000011 |
7003 |
09 |
MOV R0,00H |
0010 00 00 00000000 |
2000 |
0A |
MOV R1,0AH |
0010 00 01 00001001 |
210A |
0B |
L2:LAD (R0),R2 |
0011 00 10 00000000 |
3200 |
0C |
TEST R2 |
1010 00 10 00000000 |
A200 |
0D |
JNS L3 |
0111 00 00 00001111 |
700F |
0E |
JMP L4 |
0100 00 00 00010001 |
4011 |
0F |
L3:OUT1 R2 |
1001 10 00 00000000 |
9800 |
10 |
INC R3 |
0101 00 11 00000000 |
5300 |
11 |
L4:INC R0 |
0101 00 00 00000000 |
5000 |
12 |
DEC R1 |
0110 00 01 00000000 |
6100 |
13 |
TEST R1 |
1010 00 01 00000000 |
A100 |
14 |
JNS L2 |
0111 00 00 00001011 |
700B |
15 |
OUT1 R3 |
1001 11 00 00000000 |
9C00 |
表3-1 汇编语言与机器语言代码表
CISC模型机系统使用的微指令采用全水平型微指令,字长位26位,其中微命令字段位18位,P字段2位,后继微地址为6位。
微地址 |
LOAD |
LDPC |
LDAR |
LIR |
LREG |
LPSW |
RS_B |
S2 |
S1 |
S0 |
ALU |
IN |
OUT |
RW |
RCS |
RD |
ROM |
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 |
01 |
1 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
0 |
1 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
000000 |
02 |
1 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
000000 |
03 |
1 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
001011 |
04 |
0 |
1 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
000000 |
05 |
1 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
1 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
000000 |
06 |
1 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
000000 |
07 |
1 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
1 |
000000 |
08 |
1 |
0 |
1 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
001100 |
09 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
000000 |
0A |
1 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
1 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
000000 |
0B |
1 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
0 |
0 |
1 |
1 |
0 |
0 |
000000 |
0C |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
0 |
1 |
1 |
1 |
0 |
0 |
000000 |
10 |
0 |
1 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
0 |
0 |
000000 |
表 3-2 微指令代码表
如图4-1中,其中的操作控制器单元crom的内部结构如下图所示
如图4-2中寄存器AA的内部结构如下所示,AA的内部是由6个MM构成的。
通过创建仿真时序图top.scf.,可以实现模型机的功能仿真,从图中可以看出cpu处理数据和数据的具体流向的每一个过程,如下是仿真的输出波形,具体结果和分析如下:
如图4-4所示,在图4-4中CLK为时钟信号,INBUS[7..0]是输入中线,OUTBUS[7..0]是输出总线,IROUT是操作指令,寄存器R0,寄存器R1,寄存器R2,寄存器R3。
从总线INBUS[7..0]输入的10个数分别为 50H、40H、FCH、10H、23H、FEH、25H、25H、00H、FDH。输出结果为:50H、40H、10H、23H、25H、25H、06H(正整数个数为6)
结果过程分析
由图4-5所示,IROUT=2000、IROUT=210A和IROUT=2300时执行MOV指令,将00H送入寄存器R0,将0AH送入寄存器R1,将00H送入寄存器R0。IROUT=1200时执行IN1指令将50H输入寄存器R2;IROUT=8800时执了STO1指令,将R2的内容送到RAM;IROUT=5000时执行了INC指令,R0自加1;IROUT=6100时执行了DEC指令,R1自减1;IROUT=A100时执行了TEST指令,测试R1是否大于零;IROUT=7003时执行了JNS指令(跳转条件是SF=0,ZF=0),由于此时R1自减1之后为08H大于零所以跳转1200执行IN1指令,如此循环了10次,完成10个数据的输入。
由图4-6所示,输入完数据以后,可以看见R1寄存器的值为00,IROUT=7003执行JNS指令不跳转;IROUT=2000、IROUT=210A时执行MOV指令,将00H送入寄存器R0,将0AH送入寄存器R1;IROUT=3200时执行LAD指令,将地址为(R0)的内存的内容送到寄存器R2;IROUT=A200时执行TEST指令,测试(R2)是否大于零;IROUT=700F时执JNS指令,此时(R2)大于零,跳转9800;IROUT=9800时执行OUT1指令输出(R2),在数据输出线OUTBUS[7..0]显示为50。IROUT=5300时执行INC指令,R3自加1;IROUT=5000时执行了INC指令,R0自加1;IROUT=6100时执行了DEC指令,R1自减1;IROUT=A100时执行了TEST指令,测试R1是否大于零;IROUT=700B时执行了JNS指令,跳转到3200执行LAD指令,如此循环测试完10个数。
由图4-7所示,测试的整数是负数FC,IROUT=700F时执JNS指令,此时(R2)小于零不做跳转;IROUT=4011时执行JMP指令,无条件跳转到IROUT=5000执行INC指令,R0自加1。
第二组测试的10个数据分别为 FFH、11H、FCH、50H、02H、FEH、0FH、84H、00H、98H。输出结果为:11H、50H、02H、0FH、04H(正整数个数为4)。
经过多次的不同数据测试,结果都与预期的结果相符合,没有出现错误。
代码设计
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_SIGNED.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);
SF,ZF:OUT STD_LOGIC
);
END ALU;
ARCHITECTURE A OF ALU IS
SIGNAL AA,BB,TEMP:STD_LOGIC_VECTOR(7 DOWNTO0);
SIGNAL TEMP1:STD_LOGIC_VECTOR(7 DOWNTO 0);
BEGIN
PROCESS
BEGIN
IF(S2='0' AND S1='0' AND S0='0')THEN
AA<=X;
BB<=Y;
TEMP<=AA+BB;
ALUOUT<=TEMP(7 DOWNTO 0);
SF<=TEMP(7);
IF(TEMP="00000000")THEN
ZF<='1';
ELSE
ZF<='0';
END IF;
ELSIF(S2='0'AND S1='0' AND S0='1')THEN
ALUOUT<=X-Y;
IF(X SF<='1'; ZF<='0'; ELSIF(X=Y)THEN SF<='0'; ZF<='1'; ELSE SF<='0'; ZF<='0'; END IF; ELSIF(S2='0' AND S1='1' AND S0='0')THEN BB<=Y; TEMP<=BB+1; ALUOUT<=TEMP(7 DOWNTO 0); SF<=TEMP(7); IF(TEMP="00000000")THEN ZF<='1'; ELSE ZF<='0'; END IF; ELSIF(S2='0' AND S1='1' AND S0='1')THEN BB<=Y; TEMP<=BB-1; ALUOUT<=TEMP(7 DOWNTO 0); SF<=TEMP(7); IF(TEMP="00000000")THEN ZF<='1'; ELSE ZF<='0'; END IF; ELSIF(S2='1' AND S1='0' AND S0='0') THEN --AND AA<=X; BB<=Y; TEMP1<=AA AND BB; ALUOUT<=TEMP1(7 DOWNTO 0); SF<=TEMP1(7); IF (TEMP1="00000000") THEN ZF<='1'; ELSE ZF<='0'; END IF; ELSIF(S2='1' AND S1='0' AND S0='1') THEN --TEST BB<=Y; TEMP1<= BB; SF<=TEMP1(7); 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" ; SF<='0'; ZF<='0'; END IF; END PROCESS; END A; 代码设计 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USEIEEE.STD_LOGIC_ARITH.ALL; USEIEEE.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<= "0010000000000000"WHENADDR="00000000"AND CS_I='0' ELSE "0010000100001010"WHENADDR="00000001"AND CS_I='0' ELSE "0010001100000000"WHENADDR="00000010"AND CS_I='0' ELSE "0001001000000000"WHENADDR="00000011"AND CS_I='0' ELSE "1000100000000000"WHENADDR="00000100"AND CS_I='0' ELSE "0101000000000000"WHENADDR="00000101"AND CS_I='0' ELSE "0110000100000000"WHENADDR="00000110"AND CS_I='0' ELSE "1010000100000000"WHENADDR="00000111"AND CS_I='0' ELSE "0111000000000011"WHENADDR="00001000"AND CS_I='0' ELSE "0010000000000000"WHENADDR="00001001"AND CS_I='0' ELSE "0010000100001010"WHENADDR="00001010"AND CS_I='0' ELSE "0011001000000000"WHENADDR="00001011"AND CS_I='0' ELSE "1010001000000000"WHENADDR="00001100"AND CS_I='0' ELSE "0111000000001111"WHENADDR="00001101"AND CS_I='0' ELSE "0100000000010001"WHENADDR="00001110"AND CS_I='0' ELSE "1001100000000000"WHENADDR="00001111"AND CS_I='0' ELSE "0101001100000000"WHENADDR="00010000"AND CS_I='0' ELSE "0101000000000000"WHENADDR="00010001"AND CS_I='0' ELSE "0110000100000000"WHENADDR="00010010"AND CS_I='0' ELSE "1010000100000000"WHENADDR="00010011"AND CS_I='0' ELSE "0111000000001011"WHENADDR="00010100"AND CS_I='0' ELSE "1001110000000000"WHENADDR="00010101"AND CS_I='0' ELSE "0000000000000000"; END A; 代码设计 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(3DOWNTO 0); I11,I10,I9,I8:OUT STD_LOGIC; A:OUT STD_LOGIC_VECTOR(7DOWNTO 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; 代码设计 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USEIEEE.STD_LOGIC_ARITH.ALL; USEIEEE.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 SIGNALDATAOUT:STD_LOGIC_VECTOR(25 DOWNTO 0); BEGIN PROCESS(ADDR) BEGIN CASE ADDR IS WHEN"000000"=>DATAOUT<="11010010001111110110000000"; WHEN"000001"=>DATAOUT<="10001010001011111100000000"; WHEN"000010"=>DATAOUT<="10001010001111111000000000"; WHEN"000011"=>DATAOUT<="10100000001111111100001011"; WHEN"000100"=>DATAOUT<="01000010001111111000000000"; WHEN"000101"=>DATAOUT<="10001110100111111100000000"; WHEN"000110"=>DATAOUT<="10001110110111111100000000"; WHEN"000111"=>DATAOUT<="10000010001111111101000000"; WHEN"001000"=>DATAOUT<="10100011100111111100001100"; WHEN"001001"=>DATAOUT<="10000000001101111100000000"; WHEN"001010"=>DATAOUT<="10000111010111111100000000"; WHEN"001011"=>DATAOUT<="10001010001111001100000000"; WHEN"001100"=>DATAOUT<="10000000001110011100000000"; WHEN"010000"=>DATAOUT<="01000010001111111000000000"; WHEN OTHERS=>DATAOUT<="10000011111111110100000000"; END CASE; UA(5 DOWNTO 0)<=DATAOUT(5 DOWNTO 0); D(19 DOWNTO 0)<=DATAOUT(25 DOWNTO 6); END PROCESS; END A; 代码设计 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY ADDR IS PORT( I15,I14,I13,I12:IN STD_LOGIC; SF,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(NOT SF) 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; 代码设计 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USEIEEE.STD_LOGIC_ARITH.ALL; USEIEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY MCOMMAND IS PORT( T2,T3,T4:IN STD_LOGIC; O: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 MCOMMANDIS SIGNALDATAOUT:STD_LOGIC_VECTOR(19 DOWNTO 0); BEGIN PROCESS(T2) BEGIN IF(T2'EVENT AND T2='1') THEN DATAOUT(19 DOWNTO 0)<=O(19DOWNTO 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); RD_D<=NOT(NOT DATAOUT(6) AND (T2 ORT3)); CS_D<=NOT(NOT DATAOUT(5) AND T3); RAM_B<=DATAOUT(4); CS_I<=DATAOUT(3); ADDR_B<=DATAOUT(2); P1<=DATAOUT(1); P2<=DATAOUT(0); END PROCESS; END A; 代码设计 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USEIEEE.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 SIGNALQOUT:STD_LOGIC_VECTOR(7 DOWNTO 0); BEGIN PROCESS(LDPC,CLR,LOAD) BEGIN IF(CLR='0')THEN QOUT<="00000000"; ELSIF(LDPC'EVENT ANDLDPC='1')THEN IF(LOAD='0')THEN QOUT<=D; ELSE QOUT<=QOUT+1; END IF; END IF; END PROCESS; O<=QOUT; END A; 代码设计 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; 代码设计 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY PSW IS PORT( S,Z:IN STD_LOGIC; LDPSW:IN STD_LOGIC; SF,ZF:OUT STD_LOGIC ); END PSW; ARCHITECTURE A OF PSW IS BEGIN PROCESS(LDPSW) BEGIN IF(LDPSW'EVENT AND LDPSW='1')THEN SF<=S; ZF<=Z; END IF; END PROCESS; END A; 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 ; 代码设计 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; 说明:先绘制AA,再绘制MM,最后绘制整个操作控制器单元crom。