end CAR;
architecture CAR of CAR is
begin
process(CarIn)
begin
if CarIn='0' and CarIn'event then
Q<=D;
CarOut<='1';
end if;
if CarIn='1' and CarIn'event then CarOut<='0';
end if;
end process;
end CAR;
–
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity CBR is
port (InstrCom: in std_logic_vector (0 to 27);
CbrIn: in std_logic;
Adr: out std_logic_vector (5 downto 0);
Instr0: out std_logic;
Instr1: out std_logic;
Instr2: out std_logic;
PCIn: out std_logic;
IncPC: out std_logic;
IrIn: out std_logic;
MarIn:out std_logic;
RdWr:out std_logic;
CS:out std_logic;
MbrIn:out std_logic;
MbrOut:out std_logic;
MbrInD:out std_logic;
MbrOutD:out std_logic;
RzIn:out std_logic;
RzOut:out std_logic;
Inv:out std_logic;
RAIn:out std_logic;
RIn:out std_logic;
ROut:out std_logic;
RDCIn:out std_logic;
SADD:out std_logic;
InvZ: out std_logic);
end CBR;
architecture CBR of CBR is
begin
process(CbrIN)
begin
if CbrIN='1' and CbrIN'event then
Instr0<=InstrCom(2) after 1ns;
Instr1<=InstrCom(1) after 1ns;
Instr2<=InstrCom(0) after 1ns;
ADR<=InstrCom (3 to 8) after 1ns;
PCIn <=InstrCom(9) after 1ns;
IncPC<=InstrCom(10) after 1ns;
IrIn <=InstrCom(11) after 1ns;
MarIn <=InstrCom(12) after 1ns;
RdWr <=InstrCom(13) after 1ns;
CS <=InstrCom(14) after 1ns;
MbrIn<=InstrCom(15) after 1ns;
MbrOut<=InstrCom(16) after 1ns;
MbrInD<=InstrCom(17) after 1ns;
MbrOutD<=InstrCom(18) after 1ns;
RzIn <=InstrCom(19) after 1ns;
RzOut<=InstrCom(20) after 1ns;
Inv<=InstrCom(21) after 1ns;
RAIn<=InstrCom(22) after 1ns;
RIn <=InstrCom(23) after 1ns;
ROut<=InstrCom(24) after 1ns;
RDCIn <=InstrCom(25) after 1ns;
SADD<=InstrCom(26) after 1ns;
InvZ<=InstrCom(27) after 1ns;
end if;
end process;
end CBR;
–
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity IR is
port (Command: in std_logic_vector (7 downto 0);
IRin: in std_logic;
Reset: in std_logic;
IrOut: out std_logic;
Com: out std_logic_vector (7 downto 0));
end IR;
architecture IR of IR is
begin
process (IrIn, Reset)
begin
if IrIn='1' and Irin'event then
Com<=Command after 2ns;
IrOut<='1'after 2ns;
end if;
if IrIn='0' and Irin'event then IrOut<='0';
end if;
if Reset='1' then
Com<= «00000000»;
IrOut<='1';
end if;
end process;
end IR;
–
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity DC1 is
port (Ale:in std_logic;
Com: in std_logic_vector (7 downto 0);
ComAdr: out std_logic_vector (5 downto 0));
end DC1;
architecture DC1 of DC1 is
begin
process(Ale)
begin
if Ale='1' and Ale'event then
if Com= «00000000» then ComAdr <= «000111»;
elsif Com= «00000001» then ComAdr <= «001110»;
elsif Com= «00000010» then ComAdr <= «011011»;
elsif Com= «00000011» then ComAdr <= «100111»;
elsif Com= «00000100» then ComAdr <= «110011»;
else ComAdr <= «000000»;
end if;
end if;
end process;
end DC1;
–
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity INV is
port (DIn: in std_logic_vector (7 downto 0);
Inv: in std_logic;
DOut: out std_logic_vector (7 downto 0));
end INV;
architecture INV of INV is
begin
DOut<=not DIn when Inv='1'else DIn;
end INV;
–
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity LogAnd is
port (in1: in std_logic;
in2: in std_logic;
Sout: out std_logic);
end LogAnd;
architecture LogAnd of LogAnd is
begin
Sout<=in1 and in2 after 1ns;
end LogAnd;
–
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity LogOR is
port (in1: in std_logic;
in2: in std_logic;
SOut: out std_logic);
end LogOR;
architecture LogOR of LogOR is
begin
SOut<=in1 or in2 after 1ns;
end LogOR;
–
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity MUX is
port (IN1: in std_logic_vector (5 downto 0);
IN2: in std_logic_vector (5 downto 0);
IN3: in std_logic_vector (5 downto 0);
Adr0: in std_logic;
Adr1: in std_logic;
CLK: in std_logic;
MuxOut: out std_logic;
OUT1: out std_logic_vector (5 downto 0));
end MUX;
architecture MUX of MUX is
begin
process(CLK)
begin
if CLK='1' and CLK'event then
if Adr1='0' and Adr0='0' then OUT1 <= IN1;
elsif Adr1='1' then OUT1 <= IN2;
elsif Adr1='0' and Adr0='1' then OUT1 <= IN3;
else Out1<= «000000»;
end if;
MuxOut<='1';
end if;
if CLK='0' and CLK'event then MuxOut<='0';
end if;
end process;
end MUX;
–
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity MAR is
port (RST: in std_logic;
CLK: in std_logic;
MarIn: in std_logic;
AdrIn: in std_logic_vector (7 downto 0);
AdrOut: out std_logic_vector (7 downto 0));
end MAR;
architecture MAR of MAR is
signal reg: std_logic_vector (7 downto 0):= «00000000»;
begin
process (CLK, RST)
begin
if CLK='0' and CLK'event and MarIn='1' then reg<=AdrIn;
end if;
if CLK='1' and CLK'event then AdrOut<=reg;
end if;
if RST='1' then reg<= «00000000»;
end if;
end process;
end MAR;
–
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity MBR is
port (RST: in std_logic;
CLK: in std_logic;
MbrIn: in std_logic;
MbrOut: in std_logic;
MbrInD: in std_logic;
MbrOutD: in std_logic;
DataIn: inout std_logic_vector (7 downto 0);
DataOut: inout std_logic_vector (7 downto 0));
end MBR;
architecture MBR of MBR is
signal reg: std_logic_vector (7 downto 0);
begin
Process (CLK, RST)
begin
if CLK='0' and CLK'event then
if MbrIn='1' then reg<=DataIn;
elsif MbrOut='1' then DataOut<=reg;
elsif MbrInD='1' then reg<=DataOut;
elsif MbrOutD='1' then DataIn<=reg;
end if;
if MbrIn='0' and MbrOutD='0' then DataIn<= «ZZZZZZZZ»;
end if;
if MbrOut='0' and MbrInD='0' then DataOut<= «ZZZZZZZZ»;
end if;
end if;
if RST='1' then reg<= «00000000»;
end if;
end process;
end MBR;
–
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity RZ is
port (DIn: in std_logic_vector (7 downto 0);
CLK: in std_logic;
RST: in std_logic;
RZOut: in std_logic;
RZIn: in std_logic;
InvZ: in std_logic;
DOut: out std_logic_vector (7 downto 0));
end RZ;
architecture RZ of RZ is
signal regist: std_logic_vector (7 downto 0);
begin
process (CLK, RST)
begin
if CLK='0' and CLK'event and RZIn='1' then regist<=DIN;
end if;
if CLK='0' and CLK'event and RZOut='1' then
if InvZ='1'then DOut<=not regist after 3 ns;
else DOut<=regist after 3 ns;
end if;
end if;
if CLK='0' and CLK'event and RZOut='0' then DOut<= «ZZZZZZZZ» after 3 ns;
end if;
if RST='1' then regist<= «00000000»;
end if;
end process;
end RZ;
7. Тестирование процессора и подтверждение правильности его работы с помощью временных диаграмм
Описание процессора на языке ActiveVHDL:
library IEEE;
use IEEE.std_logic_1164.all;
entity MPA is
port (CLK: in STD_LOGIC;
Reset: in std_logic;
FC, bit_out: out std_logic;
DataBus: inout std_logic_vector (7 downto 0));
end MPA;
architecture MPA of MPA is
–
component Add
port (Inc: in STD_LOGIC;
Reset: in STD_LOGIC;
SIn: in std_logic_vector (5 downto 0);
SOut: out std_logic_vector (5 downto 0));
end component;
–
component ALU
port (A: in std_logic_vector (7 downto 0);
B: in std_logic_vector (7 downto 0);
CLK: in std_logic;
SADD: in std_logic;
FC: out std_logic;
FZ: out std_logic;
Q: out std_logic_vector (7 downto 0));
end component;
–
component CAR
port (CarIn: in std_logic;
D: in std_logic_vector (5 downto 0);
CarOut: out STD_LOGIC;
Q: out std_logic_vector (5 downto 0));
end component;
–
component CBR
port (CbrIn: in std_logic;
InstrCom: in std_logic_vector (0 to 27);
Adr: out std_logic_vector (5 downto 0);
CS: out STD_LOGIC;
IncPC: out STD_LOGIC;
Instr0: out std_logic;
Instr1: out std_logic;
Instr2: out std_logic;
Inv: out STD_LOGIC;
InvZ: out STD_LOGIC;
IrIn: out std_logic;
MarIn: out STD_LOGIC;
MbrIn: out STD_LOGIC;
MbrInD: out STD_LOGIC;
MbrOut: out STD_LOGIC;
MbrOutD: out STD_LOGIC;
PCin: out STD_LOGIC;
RAIn: out STD_LOGIC;
RDCIn: out STD_LOGIC;
RIn: out STD_LOGIC;
ROut: out STD_LOGIC;
RdWr: out STD_LOGIC;
RzIn: out STD_LOGIC;
RzOut: out STD_LOGIC;
SADD: out STD_LOGIC);
end component;
–
component DC1
port (Ale: in STD_LOGIC;
Com: in std_logic_vector (7 downto 0);
ComAdr: out std_logic_vector (5 downto 0));
end component;
–
component INV
port (DIn: in std_logic_vector (7 downto 0);
Inv: in std_logic;
DOut: out std_logic_vector (7 downto 0));
end component;
–
component IR
port (Command: in std_logic_vector (7 downto 0);
IRin: in std_logic;
Reset: in std_logic;
Com: out std_logic_vector (7 downto 0);
IrOut: out STD_LOGIC);
end component;
–
component LogAnd
port (in1: in std_logic;
in2: in std_logic;
Sout: out std_logic);
end component;
–
component LogOR
port (in1: in std_logic;
in2: in std_logic;
SOut: out std_logic);
end component;
–
component MAR
port (AdrIn: in std_logic_vector (7 downto 0);
CLK: in std_logic;
MarIn: in std_logic;
RST: in std_logic;
AdrOut: out std_logic_vector (7 downto 0));
end component;
–
component MBR
port (CLK: in STD_LOGIC;
MbrIn: in STD_LOGIC;
MbrInD: in STD_LOGIC;
MbrOut: in STD_LOGIC;
MbrOutD: in STD_LOGIC;
RST: in STD_LOGIC;
DataIn: inout STD_LOGIC_VECTOR (7 downto 0);
DataOut: inout STD_LOGIC_VECTOR (7 downto 0));
end component;
–
component Memory
port (Adr: in std_logic_vector (5 downto 0);
RD: in std_logic;
InstrCom: out std_logic_vector (0 to 27);
MrOut: out STD_LOGIC);
end component;
–
component MUX
port (Adr0: in std_logic;
Adr1: in std_logic;
CLK: in STD_LOGIC;
IN1: in std_logic_vector (5 downto 0);
IN2: in std_logic_vector (5 downto 0);
IN3: in std_logic_vector (5 downto 0);
MuxOut: out STD_LOGIC;
OUT1: out std_logic_vector (5 downto 0));
end component;
–
component PC
port (AdrIn: in STD_LOGIC_VECTOR (7 downto 0);
CLK: in STD_LOGIC;
IncPC: in STD_LOGIC;
PCIn: in STD_LOGIC;
RST: in STD_LOGIC;
AdrOut: out STD_LOGIC_VECTOR (7 downto 0));
end component;
–
component R0
port (C: in STD_LOGIC;
CLK: in std_logic;
DataIn: in std_logic_vector (7 downto 0);
RIn: in std_logic;
ROut: in std_logic;
RST: in std_logic;
DataOut: out std_logic_vector (7 downto 0));
end component;
–
component RA
port (
CLK: in STD_LOGIC;
DIn: in std_logic_vector (7 downto 0);
RAIn: in std_logic;
DOut: out std_logic_vector (7 downto 0));
end component;
–
component RAM
port (Adr: in STD_LOGIC_VECTOR (7 downto 0);
CS: in STD_LOGIC;
RdWr: in STD_LOGIC;
Data: inout STD_LOGIC_VECTOR (7 downto 0));
end component;
–
component RDC
port (Number: in std_logic_vector (7 downto 0);
RDCIn: in std_logic;
R1: out std_logic;
R2: out std_logic;
R3: out std_logic;
R4: out std_logic);
end component;
–
component RZ
port (CLK: in STD_LOGIC;
DIn: in STD_LOGIC_VECTOR (7 downto 0);
InvZ: in STD_LOGIC;
RST: in STD_LOGIC;
RZIn: in STD_LOGIC;
RZOut: in STD_LOGIC;
DOut: out STD_LOGIC_VECTOR (7 downto 0));
end component;
–
component R_1bit is
port (reg_in, IE: in std_logic;
CLK, Zero:in std_logic;
reg_out: out std_logic);
end component;
–
signal CS, IncPC, IrIn, MarIn, MbrIn, MbrOut, JB: STD_LOGIC;
signal S1, S2, S3, S4, S5, S6, S7, S8, S9, S10, SR1, SR2, SR3, SR4: STD_LOGIC;
signal N1, N2, N3, FC_sig, bit_outs: STD_LOGIC;
signal PCIN, RaIn, RDCIn, RdWr, RIn, ROut, RzIn, RzOut, SADD: STD_LOGIC;
signal Adr: std_logic_vector (7 downto 0);
signal BUS2, BUS6, BUS7, BUS8, BUS11: std_logic_vector (5 downto 0);
signal BUS10: std_logic_vector (27 downto 0);
signal BUS0, BUS1, BUS3, BUS4, BUS5: std_logic_vector (7 downto 0);
signal MemOut: STD_LOGIC_VECTOR (7 downto 0);
–
begin
DD0: IR port map (Com => BUS1, Command => DataBus, IRin => IrIn, IrOut => S3,
Reset => Reset);
DD1: LogAnd port map (Sout => S5, in1 => bit_outs, in2 =>S4);
DD2: MAR port map (AdrIn => BUS0, AdrOut => Adr, CLK => CLK, MarIn => MarIn,
RST => Reset);
DD3: RAM port map (Adr => Adr, CS => CS, Data => MemOut, RdWr => RdWr);
DD4: MBR port map (CLK => CLK, DataIn => MemOut, DataOut => DataBus,
MbrIn => MbrIn, MbrInD => S6, MbrOut => MbrOut,
MbrOutD => S7, RST => Reset);
DD5: R0 port map (C => SR1, CLK => CLK, DataIn => DataBus, DataOut => DataBus,
RIn => RIn, ROut => ROut, RST => Reset);
DD6: R0 port map (C => SR2, CLK => CLK, DataIn => DataBus, DataOut => DataBus,
RIn => RIn, ROut => ROut, RST => Reset);
DD7: R0 port map (C => SR3, CLK => CLK, DataIn => DataBus, DataOut => DataBus,
RIn => RIn, ROut => ROut, RST => Reset);
DD8: R0 port map (C => SR4, CLK => CLK, DataIn => DataBus, DataOut => DataBus,
RIn => RIn, ROut => ROut, RST => Reset);
DD9: RA port map (CLK => CLK, DIn => DataBus, DOut => BUS3, RAIn => RaIn);
DD10: ALU port map (A => BUS4, B => DataBus, CLK => CLK, FC => FC_sig, FZ => S1,
Q => BUS5, SADD => SADD);
DD11: DC1 port map (Ale => S3, Com => BUS1, ComAdr => BUS2);
DD12: RZ port map (CLK => CLK, DIn => BUS5, DOut => DataBus, InvZ => JB,
RST => Reset, RZIn => RzIn, RZOut => RzOut);
DD13: INV port map (DIn => BUS3, DOut => BUS4, Inv => S2);
DD14: RDC port map (Number => DataBus, R1 => SR1, R2 => SR2, R3 => SR3,
R4 => SR4, RDCIn => RDCIn);
DD15: MUX port map (Adr0 => S9, Adr1 => S10, CLK => CLK, IN1 => BUS11,
IN2 => BUS2, IN3 => BUS6, MuxOut => N2, OUT1 => BUS7);
DD16: Add port map (Inc => N2, Reset => Reset, SIn => BUS7, SOut => BUS11);
DD17: CAR port map (CarIn => CLK, CarOut => N3, D => BUS7, Q => BUS8);
DD18: Memory port map (Adr => BUS8, InstrCom => BUS10, MrOut => N1, RD => N3);
DD19: CBR port map (Adr => BUS6, CS => CS, CbrIn => N1, IncPC => IncPC, Instr0 => S8,
Instr1 => S4, Instr2 => S10, InstrCom => BUS10, Inv => S2, InvZ => JB, IrIn => IrIn,
MarIn => MarIn, MbrIn => MbrIn, MbrInD => S6, MbrOut => MbrOut, MbrOutD => S7,
PCin => PCIN, RAIn => RaIn, RDCIn => RDCIn, Rin => RIn, ROut => ROut,
RdWr => RdWr,
RzIn => RzIn, RzOut => RzOut, SADD => SADD);
DD20: PC port map (AdrIn => DataBus, AdrOut => BUS0, CLK => CLK, IncPC => IncPC,
PCIn => PCIN, RST => Reset);