Le microprocesseur proprement dit est structuré en quatres modules :
SEQ
, qui lit séquentiellement
une instruction par cycle en mémoire ou saute à une adresse
qui lui est fournie comme entrée. Il possède aussi des entrées
enable et reset qui permette de suspendre la lecture ou de
recommencer à l'adresse 0h
. Ce device est connecté
au décodeur des instructions et au bus mémoire. ALU
. Comme son nom l'indique,
c'est le device qui effectue les opérations arithmétiques
et logiques. connecté au décodeur des instructions,
il sert aussi au calcul des adresses de saut.REG
: ce sont les 32 registres du
microprocesseur. Il est connecté au device DECODE
DECODE
: c'est lui qui décode
les instructions et connecte entres elles les différentes
entrées sorties des autres devices.
Il est bien sûr connecté au bus mémoire.
A ceci viens s'ajouter le bus mémoire qui gère aussi les entrées/sorties.
Schema général
Adressage virtuel
On a vu précédemment que toutes les instructions prenaient
la mê place en mémoire : 2 mots mémoire, or le micro, qui a le
droit de lire les instructions avec read
ne voie
voit que des mots mémoire de 16 bits. Il faudrait donc 2 cycle
pour lire chaque instruction. Ce qui est génant car toutes les
opérations de l'ALU s'effectuent en 1 cycle. On a donc recours un
bus de donnée et d'adresses virtuel pour les opérations
read
et write
, tandis que le module
SEQ
lit sur un bus de donnés de 32 bits
( 15 bits d'adresses) une instruction par cycle.
Accès à la mémoire
Le choix étant fait que la mémoire de code est aussi la
mémoire de données, il se pose le problème de l'accès à la mémoire :
comme SEQ
lit à chaque cycle dans la mémoire, il
faut nécessairement interrompre cette lecture lors
d'une instruction read
( et pour rendre les choses
homogènes, on le fait aussi pour write
). Dans le cas
des instruction de lecture/écriture, on utilise donc deux cycles du
processeur : pendant le premier cycle, on lit l'instruction et
on calcule l'adresse mémoire où lire ou écrire les données,
pendant le second cycle, on lit/écrit à l'adresse calculée et
SEQ
ne lit pas l'instruction suivante.
cd /home/heriard/jazz/micro/
make montre
jazz -O alu.jzz reg.jzz mem.jzz seq.jzz micro.jzz
%% The Jazz compiler version 0.3.5
%% Compilation: 2.54 s (2.70 s real)
%% Link: 0.06 s (0.06 s real)
%% Device "ALU". nets: 368, mux: 312, per: 53, op: 365, net/op: 1.00
%% Combinatorial depth: 57
%% Writing "./ALU.jzn"
%% Device "REG". nets: 671, reg: 512, mux: 1504, per: 17, &: 574, ~: 31, op: 2638, net/op: 0.25
%% Combinatorial depth: 6
%% Writing "./REG.jzn"
%% Device "MEM". nets: 3670, reg: 496, mux: 2338, per: 32, |: 10, &: 67, ~: 1, op: 2944, net/op: 1.24
%% Combinatorial depth: 13
%% Writing "./MEM.jzn"
%% Device "SEQ". nets: 181, reg: 15, mux: 15, per: 2, &: 15, ^: 15, ~: 1, op: 63, net/op: 2.87
%% Combinatorial depth: 17
%% Writing "./SEQ.jzn"
%% Device "MICRO". nets: 6079, reg: 1060, mux: 4275, per: 106, |: 31, &: 665, ^: 15, ~: 38, op: 6190, net/op: 0.98
%% Combinatorial depth: 69
%% Writing "./MICRO.jzn"
%% Execution: 8.24 s (8.24 s real)
make -C ./as ass
make[1]: Entering directory `/home/heriard/jazz/micro/as'
camlc -c mint.ml
camlc -c instr.mli
camlc -c instr.ml
camlc -c parsefuncs.ml
camlyacc parser.mly
camlc -c parser.mli
camlc -c parser.ml
camllex lexer.mll
70 states, 28 actions.
camlc -c lexer.ml
camlc -c as.ml
camlc -o ass mint.zo instr.zo parsefuncs.zo parser.zo lexer.zo as.zo
make[1]: Leaving directory `/home/heriard/jazz/micro/as'
mv -f ./as/ass ./bin/
make -C ./as blank
make[1]: Entering directory `/home/heriard/jazz/micro/as'
camlc -c blank.ml
camlc -o blank blank.zo
make[1]: Leaving directory `/home/heriard/jazz/micro/as'
mv -f ./as/blank ./bin/
./bin/ass < boot.src > boot.rom
./bin/blank 16 512 >> boot.rom
jazz -O clock_in.jzz
%% The Jazz compiler version 0.3.5
%% Compilation: 1.31 s (1.32 s real)
%% Link: 0.05 s (0.04 s real)
%% Device "INPUTS". nets: 514, per: 1, op: 1, net/op: 514.00
%% Combinatorial depth: 1
%% Writing "./INPUTS.jzn"
%% Execution: 0.08 s (0.07 s real)