Difference between revisions of "Talk:Langage VHDL"

From Fixme.ch
Jump to: navigation, search
Line 56: Line 56:
  
 
code 1:  
 
code 1:  
CMPT_2Hz: process (CLK_1_8MHZ)
+
CMPT_2Hz: process (CLK_1_8MHZ)
begin  
+
begin  
-- détection d'évenement sur flanc montant --  
+
-- détection d'évenement sur flanc montant --  
if(CLK_1_8MHZ'event and CLK_1_8MHZ = '1') then
+
if(CLK_1_8MHZ'event and CLK_1_8MHZ = '1') then
-- remise à zéro du compteur si atteint la valeur max ou plus grand --  
+
-- remise à zéro du compteur si atteint la valeur max ou plus grand --  
if (compteur_num >= VAL_MAX_COMPTEUR_2HZ) then   
+
if (compteur_num >= VAL_MAX_COMPTEUR_2HZ) then   
compteur_num <= (others => '0');
+
compteur_num <= (others => '0');
else  
+
else  
compteur_num <= compteur_num + 1;
+
compteur_num <= compteur_num + 1;
end if;   
+
end if;   
end if;  
+
end if;  
end process;
+
end process;
-----------------------------------------
+
-- Horloge 2Hz rapport cyclique de 50% --  
+
-----------------------------------------
-----------------------------------------
+
-- Horloge 2Hz rapport cyclique de 50% --  
clk_2Hz <= '0' when compteur_num <= VAL_MAX_CMPT_DIV_2 else  
+
-----------------------------------------
              '1';                 
+
clk_2Hz <= '0' when compteur_num <= VAL_MAX_CMPT_DIV_2 else  
        clk_2Hz_SIM <= clk_2Hz;
+
            '1';                 
 +
clk_2Hz_SIM <= clk_2Hz;
  
 
code 2:  
 
code 2:  
CMPT_ETAT_FUTUR_2HZ : process(compteur_num_p)
+
CMPT_ETAT_FUTUR_2HZ : process(compteur_num_p)
begin  
+
begin  
if (compteur_num_p >= VAL_MAX_COMPTEUR_2HZ) then
+
if (compteur_num_p >= VAL_MAX_COMPTEUR_2HZ) then
compteur_num_f <= (others => '0');
+
compteur_num_f <= (others => '0');
else  
+
else  
compteur_num_f <= compteur_num_p + 1;   
+
compteur_num_f <= compteur_num_p + 1;   
end if;  
+
end if;  
end process;  
+
end process;  
CMPT_ETAT_PRESENT_2HZ : process(CLK_1_8MHZ)
+
CMPT_ETAT_PRESENT_2HZ : process(CLK_1_8MHZ)
begin  
+
begin  
if((CLK_1_8MHZ'event) and (CLK_1_8MHZ = '1')) then  
+
if((CLK_1_8MHZ'event) and (CLK_1_8MHZ = '1')) then  
compteur_num_p <= compteur_num_f;
+
compteur_num_p <= compteur_num_f;
end if;  
+
end if;  
end process;  
+
end process;  
-----------------------------------------
+
-----------------------------------------
-- Horloge 2Hz rapport cyclique de 50% --  
+
-- Horloge 2Hz rapport cyclique de 50% --  
-----------------------------------------
+
-----------------------------------------
CLK_2HZ_50P : process (compteur_num_p)  
+
CLK_2HZ_50P : process (compteur_num_p)  
begin  
+
begin  
if (compteur_num_p <= VAL_MAX_CMPT_DIV_2) then
+
  if (compteur_num_p <= VAL_MAX_CMPT_DIV_2) then
clk_2Hz <= '0';
+
clk_2Hz <= '0';
else  
+
else  
clk_2Hz <= '1';  
+
clk_2Hz <= '1';  
end if;  
+
end if;  
end process;
+
end process;
clk_2Hz_SIM <= clk_2Hz;
+
clk_2Hz_SIM <= clk_2Hz;

Revision as of 23:13, 24 August 2016

  • PROJET GESTION FEU

=> avancement projet : en cours

=> problème rencontré :

1) sur la gestion des compteur, j'ai des glitch sur le signal que je crée à partir d'un compteur et je ne comprend pas l'erreur que je fais dans mon code. Pour le code, je l'ai mis sur le git (code VHDL) sous main_gestion_feux.vhd et antirebond.vhd

Gestion feux glitch.jpg

  • PROJET 7 Segment Display

=> avancement projet : DONE

=> problème rencontré : 1) erreur de lecture ou retranscription de la table de vérité donc erreurs dans les équations

2) remarqué aussi qu'on ne peut pas passer de la schématique en VHDL par contre le contraire oui, d'un côté c'est évident car la synthétisation compile le code VHDL en schéma logique fait de portes, hmm

=> Date de modification : 28/07/2016

1) la table de vérité est juste, mais erreur dans la transcription schématique et dans les équations.

1a) correction :

Fa : A /B CD + A /(BCD) + /(AB) C /D + AB /C D

Fb : A /B C /D + /A BC + ABD + /A CD

Fd : /(AB) C /D + ABC + /A B /C D + A /(BCD)

Fg : /(AB) CD + ABC /D + /(BCD)

  • PROJET JONGLEUR

=> avancement projet : en cours

=> Date de modification : 24/08/2016

=> problème rencontré :

1) Je n'arrive pas à trouver comment on peut insérer une valeur à constante lors de l'initialisation de celle-ci, je m'explique : j'aimerai utiliser une constante de 20bits (taille) donc un std_logic_vector, mais ça m’embête d'écrire 20bit car ca peut être source d'erreur ou si j'aimerai changer facilement, je peux par vraiment taper des 1 et des 0, donc j'ai essayé ces solutions d'écriture mais rien y...

constant VAL_X : std_logic_vector (19 downto 0) := x"EAE34"                       -- ne marche pas 
constant VAL_X : std_logic_vector (19 downto 0) := to_stdlogicvector(x"EAE34");   -- ne marche pas 
constant VAL_X : std_logic_vector (19 downto 0) := to_stdlogicvector(x"EAE34");   -- ne marche pas 
constant VAL_X : std_logic_vector (19 downto 0) := std_logic_vector(to_unsigned(x"EAE34",VAL_X'length)); -- ne marche pas

Correction:

Merci pour les réponses de Rick et de Micheal sur la mailing liste de Fixme, voici sur Quartus, la déclaration qui fonctionne :

constant VAL_X : std_logic_vector(19 downto 0) := To_stdlogicvector(X"EAE34");

attention, comme le langage VHDL est typé, la constante qui sera comparée par exemple à une variable, celle-ci devra être de la même taille sinon ceci provoquera des erreurs.

2) Réalisation d'un compteur avec gestion d'un nouveau signal d'horloge, mais lors de la simulation, j'ai des glitches qui sont là de manière périodique et j'ai écrit de différente manières le compteur toujours le meme résultats

Glitch Compteur.jpg

code 1:

CMPT_2Hz: process (CLK_1_8MHZ)
	begin 
	-- détection d'évenement sur flanc montant -- 
	if(CLK_1_8MHZ'event and CLK_1_8MHZ = '1') then
		-- remise à zéro du compteur si atteint la valeur max ou plus grand -- 
		if (compteur_num >= VAL_MAX_COMPTEUR_2HZ) then   
			compteur_num <= (others => '0');
		else 
			compteur_num <= compteur_num + 1;
		end if;   
	end if; 
end process;
	
-----------------------------------------
-- Horloge 2Hz rapport cyclique de 50% -- 
-----------------------------------------
clk_2Hz <= '0' when compteur_num <= VAL_MAX_CMPT_DIV_2 else 
           '1';                
clk_2Hz_SIM <= clk_2Hz;

code 2:

CMPT_ETAT_FUTUR_2HZ : process(compteur_num_p)
	begin 
		if (compteur_num_p >= VAL_MAX_COMPTEUR_2HZ) then
			compteur_num_f <= (others => '0');
		else 
			compteur_num_f <= compteur_num_p + 1;  
		end if; 
end process; 
CMPT_ETAT_PRESENT_2HZ : process(CLK_1_8MHZ)
	begin 
		if((CLK_1_8MHZ'event) and (CLK_1_8MHZ = '1')) then 
			compteur_num_p <= compteur_num_f;
		end if; 
end process; 
-----------------------------------------
-- Horloge 2Hz rapport cyclique de 50% -- 
-----------------------------------------
CLK_2HZ_50P : process (compteur_num_p) 
	begin 
 		if (compteur_num_p <= VAL_MAX_CMPT_DIV_2) then
			clk_2Hz <= '0';
		else 
			clk_2Hz <= '1'; 
		end if; 
end process; 	
clk_2Hz_SIM <= clk_2Hz;