diff options
author | Alex AUVOLAT <alex.auvolat@ens.fr> | 2014-01-07 15:51:01 +0100 |
---|---|---|
committer | Alex AUVOLAT <alex.auvolat@ens.fr> | 2014-01-07 15:51:01 +0100 |
commit | 176cc04414d44b9eebdc9627c99f9b6e5e92ba98 (patch) | |
tree | 1a3b2e736bb57e05efe43f7e308eaaca8b3e543b | |
parent | d9f8744ea219fb04057059cdcbf7162534c63852 (diff) | |
download | SystDigit-Projet-176cc04414d44b9eebdc9627c99f9b6e5e92ba98.tar.gz SystDigit-Projet-176cc04414d44b9eebdc9627c99f9b6e5e92ba98.zip |
Document ; add hlt instruction ; make monitor faster.
-rw-r--r-- | cpu/cpu.ml | 6 | ||||
-rw-r--r-- | monitor/mon.c | 16 | ||||
-rw-r--r-- | plan_micro.pdf | bin | 76886 -> 79404 bytes | |||
-rw-r--r-- | plan_micro.tm | 127 |
4 files changed, 75 insertions, 74 deletions
@@ -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 Binary files differindex 14bf881..f1caa0f 100644 --- a/plan_micro.pdf +++ b/plan_micro.pdf 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 |