Instr0 – сигналы управления автоматом
Instr1
Instr2
ADR – адрес перехода
PCIn – сигнал загрузки в регистр команд
IncPC – увеличение значения счётчика команд
IrIn – загрузка в регистр инструкций
MarIn – загрузка в регистр команд
RdWr – сигнал чтения-записи памяти
CS – сигнал выбора микросхемы памяти
MbrIn – загрузка в буферный регистр из памяти
MbrOut – выдача на шину из буферного регистра
MbrInD – загрузка в буферный регистр с шины
MbrOutD – выдача в память из буферного регистра
RzIn – загрузка в регистр результата
RzOut – вывод из регистра результата
Inv – инвертирование значения подаваемого в АЛУ из аккумулятора
RAIn – загрузка в аккумулятор
RIn – сигнал загрузки в регистры общего назначения
ROut – сигнал вывода из регистров общего назначения
RDCIn – сигнал загрузки значения в мультиплексор номера регистра
SADD – сигнал сложения для АЛУ
InvZ – инвертирование результата
6. Создание описания отдельных узлов процессора и всего процессора средствами Active HDL
Описание счетчика Add:
libraryIEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_signed.all;
use IEEE.STD_LOGIC_arith.all;
entity Add is
port (SIn: in std_logic_vector (5 downto 0);
Inc: in std_logic;
Reset: in std_logic;
SOut: out std_logic_vector (5 downto 0));
end Add;
architecture Add of Add is
begin
process (Inc, reset)
begin
if Inc='1' and Inc'event then
SOut<=CONV_STD_LOGIC_VECTOR(((CONV_INTEGER ('0'& SIn))+1), 6);
end if;
if Reset='1'then Sout<= «000000»;
end if;
end process;
end Add;
Временная диаграмма работы счетчика Add для УУ:
Описание ALU:
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_signed.all;
use IEEE.std_logic_arith.all;
entity ALU is
port (B: in std_logic_vector (7 downto 0);
A: in std_logic_vector (7 downto 0);
SADD: in std_logic;
CLK: in std_logic;
Q: out std_logic_vector (7 downto 0);
FC: out std_logic;
FZ: out std_logic);
end ALU;
architecture ALU of ALU is
signal rez: std_logic_vector (7 downto 0):= «00000000»;
begin
process(CLK)
begin
if CLK='0' and CLK'event then FC<='0';
if SADD='1' then
Q<= CONV_STD_LOGIC_VECTOR((CONV_INTEGER ('0'& A)+CONV_INTEGER ('0'& B)), 9) (7 downto 0) after 4 ns;
FC<= CONV_STD_LOGIC_VECTOR((CONV_INTEGER ('0'& A)+CONV_INTEGER ('0'& B)), 9) (8) after 4 ns;
else Q<= «00000000»;
end if;
if A= «00000000» then FZ<='0';
else FZ<='1';
end if;
end if;
end process;
end ALU;
Временная диаграмма работы устройства сложения ALU:
Описание счетчика микрокоманд PC:
libraryIEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_signed.all;
entity PC is
port (RST: in std_logic;
CLK: in std_logic;
PCIn: in std_logic;
IncPC: in std_logic;
AdrIn: in std_logic_vector (7 downto 0);
AdrOut: out std_logic_vector (7 downto 0));
end PC;
architecture PC of PC is
signal reg: std_logic_vector (7 downto 0);
begin
process (CLK, RST)
begin
If CLK='0' and CLK'event and PCIn='1' then reg<=AdrIn;
end if;
If CLK='0' and CLK'event and IncPC='1' then reg<=reg+ «0000001» after 2ns;
end if;
If CLK='1' and CLK'event then AdrOut<=reg after 2ns;
end if;
if RST='1' then reg<= «00000000»;
end if;
end process;
end PC;
Временная диаграмма работы счетчика микрокоманд PC:
Описание регистров РОН и их выбора:
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity R0 is
port (RST: in std_logic;
CLK: in std_logic;
C: in std_logic;
RIn: in std_logic;
ROut: in std_logic;
DataIn: in std_logic_vector (7 downto 0);
DataOut: out std_logic_vector (7 downto 0));
end R0;
architecture R0 of R0 is
signal regist: std_logic_vector (7 downto 0);
begin
process (CLK, RST)
begin
if CLK='0' and CLK'event and RIn='1'and C='1' then regist<=DataIN;
end if;
if CLK='0' and CLK'event and ROut='1'and C='1' then DataOut<=regist after 3 ns;
end if;
if CLK='0' and CLK'event and ROut='0' then DataOut<= «ZZZZZZZZ» after 3 ns;
end if;
if RST='1' then regist<= «00000000»;
end if;
end process;
end R0;
–
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity RDC is
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 RDC;
architecture RDC of RDC is
begin
process(RDCIn)
begin
if RDCIn='1' and RDCIn'event then
R1<='0';
R2<='0';
R3<='0';
R4<='0';
if Number= «00000001» then R1<='1'after 2ns;
end if;
if Number= «00000010» then R2<='1'after 2ns;
end if;
if Number= «00000011» then R3<='1'after 2ns;
end if;
if Number= «00000100» then R4<='1'after 2ns;
end if;
end if;
end process;
endRDC;
Временная диаграмма работы выбора регистров РОН RDC:
Описаниепамяти RAM:
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_signed.all;
entity RAM is
port (RdWr: in std_logic;
CS: in std_logic;
Adr: in std_logic_vector (7 downto 0);
Data: inout std_logic_vector (7 downto 0));
end RAM;
architecture RAM of RAM is
type MemoryType is array (0 to 8) of std_logic_vector (7 downto 0);
signal Memory: MemoryType:=(
«00000000», – mov A,#d
«00110011», –#d
«00000001», – mov R,#d
«00000001», – number R
«11110110», –#d
«00000010», – add A, Rn
«00000001», – number R
«00000100», – JBC bit, rel
«00000000»); – restart
begin
process (RdWr, CS, Adr)
begin
if RdWr='1' and CS='1' then Data<=Memory (CONV_INTEGER ('0'& Adr)) after 3ns;
end if;
if RdWr='0' and CS='1' then Memory (CONV_INTEGER ('0'& Adr))<=Data;
end if;
end process;
end RAM;
Описание регистра в один бит:
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity R_1bit is
port (reg_in, IE: in std_logic;
CLK, Zero:in std_logic;
reg_out: out std_logic);
end R_1bit;
architecture R_1bit of R_1bit is
signal regist: std_logic;
begin
process(CLK)
begin
reg_out<= regist;
if CLK='0' and CLK'event and IE='1' then regist<=reg_in after 2ns;
elsif Zero='1' then regist<='0' after 2ns;
end if;
end process;
end R_1bit;
–
Временная диаграмма работы памяти МПА RAM:
Описание регистра-аккумулятора RA:
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity RA is
port (
CLK: in std_logic;
RAIn: in std_logic;
DIn: in std_logic_vector (7 downto 0);
DOut: out std_logic_vector (7 downto 0)
);
end RA;
architecture RA of RA is
signal reg: std_logic_vector (7 downto 0):= «00000000»;
begin
process (CLK, RAIn)
begin
DOut<=reg after 3 ns;
if CLK='0' and CLK'event and RAIn='1' then
reg<=DIn;
end if;
end process;
end RA;
Временная диаграмма работы регистра-аккумулятора RA:
Описаниеузлапамяти Memory:
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_signed.all;
entity Memory is
port (Adr: in std_logic_vector (5 downto 0);
RD: in std_logic;
MrOut: out std_logic;
InstrCom: out std_logic_vector (0 to 27));
end Memory;
architecture Memory of Memory is
type MemoryType is array (0 to 59) of std_logic_vector (0 to 27);
signal Memory: MemoryType;
begin
Memory(0)<= «000»& «000000»& «0000000»& «0000000»& «0000»& «0»;
Memory(1)<= «000»& «000000»& «0001000»& «0000000»& «0000»& «0»; – MarIn
Memory(2)<= «000»& «000000»& «0000110»& «0000000»& «0000»& «0»; – RdWr, CS
Memory(3)<= «000»& «000000»& «0000001»& «0000000»& «0000»& «0»; – MbrIn
Memory(4)<= «000»& «000000»& «0000000»& «1000000»& «0000»& «0»; – MbrOut
Memory(5)<= «000»& «000000»& «0010000»& «0000000»& «0000»& «0»; – IrIn
Memory(6)<= «100»& «000000»& «0000000»& «0000000»& «0000»& «0»; – Instr0
– mov A,#d
Memory(7) <= «000»& «000000»& «0100000»& «0000000»& «0000»& «0»; – IncPC
Memory(8) <= «000»& «000000»& «0001000»& «0000000»& «0000»& «0»; – MarIn
Memory(9) <= «000»& «000000»& «0000110»& «0000000»& «0000»& «0»; – RdWr, CS
Memory(10)<= «000»& «000000»& «0000001»& «0000000»& «0000»& «0»; – MbrIn
Memory(11)<= «000»& «000000»& «0000000»& «1000000»& «0000»& «0»; – MbrOut
Memory(12)<= «000»& «000000»& «0000000»& «0000001»& «0000»& «0»; – RAin
Memory(13)<= «001»& «000000»& «0100000»& «0000000»& «0000»& «0»; – Instr2, IncPC
– mov Rn,#d
Memory(14)<= «000»& «000000»& «0100000»& «0000000»& «0000»& «0»; – IncPC
Memory(15)<= «000»& «000000»& «0001000»& «0000000»& «0000»& «0»; – MarIn
Memory(16)<= «000»& «000000»& «0000110»& «0000000»& «0000»& «0»; – RdWr, CS
Memory(17)<= «000»& «000000»& «0000001»& «0000000»& «0000»& «0»; – MbrIn
Memory(18)<= «000»& «000000»& «0000000»& «1000000»& «0000»& «0»; – MbrOut
Memory(19)<= «000»& «000000»& «0000000»& «0000000»& «0010»& «0»; – RDCIn
Memory(20)<= «000»& «000000»& «0100000»& «0000000»& «0000»& «0»; – IncPC
Memory(21)<= «000»& «000000»& «0001000»& «0000000»& «0000»& «0»; – MarIn
Memory(22)<= «000»& «000000»& «0000110»& «0000000»& «0000»& «0»; – RdWr, CS
Memory(23)<= «000»& «000000»& «0000001»& «0000000»& «0000»& «0»; – MbrIn
Memory(24)<= «000»& «000000»& «0000000»& «1000000»& «0000»& «0»; – MbrOut
Memory(25)<= «000»& «000000»& «0000000»& «0000000»& «1000»& «0»; – RIn
Memory(26)<= «001»& «000000»& «0100000»& «0000000»& «0000»& «0»; – Instr2, IncPC
– add A, Rn
Memory(27)<= «000»& «000000»& «0100000»& «0000000»& «0000»& «0»; – IncPC
Memory(28)<= «000»& «000000»& «0001000»& «0000000»& «0000»& «0»; – MarIn
Memory(29)<= «000»& «000000»& «0000110»& «0000000»& «0000»& «0»; – RdWr, CS
Memory(30)<= «000»& «000000»& «0000001»& «0000000»& «0000»& «0»; – MbrIn
Memory(31)<= «000»& «000000»& «0000000»& «1000000»& «0000»& «0»; – MbrOut
Memory(32)<= «000»& «000000»& «0000000»& «0000000»& «0010»& «0»; – RDCIn
Memory(33)<= «000»& «000000»& «0000000»& «0000000»& «0100»& «0»; – ROut
Memory(34)<= «000»& «000000»& «0000000»& «0000000»& «0001»& «0»; – SADD
Memory(35)<= «000»& «000000»& «0000000»& «0001000»& «0000»& «0»; – RZin
Memory(36)<= «000»& «000000»& «0000000»& «0000100»& «0000»& «0»; – RZout
Memory(37)<= «000»& «000000»& «0000000»& «0000001»& «0000»& «0»; – RAin
Memory(38)<= «001»& «000000»& «0100000»& «0000000»& «0000»& «0»; – Instr2, IncPC
– JBC
Memory(51)<= «010»& «110110»& «0000000»& «0000000»& «0000»& «0»; – perexod na adres 36H ili 54 v dec s/s
Memory(52)<= «000»& «000000»& «0000000»& «0000000»& «0000»& «0»; – any value
Memory(53)<= «000»& «000000»& «0000000»& «0000000»& «0000»& «0»; – any value
Memory(54)<= «000»& «000000»& «0100000»& «0000000»& «0000»& «0»; – IncPC
Memory(55)<= «000»& «000000»& «0001000»& «0000000»& «0000»& «0»; – MarIn
Memory(56)<= «000»& «000000»& «0000110»& «0000000»& «0000»& «0»; – RdWr, CS
Memory(57)<= «000»& «000000»& «0000001»& «0000000»& «0000»& «0»; – MbrIn
Memory(58)<= «000»& «000000»& «0000000»& «1000000»& «0000»& «0»; – MbrOut
Memory(59)<= «001»& «000000»& «1000000»& «0000000»& «0000»& «0»; – Instr2, PCIn
process(RD)
begin
if RD='1' and RD'event then
InstrCom<=Memory (CONV_INTEGER ('0'& Adr));
MrOut<='1';
end if;
if RD='0' and RD'event then MrOut<='0';
end if;
end process;
end Memory;
Временная диаграмма работы памяти УУ Memory:
VHDL– описание остальных элементов схемы (регистра CAR и регистра СBR, регистра инструкций, мультиплексора, декодера, простых логических элементов, регистров MAR и MBR):
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity CAR is
port (D: in std_logic_vector (5 downto 0);
CarIn: in std_logic;
CarOut: out std_logic;
Q: out std_logic_vector (5 downto 0));