summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cpu/cpu.ml6
-rw-r--r--monitor/mon.c16
-rw-r--r--plan_micro.pdfbin76886 -> 79404 bytes
-rw-r--r--plan_micro.tm127
4 files changed, 75 insertions, 74 deletions
diff --git a/cpu/cpu.ml b/cpu/cpu.ml
index 94cc47c..b7e394b 100644
--- a/cpu/cpu.ml
+++ b/cpu/cpu.ml
@@ -203,6 +203,12 @@ let rl, rh, i, ex, exf, pc =
let wr = mux instr_lra wr (const "101") in
let rwd = mux instr_lra rwd (nadder 16 pc (sign_extend 11 16 i_jd)) in
+ (* instruction : hlt *)
+ let instr_hlt = exec ^& eq_c 5 i_i 0b01111 in
+ let halted, set_halted = loop 1 in
+ let halted = set_halted (instr_hlt ^| (reg 1 halted)) in
+ let exec_finished = mux halted exec_finished (const "0") in
+
(* instruction : lw/lwr/sw/swr *)
let instr_lsw = eq_c 4 (i_i % (1, 4)) 0b1000 in
let instr_lswr = eq_c 4 (i_i % (1, 4)) 0b1010 in
diff --git a/monitor/mon.c b/monitor/mon.c
index 19259a1..19055c7 100644
--- a/monitor/mon.c
+++ b/monitor/mon.c
@@ -80,6 +80,8 @@ void mon_loop(t_mon *mon) {
time_t prev_time = time(NULL);
int steps = 0;
+ int displayer_steps = 0;
+
while (mon->status != MS_FINISH) {
handle_kbd(mon);
if (mon->status == MS_AUTO) {
@@ -92,6 +94,11 @@ void mon_loop(t_mon *mon) {
steps = 0;
prev_time = time(NULL);
}
+ displayer_steps++;
+ if (displayer_steps >= mon->actual_freq / 100) {
+ disp_display(mon);
+ displayer_steps = 0;
+ }
} else if (mon->status == MS_FREQ) {
if (prev_time != time(NULL)) {
mon->actual_freq = steps;
@@ -111,6 +118,11 @@ void mon_loop(t_mon *mon) {
}
mon_step(mon);
steps++;
+ displayer_steps++;
+ if (displayer_steps >= mon->actual_freq / 100) {
+ disp_display(mon);
+ displayer_steps = 0;
+ }
int sleep = 1000000 / mon->target_freq - mon->calc_time_usec;
if (sleep > 0) usleep(sleep);
} else {
@@ -122,6 +134,7 @@ void mon_loop(t_mon *mon) {
void mon_handle_command(t_mon *mon, const char *c) {
if (c[0] == 0) { // empty command : run step
mon_step(mon);
+ disp_display(mon);
} else if (!strcmp(c, "q")) {
mon->status = MS_FINISH;
} else if (!strcmp(c, "a")) {
@@ -134,6 +147,7 @@ void mon_handle_command(t_mon *mon, const char *c) {
while (isspace(*p)) p++;
while (isdigit(*p)) mon->target_freq = 10 * mon->target_freq + (*(p++) - '0');
if (mon->target_freq == 0) mon->target_freq = 1000;
+ mon->actual_freq = mon->target_freq;
mon->calc_time_usec = 1000;
mon->status = MS_FREQ;
} else if (c[0] == 'i') {
@@ -270,7 +284,5 @@ void mon_step(t_mon *mon) {
mon->ser_out_buf = mon->outputs[mon->ser_out].v_int;
}
- // Display
mon->step++;
- disp_display(mon);
}
diff --git a/plan_micro.pdf b/plan_micro.pdf
index 14bf881..f1caa0f 100644
--- a/plan_micro.pdf
+++ b/plan_micro.pdf
Binary files differ
diff --git a/plan_micro.tm b/plan_micro.tm
index acfe710..4ef4bda 100644
--- a/plan_micro.tm
+++ b/plan_micro.tm
@@ -3,14 +3,16 @@
<style|generic>
<\body>
- <doc-data|<doc-title|Spécification processeur>>
+ <doc-data|<doc-title|Spécification processeur>|<doc-subtitle|Projet Système
+ Digital 2013>|<doc-author|<author-data|<author-name|A.Auvolat, E.Enguehard,
+ J.Laurent>>>>
Nous proposons ici une spécification pour un processeur minimaliste 16 bit
RISC.
<section|Registres>
- La machine dispose de 8 registres \S généraux \T :
+ La machine dispose de 8 registres \S généraux \T, tous de taille 16 bits :
\;
@@ -36,64 +38,48 @@
par les instructions <verbatim|pop> et <verbatim|push>
</itemize>
- De plus, le processeur dispose d'un registre non manipulable, le registre
- <verbatim|PC> (program counter).
+ Ces 8 registres sont tous manipulables par les instructions prenant un
+ registre comme argument. De plus, le processeur dispose d'un registre
+ manipulable uniquement par certaines instructions spécifiques, le registre
+ <verbatim|PC> (program counter : contient l'adresse de l'instruction
+ courante).
Les numéros de registres sont donc codés sur 3 bits.
<section|Mémoire>
- La mémoire est adressée sur 16 bits, il y a donc 64ko disponnibles.
+ La mémoire est adressée sur 16 bits et les mots mémoire font 8 bits, il y a
+ donc 64ko disponnibles.
Le CPU est little-endian (le mot 0x1234 est codé 34 puis 12)
- <subsection|Modèle simple>
-
On définit plusieurs zones de mémoire :
<big-table|<tabular*|<tformat|<table|<row|<cell|0x0000 - 0x3FFF>|<cell|ROM
pour programme utilisateur>>|<row|<cell|0x4000 - 0x7FFF>|<cell|MMIO (seuls
- quelques octets seront utilisés)>>|<row|<cell|0x8000 - 0xFFFF>|<cell|RAM
- pour programme utilisateur>>>>>|Memory map>
-
- <subsection|Modèle avec affichage bitmapé>
-
- <em|De moins en moins de chances d'être implémenté... mais ça n'a rien
- d'impossible.>
-
- On définit plusieurs zones de mémoire :
+ quelques octets sont utilisés)>>|<row|<cell|0x8000 - 0xFFFF>|<cell|RAM pour
+ programme utilisateur>>>>>|Memory map>
- <big-table|<tabular*|<tformat|<table|<row|<cell|0x0000 - 0x3FFF>|<cell|ROM
- pour programme utilisateur>>|<row|<cell|0x4000 - 0x6FFF>|<cell|VGA
- Framebuffer (noir et blanc, 336x288)>>|<row|<cell|0x7000 -
- 0x77FF>|<cell|ROM pour police d'écriture>>|<row|<cell|0x7800 -
- 0x7FFF>|<cell|MMIO (seuls quelques octets seront
- utilisés)>>|<row|<cell|0x8000 - 0xFFFF>|<cell|RAM pour programme
- utilisateur>>>>>|Memory map>
-
- Les 0x3000 (12288) octets de mémoire pour le VGA correspondent à un
- affichage bitmapé 336x288 noir et blanc (un octet représente 8 pixels), ce
- qui fait avec une police d'écriture 8x8 un affichage texte possible en
- 42x36.
-
- Les 0x0800 (2048) octets de RAM pour la fonte suffisent à définir 256
- caractères en résolution 8x8 (donc 8 octets par caractère).
+ Les bits suivants sont utilisés pour la MMIO :
- Sur les 0x8000 octets alloués pour la MMIO, on en aura un pour l'entrée
- série, un pour la sortie série, un pour l'horloge et c'est tout.
-
- Le reste est auto-explicite.
+ <big-table|<tabular*|<tformat|<table|<row|<cell|>>>>><tabular*|<tformat|<table|<row|<cell|byte
+ at 0x4000>|<cell|Clock ticker (incremented every tick, reset on
+ read)>>|<row|<cell|byte at 0x4100>|<cell|Serial input (set when byte
+ received, reset on read)>>|<row|<cell|byte at 0x4102>|<cell|Serial output
+ (sends byte immediately on write)>>>>>|Addresses MMIO>
<section|Jeu d'instruction>
Les instructions sont codées sur 16 bits. Les tableaux suivants montrent
- les instructions avec les poids forts à gauche et les poids faibles à
- droite.
+ les instructions avec les bits de poids forts à gauche et les bits de poids
+ faibles à droite (convention contraire à celle exprimée dans le
+ <verbatim|README>).
<subsection|Types d'instructions>
<paragraph|Format de base><tabular*|<tformat|<cwith|2|2|1|-1|cell-lborder|1px>|<cwith|2|2|1|-1|cell-bborder|1px>|<cwith|2|2|1|-1|cell-tborder|1px>|<cwith|2|2|3|3|cell-rborder|1px>|<table|<row|<cell|5
- bits>|<cell|3 bits>|<cell|8 bits>>|<row|<cell|<math|I>>|<cell|<math|R>>|<cell|<math|\<ldots\>>>>>>>
+ bits>|<cell|3 bits>|<cell|8 bits>>|<row|<cell|<math|I>>|<cell|<math|R>>|<cell|<math|\<ldots\>>>>|<row|<cell|poids
+ forts>|<cell|>|<cell|poids faibles>>>>>
<paragraph|Format <math|R>><tabular*|<tformat|<cwith|2|2|1|-1|cell-lborder|1px>|<cwith|2|2|1|-1|cell-bborder|1px>|<cwith|2|2|1|-1|cell-tborder|1px>|<cwith|2|2|3|3|cell-rborder|1px>|<cwith|2|2|5|5|cell-rborder|1px>|<table|<row|<cell|5
bits>|<cell|3 bits>|<cell|3 bits>|<cell|3 bits>|<cell|2
@@ -141,7 +127,8 @@
<math|R<rsub|A>\<leqslant\>R<rsub|B>> then
<math|PC\<leftarrow\>R<rsub|>>>|<cell|non
signé>>|<row|<cell|01100>|<cell|J>|<cell|>|<cell|lra>|<cell|<math|E\<leftarrow\>PC+d>>|<cell|<math|d>
- signé>>|<row|<cell|01101>|<cell|>|<cell|>|<cell|<em|nop>>|<cell|>|<cell|>>|<row|<cell|01110>|<cell|>|<cell|>|<cell|<em|nop>>|<cell|>|<cell|>>|<row|<cell|01111>|<cell|>|<cell|>|<cell|<em|nop>>|<cell|>|<cell|>>|<row|<cell|10000>|<cell|K>|<cell|>|<cell|lw>|<cell|<math|R\<leftarrow\>mem<around*|(|R<rprime|'>+d|)>>
+ signé>>|<row|<cell|01101>|<cell|>|<cell|>|<cell|<em|nop>>|<cell|>|<cell|>>|<row|<cell|01110>|<cell|>|<cell|>|<cell|<em|nop>>|<cell|>|<cell|>>|<row|<cell|01111>|<cell|>|<cell|>|<cell|hlt>|<cell|halt
+ microprocessor (infinite loop)>|<cell|>>|<row|<cell|10000>|<cell|K>|<cell|>|<cell|lw>|<cell|<math|R\<leftarrow\>mem<around*|(|R<rprime|'>+d|)>>
(16 bits)>|<cell|>>|<row|<cell|10001>|<cell|K>|<cell|>|<cell|sw>|<cell|<math|mem<around*|(|R<rprime|'>+d|)>\<leftarrow\>R>
(16 bits)>|<cell|>>|<row|<cell|10010>|<cell|K>|<cell|>|<cell|lb>|<cell|<math|R<rsub|lo>\<leftarrow\>mem<around*|(|R<rprime|'>+d|)>
; R<rsub|hi>\<leftarrow\>0> (8 bits)>|<cell|>>|<row|<cell|10011>|<cell|K>|<cell|>|<cell|sb>|<cell|<math|mem<around*|(|R<rprime|'>+d|)>\<leftarrow\>R<rsub|lo>>
@@ -154,6 +141,9 @@
; R<rsub|lo>\<leftarrow\>0>>|<cell|>>|<row|<cell|11100>|<cell|>|<cell|>|<cell|<em|nop>>|<cell|>|<cell|>>|<row|<cell|11101>|<cell|>|<cell|>|<cell|<em|nop>>|<cell|>|<cell|>>|<row|<cell|11110>|<cell|>|<cell|>|<cell|<em|nop>>|<cell|>|<cell|>>|<row|<cell|11111>|<cell|>|<cell|>|<cell|nop<samp|>>|<cell|<math|\<varnothing\>>>|<cell|>>>>>|Instructions
reconnues par le microproceseur>
+ L'assembleur propose également quelques instructions \S étendues \T
+ permettant de faciliter la programmation :
+
<big-table|<tabular|<tformat|<cwith|1|1|1|-1|cell-bborder|1px>|<table|<row|<cell|<strong|Nom>>|<cell|<strong|Action>>|<cell|<strong|Code
assembleur de base équivalent>>>|<row|<cell|push
<math|R>>|<cell|<math|G\<leftarrow\>G-2 ;mem<around*|(|G|)>\<leftarrow\>R
@@ -183,36 +173,37 @@
<\references>
<\collection>
<associate|auto-1|<tuple|1|1>>
- <associate|auto-10|<tuple|2|1>>
- <associate|auto-11|<tuple|3|2>>
- <associate|auto-12|<tuple|4|3>>
- <associate|auto-13|<tuple|5|?>>
- <associate|auto-14|<tuple|4|?>>
- <associate|auto-15|<tuple|3|?>>
+ <associate|auto-10|<tuple|4|2>>
+ <associate|auto-11|<tuple|5|2>>
+ <associate|auto-12|<tuple|4|2>>
+ <associate|auto-13|<tuple|3|3>>
+ <associate|auto-14|<tuple|4|4>>
+ <associate|auto-15|<tuple|4|?>>
<associate|auto-16|<tuple|4|?>>
+ <associate|auto-17|<tuple|5|?>>
<associate|auto-2|<tuple|2|1>>
- <associate|auto-3|<tuple|2.1|1>>
- <associate|auto-4|<tuple|1|1>>
- <associate|auto-5|<tuple|2.2|1>>
- <associate|auto-6|<tuple|2|1>>
- <associate|auto-7|<tuple|3|1>>
- <associate|auto-8|<tuple|3.1|1>>
- <associate|auto-9|<tuple|1|1>>
+ <associate|auto-3|<tuple|1|2>>
+ <associate|auto-4|<tuple|2|2>>
+ <associate|auto-5|<tuple|3|2>>
+ <associate|auto-6|<tuple|3.1|2>>
+ <associate|auto-7|<tuple|1|2>>
+ <associate|auto-8|<tuple|2|2>>
+ <associate|auto-9|<tuple|3|2>>
</collection>
</references>
<\auxiliary>
<\collection>
<\associate|table>
- <tuple|normal|Memory map|<pageref|auto-4>>
+ <tuple|normal|Memory map|<pageref|auto-3>>
- <tuple|normal|Memory map|<pageref|auto-6>>
+ <tuple|normal|Addresses MMIO|<pageref|auto-4>>
<tuple|normal|Instructions reconnues par le
- microproceseur|<pageref|auto-15>>
+ microproceseur|<pageref|auto-13>>
<tuple|normal|Instructions supplémentaires (produites par
- l'assembleur)|<pageref|auto-16>>
+ l'assembleur)|<pageref|auto-14>>
</associate>
<\associate|toc>
<vspace*|1fn><with|font-series|<quote|bold>|math-font-series|<quote|bold>|Registres>
@@ -223,45 +214,37 @@
<datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
<no-break><pageref|auto-2><vspace|0.5fn>
- <with|par-left|<quote|1.5fn>|Modèle simple
- <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
- <no-break><pageref|auto-3>>
-
- <with|par-left|<quote|1.5fn>|Modèle avec affichage bitmapé
- <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
- <no-break><pageref|auto-5>>
-
<vspace*|1fn><with|font-series|<quote|bold>|math-font-series|<quote|bold>|Jeu
d'instruction> <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
- <no-break><pageref|auto-7><vspace|0.5fn>
+ <no-break><pageref|auto-5><vspace|0.5fn>
<with|par-left|<quote|1.5fn>|Types d'instructions
<datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
- <no-break><pageref|auto-8>>
+ <no-break><pageref|auto-6>>
<with|par-left|<quote|6fn>|Format de base
<datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
- <no-break><pageref|auto-9><vspace|0.15fn>>
+ <no-break><pageref|auto-7><vspace|0.15fn>>
<with|par-left|<quote|6fn>|Format <with|mode|<quote|math>|R>
<datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
- <no-break><pageref|auto-10><vspace|0.15fn>>
+ <no-break><pageref|auto-8><vspace|0.15fn>>
<with|par-left|<quote|6fn>|Format <with|mode|<quote|math>|I>
<datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
- <no-break><pageref|auto-11><vspace|0.15fn>>
+ <no-break><pageref|auto-9><vspace|0.15fn>>
<with|par-left|<quote|6fn>|Format K
<datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
- <no-break><pageref|auto-12><vspace|0.15fn>>
+ <no-break><pageref|auto-10><vspace|0.15fn>>
<with|par-left|<quote|6fn>|Format <with|mode|<quote|math>|J>
<datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
- <no-break><pageref|auto-13><vspace|0.15fn>>
+ <no-break><pageref|auto-11><vspace|0.15fn>>
<vspace*|1fn><with|font-series|<quote|bold>|math-font-series|<quote|bold>|Tableau
d'instructions> <datoms|<macro|x|<repeat|<arg|x>|<with|font-series|medium|<with|font-size|1|<space|0.2fn>.<space|0.2fn>>>>>|<htab|5mm>>
- <no-break><pageref|auto-14><vspace|0.5fn>
+ <no-break><pageref|auto-12><vspace|0.5fn>
</associate>
</collection>
</auxiliary> \ No newline at end of file