- 設計任務
- 指令:12號、30號、41號、46號58號指令設計;
- 模型機硬件:寄存器組R0-R3設計與實現;
- 數字電路:奇偶發生器74LS180設計與實現;
- 設計總要求
總線結構:單總線,數據總線位數8位、地址總線8位;
存儲器:內存容量64K*8bit l
控制器:用硬聯線控制器實現26位微操作控制信號 l
運算器:單累加器,實現加、減等8種操作 l
外設:n
輸入:用開關輸入二進制量n
輸出:7段數碼管和LED顯示 l
指令系統規模:64條指令,7種類型,5種尋址方式
三、設計報告的內容
- 設計題目與設計任務
- 指令系統設計
表1:指令系統設計
編號 |
指令 |
機器碼1 |
機器碼 2 |
注 釋 |
12 |
ADDC A, #II |
001010 |
I I |
將立即數II加入累加器A中帶進位 |
30 |
MOV A, @R? |
011101 |
|
將間址存儲器的值送到累加器A中 |
41 |
JC MM |
101000 |
MM |
當進位標誌R_CY=1時,跳轉到MM地址 |
46 |
CMP A, R? |
101101 |
|
比較A與R?是否相等,即A-R,置標誌位Z |
58 |
CPL A |
111001 |
|
寄存器A 取反,再放入累加器A中 |
- 模型機硬件設計:寄存器組R0-R3
圖1:寄存器組原理圖
- 奇偶發生器74LS180:9位奇偶產生器/校驗器
74ls180有8個數據位(A~H)及一個奇偶位(ODD,EVEN)。通過級聯可拓展字長。
引出端符號:
A~H:數據輸入端
EVEN:偶控制輸入端
FEV:偶輸出端
FOD:奇輸出端
ODD:奇控制輸入端
- 前言(緒論)(設計的目的、意義等)
- 設計的目的主要是回顧課本和實際設計的訓練,指令的設計是對計算機組成原理實驗課的複習和應用。
- 用VHDL硬件描述語言實踐設計寄存器組R0-R3,可以培養學生的動手實踐能力,增強對計算機硬件組成與連線的認識,瞭解片選寄存器和寄存器的具體構造。
- 對奇偶產生器74LS180的設計可以同樣幫助學生理解計算機芯片組成,提高電路設計能力。
- 設計主體(各部分設計內容、分析、結論等)
【系統設計】
- 模型機邏輯框圖
圖2:模型機邏輯框圖
- 芯片引腳圖
圖3:芯片引腳圖
- CPU邏輯結構框圖
圖4:CPU邏輯結構框圖
- 指令系統設計
表2:指令系統設計
編號 |
指令 |
指令類型 |
尋址方式 |
12 |
ADDC A, #II |
算術運算指令 |
立即數尋址 |
30 |
MOV A, @R? |
數據傳送指令 |
寄存器間接尋址 |
41 |
JC MM |
程序跳轉控制類指令 |
存儲器直接尋址 |
46 |
CMP A, R? |
邏輯運算指令 |
寄存器直接尋址 |
58 |
CPL A |
邏輯運算指令 |
累加器尋址 |
- 微操作控制信號
1. XRD :外部設備讀信號,當給出了外設的地址後,輸出此信 號,從指定外設讀數據。
2. EMWR:程序存儲器EM寫信號。
3. EMRD:程序存儲器EM讀信號。
4. PCOE:將程序計數器PC的值送到地址總線ABUS上(MAR)。
5. EMEN:將程序存儲器EM與數據總線DBUS接通,由EMWR 和EMRD決定是將DBUS數據寫到EM中,還是從EM讀出數據 送到DBUS。
6. IREN:將程序存儲器EM讀出的數據打入指令寄存器IR。
7. EINT:中斷返回時清除中斷響應和中斷請求標誌,便於下次 中斷。
8. ELP: PC打入允許,與指令寄存器的IR3、IR2位結合,控制 程序跳轉。
9. FSTC:進位置1,CY=1
10.FCLC:進位置0,CY=0
11. MAREN:將數據總線DBUS上的地址打入地址寄存器MAR。
12. MAROE:將地址寄存器MAR的值送到地址總線ABUS上。
13. OUTEN:將數據總線DBUS上數據送到輸出端口寄存器OUT 裏。
14. STEN:將數據總線DBUS上數據存入堆棧寄存器ST中。
15. RRD: 讀寄存器組R0-R3,寄存器R?的選擇由指令的最低 兩位決定。
16. RWR: 寫寄存器組R0-R3,寄存器R?的選擇由指令的最低 兩位決定。
17. CN: 決定運算器是否帶進位移位,CN=1帶進位,CN=0不 帶進位。
18. FEN: 將標誌位存入ALU內部的標誌寄存器。
19. WEN: 將數據總線DBUS的值打入工作寄存器W中。
20. AEN:將數據總線DBUS的值打入累加器A中。
21-23: X2~ X0 : X2、X1、X0三位組合來譯碼選擇將數據送到 DBUS上的寄存器。
24-26: S2~ S0 : S2、S1、S0三位組合決定ALU做何種運算
- 指令執行流程
表3:指令執行流程
編號 |
助記符 |
功能 |
機器碼 |
週期總數CT |
節拍數 |
微操作 |
控制信號 |
涉及的硬件
|
1 |
_FATCH_ |
取指令 |
000000XX |
010 |
T0 |
PC→MAR |
PCOE MAREN |
PC, MAR , EM, W , IR |
T1 |
EM→W |
EMEN EMRD WEN |
||||||
T2 |
W→IR PC + 1→PC |
IREN |
||||||
12 |
ADDC A, #II |
將立即數II加入累加器A中帶進位 |
001010 I I |
101 |
T3 |
PC→MAR |
PCOE MAREN |
PC, MAR, EM, W, A,ALU, F |
T4 |
EM→DBUS→W PC+1→PC |
EMRD EMEN WEN |
||||||
T5 |
A,W→ALU→F ALU→A |
FEN AEN |
||||||
30 |
MOV A, @R? |
將間址存儲器的值送到累加器A中 |
011101 |
101 |
T3 |
R?→MAR |
PCOE MAREN |
PC, MAR, EM, W, DBUS, R |
T4 |
EM→DBUS→W PC+1→PC |
EMRD EMEN WEN |
||||||
T5 |
W→DBUS→A |
S() |
||||||
41 |
JC MM |
當進位標誌R_CY=1時,跳轉到MM地址 |
101000MM |
110 |
R_CY=1 |
PC→MAR |
PCOE MAREN |
PC,MAR,EM,,DBUS, W,ST |
T3 |
||||||||
T4 |
EM→PC PC+1→PC |
EMEN EMRD ELP |
||||||
R_CY=0 |
PC+1→PC |
|
||||||
T3 |
||||||||
46 |
CMP A, R? |
比較A與R?是否相等,即A-R,置標誌位Z |
101101 |
011 |
T3 |
R?→W |
RRD,WEN |
PC, MAR, EM, W, |
T4 |
A→W |
S2S1S0(001), FEN(R_ZF) |
||||||
58 |
CPL A |
寄存器A 取反,再放入累加器A中 |
111001XX |
011 |
T3 |
Not A->A |
AEN,S=100 |
A, ALU |
圖5:指令流程圖
(5)組合邏輯控制器設計
EMRD=M0*T1+M1*INS37*T5+M1*(INS8+INS37)*T4
POCE=M0*T2+M1*(INS37*T6+INS8*T5)
EMEN=M0*T1+M1*(INS37*T5+INS8*T4)
IREN=M0*T0
MAREN=M0*T2+M1*INS37*T6+M1*(INS8+INS37)*T5
RRD=M1*INS9*T4
WEN=M0*T1+M1*(INS8+INS9+INS37)*T4+M1*INS37*T3
AEN=M0*T1+M1*T3
X=M1*T3*(INS8+INS9+INS58)*(100)
S=M1*T3*(IINS8*(000)+INS9*(100)+INS58*(110)
其他信號邏輯表達式恆爲假。
(6)微程序控制器設計
微指令格式分爲 3 個字段:
微命令字段:26 位,對應 26 個微信號(採用直接控制法)。
操作控制字段:1 位,用於控制下址的形成。
下址字段:8 位,對應 256 個微指令。
微命令字段(26位) |
P0 |
A7A6A5A4A3A2A1A0 |
【系統實現】
- 模型機實現
- 邏輯電路的圖形符號表示、功能
圖6:單個寄存器(原理圖)
圖7:設計後實現效果圖
圖8:寄存器組R0-R3電路圖(原理圖)
圖9:實現的效果圖
功能是傳輸(輸入輸出)以及暫存。工作原理是通過片選選擇一個寄存器,00/01/10/11分別對應四個寄存器。
- 指令所涉及的微操作控制信號
D爲數據輸入(d_input[7:0])
R爲數據輸出(DR_data[7:0]、SR_data[7:0])
CLK爲時序控制,有統一的時鐘信號
EN爲讀寫控制端(DRWr)
RST爲復位端(reset),清零
Sel爲片選信號
- 系統實現
模型機硬件:寄存器組R0-R3設計與實現
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
entity regfile is
Port ( DR: in std_logic_vector(1 downto 0);
SR: in std_logic_vector(1 downto 0);
reset: in std_logic;
DRWr: in std_logic;
clk: in std_logic;
d_input: in std_logic_vector(7 downto 0);
DR_data: out std_logic_vector(7 downto 0);
SR_data: out std_logic_vector(7 downto 0)
);
end regfile;
architecture struct of regfile is
-- components
-- 8 bit Register for register file
component reg
port (
clr: in std_logic;
D: in std_logic_vector(7 downto 0);
clock: in std_logic;
write: in std_logic;
sel: in std_logic;
Q: out std_logic_vector(7 downto 0)
);
end component;
-- 2 to 4 Decoder
component decoder_2_to_4
port(
sel: in std_logic_vector(1 downto 0);
sel00: out std_logic;
sel01: out std_logic;
sel02: out std_logic;
sel03: out std_logic
);
end component;
-- 4 to 1 line multiplexer
component mux_4_to_1
port (
input0,
input1,
input2,
input3: in std_logic_vector(7 downto 0);
sel: in std_logic_vector(1 downto 0);
out_put: out std_logic_vector(7 downto 0));
end component;
signal reg00, reg01, reg02, reg03
:std_logic_vector(7 downto 0);
signal sel00 ,sel01 ,sel02 ,sel03
: std_logic;
begin
Areg00: reg port map(
clr => reset,
D => d_input ,
clock => clk ,
write => DRWr ,
sel => sel00 ,
Q => reg00
);
Areg01: reg port map(
clr => reset,
D => d_input ,
clock => clk ,
write => DRWr ,
sel => sel01 ,
Q => reg01
);
Areg02: reg port map(
clr => reset,
D => d_input ,
clock => clk ,
write => DRWr ,
sel => sel02 ,
Q => reg02
);
Areg03: reg port map(
clr => reset,
D => d_input ,
clock => clk ,
write => DRWr ,
sel => sel03 ,
Q => reg03
);
-- decoder
des_decoder: decoder_2_to_4 port map
(
sel => DR,
sel00 => sel00 ,
sel01 => sel01 ,
sel02 => sel02 ,
sel03 => sel03
);
mux1: mux_4_to_1 PORT MAP(
Input0 => reg00 ,
Input1 => reg01 ,
Input2 => reg02 ,
Input3 => reg03 ,
sel => DR ,
out_put => DR_data
);
mux2: mux_4_to_1 PORT MAP(
input0 => reg00 ,
input1 => reg01 ,
input2 => reg02 ,
input3 => reg03 ,
sel => SR ,
out_put => SR_data
);
end struct;
測試激勵文件:
library ieee;
use ieee.std_logic_1164.all;
entity reg is
port
(
clr: in std_logic;
D: in std_logic_vector(7 downto 0);
clock: in std_logic;
write: in std_logic;
sel: in std_logic;
Q: out std_logic_vector(7 downto 0)
);
end reg;
architecture behav of reg is
begin
process(clr,clock)
begin
if clr = '0' then
Q <= x"00";
elsif (clock'event and clock = '1') then
if sel = '1' and write = '1' then
Q <= D;
end if;
end if;
end process;
end behav;
- 邏輯電路設計
圖10:圖形符號表示
實現的功能是:取反
Verilog HDL描述:
`timescale 1ns / 1ns
module Even_Odd ( d ,even ,odd );
input [0:8] d ;
wire [0:8] d ;
output even ;
wire even ;
output odd ;
wire odd ;
wire [0:3]e;
wire [0:1]f;
wire h;
not
xodd (odd, even);
xor
x0 (e[0], d[0], d[1]),
x1 (e[1], d[2], d[3]),
x2 (e[2], d[4], d[5]),
x3 (e[3], d[6], d[7]),
xf0 (f[0], e[0], e[1]),
xf1 (f[1], e[2], e[3]),
xh0 (h, f[0], f[1]),
xeven (even, h, d[8]);
endmodule
測試文件:
`timescale 1ns / 1ns
module Even_Odd_tb;
//Internal signals declarations:
reg [0:8]d;
wire even,odd;
// Unit Under Test port map
Even_Odd UUT (
.d(d),
.even(even),
.odd(odd));
initial
begin:TEST
reg [0:8] pal;
begin
for (pal = 0; pal< 256; pal = pal +1)
begin
#10;
d = pal;
end
end
end
endmodule
【系統測試】
(一)、模型機測試
-
- 功能仿真
圖11:仿真波形圖
-
- RTL級邏輯電路
圖12:RTL級邏輯電路
結論:顯然上面的波形圖是錯誤的,應該實現的效果是
圖13:理論效果圖
由於RST爲1,雖然D端輸入數據爲:1111100010101011,輸出端仍爲0(從波形可以看出來),EN爲0,表示寫數據。而下面的RTL級電路圖實現了片選操作。
(二)硬件測試
1、功能仿真
圖15:Zoom fit
圖16:Zoom in
圖17:Zoom out
2、RTL級邏輯電路
圖18:RTL級邏輯電路
結論:根據波形圖,顯然實現了取反功能,對rtl電路圖分析,是通過異或門取反的,原理是A異或1都爲A取反的結果。