Changes

Talk:Langage VHDL

4,178 bytes added, 12:52, 13 September 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
=> avancement projet : en cours
=> Date de modification : 0913/0809/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 + attention au raisonnement de la valeur hexadécimal que vous voulez la convertir en binaire, celle-ci prend 4 digit et non pas 1.
 
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
 
[[File: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;
 
 
''' Correction '''
 
Merci aux réponses de Rick sur la mailing list de Fixme (voir la date du 29 Août 2016) - pour résoudre cette histoire, il fallait aussi synchroniser le signal de sortie (nouvelle clock) à la clock du système, dont voici le code
 
--------------
-- compteur --
--------------
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 rising_edge (CLK_1_8MHZ) then
if (compteur_num_f <= VAL_MAX_CMPT_DIV_2) then
clk_2Hz <= '0';
else
clk_2Hz <= '1';
end if;
end if;
end process;
clk_2Hz_SIM <= clk_2Hz
952
edits