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