From f7c5d7fdcc759f29520caa853ede74c54c777c6f Mon Sep 17 00:00:00 2001
From: Lucas DEBACKER <l23debac@fl-tp-br-607.imta.fr>
Date: Wed, 12 Feb 2025 12:10:03 +0100
Subject: [PATCH] TP Fini

---
 docs/compte-rendu.md     | 20 ++++++-------
 src/automate.vhd         | 62 +++++++++++++++++++++++++++++++++++++---
 src/compteur_modulo6.vhd | 14 ++++++---
 src/mux6_1.vhd           | 19 ++++++++++--
 4 files changed, 95 insertions(+), 20 deletions(-)

diff --git a/docs/compte-rendu.md b/docs/compte-rendu.md
index bcc655d..7736906 100644
--- a/docs/compte-rendu.md
+++ b/docs/compte-rendu.md
@@ -3,34 +3,34 @@
 Énoncé du TP : [https://tp-vhdl.gitlab-pages.imt-atlantique.fr/loto/](https://tp-vhdl.gitlab-pages.imt-atlantique.fr/loto/)
 
 ## Question Loto 1 : Quels sont les signaux à renseigner dans la liste de sensibilité (si vous utilisez un process explicite) ?
-
+Tous les signaux qui vont être en entrée du multiplexer (ici les 6 inputs et le signal trois bit qui les contrôle I_sel)
 
 ## Question Loto 2 : Que se passe-t-il si le test est incomplet, c’est-à-dire s’il ne couvre pas toutes les combinaisons d’entrées du module ? Est-ce grave ?
-
+Non on ne teste pas toutes les combinaisons possibles car il y en a 2^39, on teste donc celles qui ont du sens (les modifications de Sel uniquement). Ce n’est donc pas grave de ne pas tout tester
 
 ## Question Loto 3 : Ce test est-il concluant ? Est-il suffisant pour valider le module ? Justifiez.
-
+Le test est concluant : le changement de valeur de I_sel déclenche une mise à jour de la valeur de S, qui prend les bonnes valeurs d’entrées suivant la valeur de I_Sel. Cela est suffisant pour valider le module car on parcourt l’ensemble des valeurs de Sel possible et on vérifie les valeurs de sortie correspondante.
 
 ## Question Loto 4 : Quel(s) signal(aux) doit on renseigner dans la liste de sensibilité de ce processus séquentiel ? Pourquoi ?
-
+La liste de signaux de sensibilité indique les signaux qui doivent faire bouger les valeurs : sur un processus synchrone, il faut mettre l’horloge, car les changements de valeurs se font sur les fronts montants, et le rst, car dès que rst = 1, il faut que la valeur se mette à 0.
 
 ## Question Loto 5 : Que se passe-t-il si le test est incomplet, c’est-à-dire s’il ne couvre pas toutes les combinaisons d’entrées du module ? Est-ce grave ici ?
-
+On ne teste pas toutes les combinaisons d’entrée du module, on cherche surtout à valider le comportement du compteur. Tant que les changements de valeur se font au bon endroit (front montant d’horloge/rst) et que le compteur s’arrête à la bonne valeur (5 ici), alors le comportement est validé.
 
 ## Question Loto 6 : Ce test est-il concluant ? Est-il suffisant pour valider le module ? Justifiez.
-
+Le test est concluant : le compteur compte de 0 à 5 en boucle, se réinitialise à 0 quand I_rst = 1 et se bloque à la valeur enregistrée lorsque I_block = 1
 
 ## Question Loto 7 : Combien de processus avez-vous décris ?
-
+Nous avons décrit un seul processus
 
 ## Question Loto 8 : De quel(s) type(s) sont-ils
-
+Il s'agit d'un processus séquentiel : l'état actuel dépend de l'état précédent
 
 ## Question Loto 9 : Serait-il possible de décrire cette machine d'état de manière différente, en terme de nombre et de type de process ?
-
+pas en SEH
 
 ## Question Loto 10 : Ce test est-il concluant ? Justifiez.
-
+Le test est concluant : les états changent sur les fronts montant d'horloge et sont les états attendues par rapport à l'état précédent. A la fin, les états st_end_red et st_end_green alternent et dure autant de temps chacun, traduisant le clignotement des deux leds rouge et verte
 
 ## Question Loto 11 : Le circuit inféré par l’outil est-il conforme à l’attendu ? Sinon, en quoi diffère-t-il et est-ce lié à une erreur de description VHDL ?
 
diff --git a/src/automate.vhd b/src/automate.vhd
index 1ccb931..4edd7c1 100644
--- a/src/automate.vhd
+++ b/src/automate.vhd
@@ -36,10 +36,10 @@ begin
     process (I_clk, I_rst)
     begin
         if(I_rst = '1')then
-            __BLANK_TO_FILL__
+            SR_STATE <= st_wait_success;
         elsif rising_edge(I_clk)then
             case SR_STATE is
-                case SR_STATE is
+                --case SR_STATE is
 
                 when st_wait_success =>
                     O_l_green        <= '1';
@@ -50,9 +50,63 @@ begin
                         SR_STATE <= st_counting;
                     end if;
 
-                    when __BLANK_TO_FILL__
+                when st_counting =>
+                    O_l_green        <= '0';
+                    O_l_red        <= '0';
+                    O_counting       <= '1';
+                    O_store <= '0';
+                    if I_button = '0' then
+                        SR_STATE <= st_compar;
+                    end if;
+                   
+                when st_compar =>
+                    O_l_green        <= '0';
+                    O_l_red        <= '0';
+                    O_counting       <= '0';
+                    O_store <= '0';
+                    if I_invalide = '0' then
+                        SR_STATE <= st_store;
+                    else 
+                        SR_STATE <= st_wait_failed;
+                    end if;
+                    
+                when st_store =>
+                    O_l_green        <= '0';
+                    O_l_red        <= '0';
+                    O_counting       <= '0';
+                    O_store <= '1';
+                    if I_end = '0' then
+                        SR_STATE <= st_wait_success;
+                    else 
+                        SR_STATE <= st_end_red;
+                    end if;
 
-                    __BLANK_TO_FILL__
+                when st_end_red =>
+                    O_l_green        <= '0';
+                    O_l_red        <= '1';
+                    O_counting       <= '0';
+                    O_store <= '0';
+                    if I_clk_display = '1' then
+                        SR_STATE <= st_end_green;
+                    end if;
+                    
+                when st_end_green =>
+                    O_l_green        <= '1';
+                    O_l_red        <= '0';
+                    O_counting       <= '0';
+                    O_store <= '0';
+                    if I_clk_display = '0' then
+                        SR_STATE <= st_end_red;
+                    end if;
+                    
+                when st_wait_failed =>
+                    O_l_green        <= '0';
+                    O_l_red        <= '1';
+                    O_counting       <= '0';
+                    O_store <= '0';
+                    if I_button = '1' then
+                        SR_STATE <= st_counting;
+                    end if;
 
             end case;
         end if;
diff --git a/src/compteur_modulo6.vhd b/src/compteur_modulo6.vhd
index 7962a90..3b53d28 100644
--- a/src/compteur_modulo6.vhd
+++ b/src/compteur_modulo6.vhd
@@ -20,14 +20,20 @@ architecture modulo6_a of compteur_modulo6 is
 
 begin
 
-    process (_BLANK_)
+    mod6 : process (I_rst, I_clk)
     begin
         if I_rst = '1' then
-            _BLANK_
+            SR_Counter <= "000";
         elsif rising_edge(I_clk) then
-            _BLANK_
+            if I_block = '0' then
+                if SR_Counter = "101" then
+                    SR_Counter <= "000";
+                else
+                    SR_Counter <= SR_Counter + 1;
+                end if;
+            end if;
         end if;
-    end process;
+    end process mod6;
 
     O_CounterMod6 <= std_logic_vector(SR_Counter);
 
diff --git a/src/mux6_1.vhd b/src/mux6_1.vhd
index a689bef..9bd6c6b 100644
--- a/src/mux6_1.vhd
+++ b/src/mux6_1.vhd
@@ -20,8 +20,23 @@ end mux6_1;
 architecture a_mux6_1 of mux6_1 is
 begin
 
-__BLANK_TO_FILL__
-
+process(I_0, I_1, I_2, I_3, I_4, I_5, I_sel)
+begin
+    case I_Sel is
+        when "000"=>
+            O_mux6<=I_0;
+        when "001"=>
+            O_mux6<=I_1;
+        when "010"=>
+            O_mux6<=I_2;
+        when "011"=>
+            O_mux6<=I_3;
+        when "100"=>
+            O_mux6<=I_4;
+        when others=>
+            O_mux6<=I_5;
+    end case;
+end process;
 
 
 end a_mux6_1;
-- 
GitLab