Universita' di Bologna
'

Corso di Elettronica dei Sistemi Digitali


Relazione 3: Progetto di un piccolo microcontrollore ad 8 bit


Scopo della esercitazione e' realizzare su FPGA Flex10Ke il modello di una famiglia di piccoli microcontrllori, descritti come SOFT CORES (modello VHDL) a 8-bit. Vengono nel seguito descritte le caratteristiche fondamentali che dovranno avere tutti i microcontrollori realizzati.

Caratteristiche fondamentali:

RRR Codice operazione (5 bit) 00 Reg. Destinazione (3 bit) Reg. Sorgente 1(3 bit)Reg. Sorgente 2 (3 bit)
RI Codice operazione (5 bit) Reg. Destinazione (3 bit) IMMEDIATE (8 bit)



Operazioni Aritmetico-Logiche
ADD 00000
SUB 00001
AND 00010
OR 00011
NOT 00100
SGE 00101
SGT 00110
ADDI 01000
SUBI 01001

Operazioni sulla Memoria:
SB 10000
LB 10001

Operazioni di controllo:
J 10010
JR 10011
BEQZ 10100
BNEQZ 10101


Il microcontrollore avra' una architettura harvard. Al suo interno verranno mappate due memorie separate realizzate con blocchi LPM che verranno mappati sui RAM blocks del dispositivo Flex. Il programma da eseguire e i relativi dati vengono forniti attraverso i file MIF (Memory Initialization File) di ALTERA. In realta' quindi la interfaccia verso l'esterno dovrebbe essere composta solo da segnali di controllo (Clk, Reset), ed eventuali periferiche di I/O come la porta parallela descritta in un precedente esercizio. Per verificare il funzionamento del dispositivo vengono pero' portati all'esterno i valori di tutti i Bus interni. Nel seguito verranno poste le unita' funzionali che dovranno essere composte per realizzare il microcontrollore e le definizioni di tipo comuni a tutti gli aspetti del progetto:

Main Entity:

entity ESD_2004 is
port( clk,reset : in std_logic;
I_ADDR_OUT : out std_logic_vector(7 downto 0);
I_INSTR_OUT : out std_logic_vector(15 downto 0);
D_ADDR_OUT : out std_logic_vector(7 downto 0);
D_DATA_OUT : out std_logic_vector(7 downto 0) );
end ESD_2004;

All'interno di questa entity si avranno le due memorie dati e istruzioni e il microprocessore vero e proprio, che verra' chiamato CORE.

entity instr_memory is
port(
CK : in std_logic;
A : in std_logic_vector(7 downto 0);
D : in std_logic_vector(15 downto 0);
Q : out std_logic_vector(15 downto 0) );
end instr_memory;

entity data_memory is
port( CK : in std_logic;
OEN : in std_logic;
WEN : in std_logic;
CSN : in std_logic;
A : in std_logic_vector(7 downto 0);
D : in std_logic_vector(7 downto 0);
Q : out std_logic_vector(7 downto 0) );
end data_memory;

entity ESD_2004_core
port(CK : in std_logic;
I_ADDR : out std_logic_vector(7 downto 0);
I_INSTR : in std_logic_vector(15 downto 0);
dmem_read,dmem_write : out std_logic;
D_ADDR : out std_logic_vector(7 downto 0);
D_DATAOUT : out std_logic_vector(7 downto 0);
D_DATAIN : in std_logic_vector(7 downto 0) );
end ESD_2004_core;


Questa e' la sequenza degli eventi da realizzare sul circuito (Che incidentalmente e' anche il percorso critico del processore):
CLK -> La istruzione esce dalla memoria istruzioni -> viene decodificata e si determinano il futuro program counter e i registri da leggere-> vengono letti (IN MODO ASINCRONO)-> la alu esegue la sua operazione-> viene indirizzata (nel caso di Load o Store) la memoria dati | -> CLK NEGATO -> Viene letta la memoria dati e si porta il risultato sulle porte del Register file in attesa di essere campionato (intanto si mette il prossimo program counter sulle porte della memoria istruzioni -> CLK


I seguenti files possono essere utilizzati per realizzare la esercitazione: sono stati verificati e corretti in modo tale che il loro funzionamento dovrebbe essere garantito!