总线结构:单总线,数据总线位数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中 |
图1:寄存器组原理图
74ls180有8个数据位(A~H)及一个奇偶位(ODD,EVEN)。通过级联可拓展字长。
引出端符号:
A~H:数据输入端
EVEN:偶控制输入端
FEV:偶输出端
FOD:奇输出端
ODD:奇控制输入端
【系统设计】
图2:模型机逻辑框图
图3:芯片引脚图
图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:仿真波形图
图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取反的结果。