根據《計算機組成原理課程設計》的設計要求設計能夠執行一定機器指令完成指定任務的CISC模型機。
1、課程設計的題目和內容
1.1 課程設計的題目
本次課程設計中本人選題爲:輸入包含10個整數(有符號數)的數組M,將其分成正整數數組P和負數數組N,依次輸出正數數組P中的整數及正數的個數。
1.2 課程設計完成的內容
1.完成系統的總體設計,畫出模型機數據通路框圖;
2.設計微程序控制器(CISC模型計算機)的邏輯結構框圖;
3.設計機器指令格式和指令系統;
4.設計時序產生器電路;
5.設計所有機器指令的微程序流程圖;
6.設計操作控制器單元;在CISC模型計算機中,設計的內容包括微指令格式(議採用全水平型微指令)、微指令代碼表(根 據微程序流程圖和微指令格式來設計)和微程序控制器硬件電路(包括地址轉移邏輯電路、微地址寄存器、微命令寄存和控制 存儲器等。具體電路根據微程序控制器的邏輯結構框圖、微指令格式和微指令代碼來設計)。
7.設計模型機的所有單元電路,並用VHDL語言(也可使用GDF文件----圖形描述文件)對模型機中的各個部件進行編程,並使之成爲一個統一的整體,即形成頂層電路或頂層文件;
8.由給出的題目和設計的指令系統編寫相應的彙編語言源程序;
9.根據設計的指令格式,將彙編語言源程序手工轉換成機器語言源程序,並將其設計到模型機中的ROM中去;
10.使用EDA軟件進行功能仿真,要保證其結果滿足題目的要求;(其中要利用EDA軟件提供的波形編輯器,選擇合適的輸入輸出信號及中間信號進行調試。)
2、系統總體設計
2.1 嵌入式CISI模型機系統總體設計
圖2-1 CISI模型機系統
2.2 嵌入式CISC系統控制器的邏輯結構框圖
圖2-2 CISC系統控制器的邏輯結構框圖
說明:
在T4內形成微指令的微地址,並訪問控制存儲器,在T2的上邊沿到來時,將讀出的微指令打入微指令寄存器,即圖中的微命令寄存器和微地址寄存器。
2.3 模型機的指令系統和所有指令的指令格式設計
爲了完成這次課程設計的功能,本次設計設計了10條指令:IN1(輸入),MOV(將一個數送入寄存器),LAD(將寄存器內容送到內存),JMP(無條件跳轉),INC(自加1),DEC(自減1),JNS(大於跳轉),STO1(將源寄存器值送到目標寄存器),OUT1(輸出),TEST(測試),如下用到的Rs和Rd分別表示源寄存器和目的寄存器。
2.3.1機器指令格式和指令系統
指令助記符 |
指令格式 |
功能 |
|||
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 |
2.3.2 對Rs和Rd格式規定
Rs或Rd |
選定的寄存器 |
00 |
R0 |
01 |
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 |
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 時序產生器
本實驗採用的是微程序控制器的時序產生器,如下圖
圖2-3 微程序控制器的時序關係圖
2.3.6 數據的表示
模型機規定數據的表示採用定點整數補碼錶示,單字長爲8位,其格式如下:
7 |
6 5 4 3 2 1 0 |
符號位 |
尾數 |
3 微程序控制器的設計全過程
3.1 微程序控制器的設計
微程序控制器的設計包括以下幾個階段:
(1)根據微處理器結構圖、指令格式和功能設計所有機器指令的微程序流程圖,並確定每條微指令的微地址和後繼微地址;
(2)設計微指令格式和微指令代碼表;
(3)設計地址轉移邏輯電路;
(4)設計微程序控制器中的其它邏輯單元電路,包括微地址寄存器、微命令寄存器和控制存儲器;
(5)設計微程序控制器的頂層電路(由多個模塊組成)。
3.2地址轉移邏輯電路的設計
地址轉移邏輯電路是根據微程序流程圖中的棱形框部分及多個分支微地址,利用微地址寄存器的異步置「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 ;輸出正整數的個數
3.4 彙編程序流程圖
圖3-1彙編程序流程圖
3.5 彙編程序對應的地址與機器語言代碼表:
地址 (十六進制) |
彙編語言源程序 |
機器語言源程序 (二進制) |
機器語言源程序 (十六進制) |
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 彙編語言與機器語言代碼表
3.6 微程序流程圖如下所示:
圖 3-2微程序流程圖
3.7 微指令的設計
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 MAX+plus Ⅱ軟件編譯仿真測試和結果分析
4.1 嵌入式模型計算機的頂層電路圖
圖 4-1 CISC模型計算機的頂層電路圖
如圖4-1中,其中的操作控制器單元crom的內部結構如下圖所示
圖 4-2 控制器單元crom的內部結構圖
如圖4-2中寄存器AA的內部結構如下所示,AA的內部是由6個MM構成的。
圖 4-3 寄存器AA內部結構圖
圖 4-3 寄存器AA內部結構圖
4.2 編譯仿真測試和結果分析
通過創建仿真時序圖top.scf.,可以實現模型機的功能仿真,從圖中可以看出cpu處理數據和數據的具體流向的每一個過程,如下是仿真的輸出波形,具體結果和分析如下:
圖 4-4 仿真結果圖1
如圖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 仿真結果圖2
由圖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 仿真結果圖3
圖 4-7仿真結果圖4
由圖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。
圖 4-8仿真結果圖5
第二組測試的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<Y)THEN
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。