Répondre à la discussion
Affichage des résultats 1 à 27 sur 27

Problème signal sortie FPGA Lattice Diamond



  1. #1
    portoe

    Problème signal sortie FPGA Lattice Diamond

    Bonjour à tous,

    Je suis étudiant en IUT GEII et j'ai durant mon stage en entreprise, une mission m'a été confiée.

    Pour le moment j'aimerais générer un signal grâce à une carte Lattice qui m'a été fourni. Le signal a une durée de 20ms avec quelques particularité, je le génère avec un compteur. Je m'explique le compteur compte en permanence et en fonction de la sortie de mon compteur, mon signal prend la valeur 0 ou 1. Ca fonctionne assez bien, j'ai juste un problème, mon signal était inversé par rapport au signal que je voulais obtenir, j'ai donc regardé si j'avais pas fait une erreur et par la suite au lieu de compter pendant 20ms, j'ai compté sur un lapse de temps plus cours et je me suis rendu compte que mon signal était bon au début et qu'arrivé vers 2.7ms le signal s'inverse sans aucune raison apparente.

    Personne dans ma boite ne peut m'aider c'est pour ca que je viens ici, si certains d'entre vous connaisse un peu le logiciel et ont un début de piste pour résoudre ce mystère je suis preneur.

    Bonne fin de journée

    PS: Je ne sais pas si le préfixe est le bon

    -----


  2. Publicité
  3. #2
    jiherve

    Re : Problème signal sortie FPGA Lattice Diamond

    Bonsoir,
    pour pouvoir répondre il faudrait le code VHDL (i presume) du bidule!
    JR
    l'électronique c'est pas du vaudou!

  4. #3
    portoe

    Re : Problème signal sortie FPGA Lattice Diamond

    Bonjour,
    J'ai réussi à résoudre mon problème seul, en effet j'ai fais quelques erreurs dans le code.

    J'ai cependant un autre problème, voilà un extrait de mon programme:

    Code:
    Elsif (CT<60822) then
    			s_compt<='0';
    		Elsif (CT<68738) then
    			s_compt<='1';		--$8
    		Elsif (CT<69388) then
    			s_compt<='0';
    		Elsif (CT<77304) then
    			s_compt<='1';		--$9
    		Elsif (CT<77954) then
    			s_compt<='0';
    		Elsif (CT<85870) then
    			s_compt<='1';		--$10
    Comme vous l'aurez remarqué, je répète toujours la même chose, je voulais donc optimiser ce programme et générer mon signal avec une simple boucle. J'aimerais des conseils car j'ai essayé de le faire avec une boucle for. Voilà mon code actuel malheureusement je n'arrive pas à le compiler

    Code:
    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.std_logic_arith.all;
    use ieee.std_logic_unsigned.all;
    --*****************************************************************************************************************************************************************--
    -- Ce programme permet de générer un signal de période 64s
    -- - Entrée: Horloge (133MHz)
    -- - Sortie: Signal de synchronisation (15,625 kHz)
    -- Le compteur compte en permanence, nous changeons seulement l'état de la sortie en fonction du comptage.
    --*****************************************************************************************************************************************************************--
    entity compteur_60hz is
    port(CK: in std_logic;-- entrée horloge
         CT: out integer range 0 to 5354235;-- definition du modulo du compteur
    	 S_compt: out bit);
    end;
    architecture Combinatoire of compteur_60hz is
    begin
    
    Process(CK)
    Begin
    	      If Rising_edge(CK) then-- incrementation sur front montant de l'horloge
    		CT <= CT+1;-- incrementation de la valeur de CT
    	End if;	
    	If(S_compt='1') then
    		CT<=0;
    		FOR CT in 0 to 625 LOOP
    			S_compt<='0';
    		END LOOP ;
    	End If;
    	If(S_compt='0') then
    		CT<=0;
    		FOR CT in 0 to 7916 LOOP
    			S_compt<='1';
    		END LOOP ;
    	End If;
    	
    End Process;
    
    End Combinatoire;
    Désolé pour l'affichage qui n'est pas terrible.
    Dernière modification par Antoane ; 11/05/2016 à 10h49. Motif: Ajout balises [code]

  5. #4
    jiherve

    Re : Problème signal sortie FPGA Lattice Diamond

    Bonjour,
    c'est un peu confus mais:
    CT: out integer range 0 to 5354235 déclare un entier codé sur n bits tel que 2^n >= 5354235 en aucun cas cela n'assure le recyclage du compteur.
    S_compt='1' est illégal car S_compt est déclaré en sortie donc soit un signal ou variable intermédiaire soit INOUT
    Mais vues les valeurs ce que tu cherches à faire c'est une base de temps TV 625 lignes/50Hz
    Comme 133MHz/15625 Hz vaut 8512 il suffit donc de diviser par ce nombre
    Code:
    	      
       If Rising_edge(CK) then-- incrementation sur front montant de l'horloge
         if CT < 8511 then
    	CT <= CT+1;-- incrementation de la valeur de CT
         else
            CT <= 0;
         end if;
       End if;
    ensuite pour la sortie:
    Code:
       if CT = 8500 then; exemple
         S_compt <= '1';
       elsif CT = 8511 then
         S_compt <= '0';
       end if;
    S_compt sera un pulse à '1' qui durera 12 coups à la frequence de 15625 Hz
    Si S_compt doit etre un signal à 20 ms alors soit tu divises par 2660000 soit tu divises par 4256 et fais un autre compteur qui divise par 625 cela procurera l'entrelacement s'il s'agit bien de TV.
    Dernière remarque il est indispensable de rajouter un signal de reset pour initialiser les compteurs et autre signaux.
    JR
    l'électronique c'est pas du vaudou!

  6. #5
    portoe

    Re : Problème signal sortie FPGA Lattice Diamond

    Merci jiherve pour ta réponse très rapide.

    Quand tu parles de recyclage, tu veux parler d'une remise à zéro du compteur?

    Oui c'est tout à fait les caractéristiques du signal vidéo composite extraites de la norme STANAG 3350 Classe B que j'essaie de générer.

    Merci beaucoup de ton aide, je n'avais pas du tout pensé à cette solution alors que c'est de loin la plus simple.

  7. A voir en vidéo sur Futura
  8. #6
    jiherve

    Re : Problème signal sortie FPGA Lattice Diamond

    Bonsoir
    Pour faire une vidéo entrelacée il faut un signal à 2*FH = 31250 Hz. Le compteur utilisé pour çà te permettra de générer tous les signaux lignes.
    Ayant déjà commis pas mal de ces générateurs je pourrais te guider.
    JR
    l'électronique c'est pas du vaudou!

  9. Publicité
  10. #7
    portoe

    Re : Problème signal sortie FPGA Lattice Diamond

    Bonjour,

    Merci de me proposer ton aide.

    En tout mon signal fait 40ms, 20ms pour chaque demi image, il y a par contre une différence pour les bits en début du signal (ceux pour synchroniser les images). Je ne sais pas si tu vois ce que je veux dire.

    J'ai fais un code avec 2 boucles while malheureusement je n'arrive pas a le compiler a cause d'un probleme au niveau des boucles while

    Code:
    architecture Combinatoire of compteur_60hz is
    begin
    
    Process(CK)
    Begin
    	If Rising_edge(CK) then-- incrementation sur front montant de l'horloge
    		if CT < 8511 then
    			CT <= CT+1;-- incrementation de la valeur de CT
    		else
    			CT <= 0;
    			Nb <= Nb+1;
    		end if;
    	End if;
    	loop_label1 : while (Nb < 5) LOOP
    		If CT < 315 then
    			S_compt <= '0';
    		Elsif CT < 4256 then
    			S_compt <= '1';
    		Elsif CT < 4571 then
    			S_compt <= '0';
    		Elsif CT < 8511 then
    			S_compt <= '1';
    		End if;
    	End LOOP loop_label1;
    	loop2: FOR Nb in 5 to 50 LOOP
    		If CT <630 then
    			S_compt <= '0';
    		elsif CT < 8511 then
    			S_compt <= '1';
    		End if;
    	END LOOP loop2;
    	If Nb=51 then
    		Nb<=0;
    	End if;
    End Process;
    
    End Combinatoire;

  11. #8
    jiherve

    Re : Problème signal sortie FPGA Lattice Diamond

    Bonsoir,
    je ne comprends pas ce que tu veux faire mais ici Nb est "bricolé" par un process synchrone concurremment à deux process asynchrone le pauvre compilo n'y comprendra rien!
    Pour faire une base de temps TV il faut faire deux compteurs :
    un qui sert à générer les timing ligne sa période propre est la fréquence ligne :15625Hz c'est le compteur pixels
    un qui sert à compter les lignes sa période propre est la fréquence images : 25Hz c'est le compteur lignes
    Pour faire propre ce second compteur possède la mème horloge que le premier mais le comptage est autorisé par un pulse de fréquence 2x15625 ayant une largeur d'un coup d'horloge qui est générée à partir du compteur lignes
    Un fois que l'on a ces deux compteurs alors il est possible de générer les subtilités du signal de synchronisation STANAG.
    Je te laisse chercher un peu.
    JR
    l'électronique c'est pas du vaudou!

  12. #9
    jiherve

    Re : Problème signal sortie FPGA Lattice Diamond

    Re
    comme je serais largement absent cette semaine pour motif de randonnées je suis bon et voila un bout de code qui bien emballé doit fonctionner
    le "zero" en ligne est le front descendant de la synchro ligne idem pour la trame.
    sauf les compteurs qui seront déclarés en integer le reste c'est du std_logic
    Code:
     constant       clk_pro  :integer := 133;-- frequence en MHz
     constant       nbpixt   :integer := 64*clk_pro;-- durée ligne 64µs
     constant       nbpixs   :integer := 4.7*clk_pro;-- durée synchro ligne 4,7µs
     constant       nbpixb   :integer := 9.7*clk_pro;-- debut video en ligne
     constant       nbpixe   :integer := (9.7+ 52)*clk_pro;-- fin video en ligne la durée est de 52µS
     constant       nblint   :integer := 625;-- nombre de lignes l'unité est la demi ligne 
     constant       nblins   :integer := 5;-- durée synchro trame et des periodes d’égalisation  l'unité est la demi ligne 
     constant       nblinb   :integer := 45;-- debut video en trame l'unité est la demi ligne 
     constant       nbline   :integer := 620;-- fin vidéo en trame l'unité est la demi ligne 
    
    VIDEO_GENERATOR: process (mclock,mclrn)
      begin
        if (mclrn = '0') then
          sl          <= '0';-- synchro ligne
          st          <= '0';-- synchro trame
          blk         <= '0';-- blanking ligne+trame
          blkv        <= '0';-- blanking trame
          fl          <= '0';-- parité trame
          cs          <= '0';-- synchro composite
          egal        <= '0';-- egalisation
          egalt       <= '0';
          cptpix      <= nbpixt - 10;-- compteur pixel
          cptlin      <= nblint - 10;-- compteur ligne
                
        elsif rising_edge (mclock) then
    
          if (cptpix = nbpixs ) then
            sl <= '0';
            cptpix <= cptpix+1;
          elsif (cptpix < nbpixt ) then
            cptpix <= cptpix+1;
          else
            sl <= '1';
            cptpix <= 1;--1+modu/20;
          end if;
    
          if (cptpix = nbpixt) or (cptpix = nbpixt/2) then
            if (cptlin = nblins) then
              st <= '0';
              cptlin <= cptlin+1;
            elsif (cptlin <nblint) then
              cptlin <= cptlin+1;
            else
              cptlin <= 1 ;
              st <= '1';
              fl <= not fl;
              end if;
          end if;
    
          if (cptpix = nbpixt) or (cptpix = nbpixt/2) then
            if (cptlin = 1 )  then
              blkv <='0';
            elsif (cptlin = nblinb ) then
              blkv <='1';
            elsif (cptlin = nbline ) then
              blkv <='0';
            end if;
          end if;
    
          if (cptpix >= nbpixb) and (cptpix <= nbpixe) and (blkv  = '1') then
            blk <= '1';
          else
            blk <= '0';
          end if;
    
          if (cptpix = nbpixt) or (cptpix = nbpixt/2) then
            egalt <= egal;
            if (cptlin >= nblint - nblins -1) or (cptlin < 2*nblins -1 ) then
              egal <= '1';
            else
              egal <= '0';
            end if;
          end if;
    
          if ((cptpix = nbpixt) or ((egal = '1') and (cptpix = nbpixt/2))) and cs = '0' then
             cs <= '1';
          elsif (egalt = '0') then
            if (cptpix = nbpixs) then
              cs <= '0';
            end if;
          elsif (st = '1') then
            if ((cptpix = nbpixt/2 - nbpixs) or (cptpix = nbpixt - nbpixs)) then
              cs <= '0';
            end if;
          elsif((cptpix = nbpixs/2) or (cptpix = nbpixt/2 + nbpixs/2)) then
              cs <= '0';
          end if;
        end if;
      end process VIDEO_GENERATOR;
    essaye de comprendre comment cela fonctionne.
    JR
    l'électronique c'est pas du vaudou!

  13. #10
    portoe

    Re : Problème signal sortie FPGA Lattice Diamond

    Bonjour

    Merci pour ton aide, je vais comprendre comment tu as fais.

    Bonne randonnée

  14. #11
    portoe

    Re : Problème signal sortie FPGA Lattice Diamond

    Bonjour Jiherve,

    J'ai essayé de te contacter par MP mais je ne suis pas à l'aise avec les MP

    J'ai essayé de digérer ton programme cependant j'aimerais que tu m'explique quelques petites choses.

    Tout d'abord j'ai compris qu'au début tu faisais l'initialisation mais je ne sais pas de quoi dépend mclrn.

    J'aimerais aussi savoir ce qu'est le blanking.

    Je ne sais pas ce que représente le 52 et le 9,7 dans le calcul des compteurs nbpixe et nbpixb.

    Je te remercie encore de ton aide

    Cordialement

    Portoe

  15. #12
    jiherve

    Re : Problème signal sortie FPGA Lattice Diamond

    Bonjour
    Le bout de code que je t'ai donné provient d'un vieux test bench que j'ai écrit il y a des années, il manque donc tout l'emballage, declaration de l'entity, de l'architecture et de la plupart des signaux ou variables et ce n'est peut etre pas optimum pour fonctionner à 130MHz
    Les signaux provenant de l'exterieur donc des IN sont mclrn(un reset actif à l'état bas) et mclock(ton horloge) pour les sortie à toi de choisir parmi tous les signaux genérés.
    Le blanking ici est mal nommé puisque c'est normalement la partie "éteinte" de la vidéo , retours ligne et trame , mais la c'est le complément de cet état donc la partie allumée quelque fois dénommée 'inscription' , en STANAG B cela représente 52µS/ligne durant les 575 lignes dites visibles, regardes le standard.
    Le 9,7 c'est censé être la durée de la synchro ligne plus le back porch mais à l’époque j'avais du vouloir faire une manip, il faut utiliser 10,4 (4,7 + 5,7)
    JR
    l'électronique c'est pas du vaudou!

  16. Publicité
  17. #13
    portoe

    Re : Problème signal sortie FPGA Lattice Diamond

    D'accord merci pour le coup de main.

    As-tu déjà utilisé le logiciel Lattice Diamond? J'ai quelques soucis avec

  18. #14
    jiherve

    Re : Problème signal sortie FPGA Lattice Diamond

    bonjour,
    Non je ne connais (mal) que les versions antérieures.
    JR
    l'électronique c'est pas du vaudou!

  19. #15
    portoe

    Re : Problème signal sortie FPGA Lattice Diamond

    Bonjour,

    D'accord, serait-il possible de parler en MP? Je souhaiterais te poser d'autres questions au sujet de ton code

  20. #16
    Aurélien

    Re : Problème signal sortie FPGA Lattice Diamond

    Citation Envoyé par portoe Voir le message
    Bonjour,

    D'accord, serait-il possible de parler en MP? Je souhaiterais te poser d'autres questions au sujet de ton code
    C'est dommage, je suis certain que d'autres lecteurs du forum aimeraient bénéficier des commentaires de jihervé sur le sujet !

  21. #17
    portoe

    Re : Problème signal sortie FPGA Lattice Diamond

    Citation Envoyé par Aurélien Voir le message
    C'est dommage, je suis certain que d'autres lecteurs du forum aimeraient bénéficier des commentaires de jihervé sur le sujet !
    Je pensais que mon post était trop précis pour intéresser quelqu'un

  22. #18
    Aurélien

    Re : Problème signal sortie FPGA Lattice Diamond

    Citation Envoyé par portoe Voir le message
    Je pensais que mon post était trop précis pour intéresser quelqu'un
    La plupart des posts liés à la programmation ici sont des posts précis, mais il y a toujours des conclusions et des méthodologies générales qui en ressortent.

  23. Publicité
  24. #19
    portoe

    Re : Problème signal sortie FPGA Lattice Diamond

    Avec ton code tu ne faisais pas que généré un signal de synchro?

    Car j'ai du mal a tout comprendre et je n'aime pas me servir de choses que je ne comprends pas. L'ancien code se compile et fonctionne, j'ai fais le test de la synchro avec une caméra et un moniteur fourni par mon entreprise.

    Moi je serai plus partit sur un programme avec plusieurs compteur: un qui me servirait de 0 à 40ms, une sortie dépendrait de ce compteur que j'appel: cht
    Si cht=0 alors je compte pour avoir une période de 32µs, signal que j'inverserai après 160µs.
    Si cht=1 alors je compte pour avoir une période de 64µs.

    Et un dernier compteur pour savoir si c'est le premier ou le second champ.

    Qu'en penses tu?

  25. #20
    jiherve

    Re : Problème signal sortie FPGA Lattice Diamond

    Bonsoir
    en effet ce code génère un signal de synchro composite : ligne et trame.
    Il n'y a donc besoin que de 3 compteurs :
    un pour compter les pixels => timing ligne
    un pour compter les lignes => timing trame
    et une bascule pour compter les trames.
    attention ce code est un code de testbench donc il ne prend pas en compte les subtilités liées à la fréquence de fonctionnement mais le résultat en simulation doit être (est) correct pour du STANAG B ou PAL.
    JR
    l'électronique c'est pas du vaudou!

  26. #21
    portoe

    Re : Problème signal sortie FPGA Lattice Diamond

    Bonsoir

    Les pixels sont les impulsions du signal?
    La trame est une demi image?

    Bonne soirée

  27. #22
    portoe

    Re : Problème signal sortie FPGA Lattice Diamond

    Nous n'utilisions pas les mêmes termes, maintenant tout est plus clair, je comprends ton programme, j'essayerai demain si je résous mon problème avec HDL Diagram.

    Merci encore pour ton aide jiherve.

    Bonne soirée

  28. #23
    jiherve

    Re : Problème signal sortie FPGA Lattice Diamond

    Bonjour
    ici les "pixels" sont les coup d'horloge car en realité le nombre pixel en STANAG B est bien plus bas , autour de 700/ligne @52µs.
    JR
    l'électronique c'est pas du vaudou!

  29. #24
    portoe

    Re : Problème signal sortie FPGA Lattice Diamond

    Bonjour,

    Citation Envoyé par jiherve Voir le message
    Bonjour
    ici les "pixels" sont les coup d'horloge car en realité le nombre pixel en STANAG B est bien plus bas , autour de 700/ligne @52µs.
    JR
    D'accord pour les coup d'horloge en revanche je ne comprend pas le reste

    J'ai plusieurs questions au sujet du code:

    Code:
          cptpix      <= nbpixt - 10;-- compteur pixel
          cptlin      <= nblint - 10;-- compteur ligne
    Ce bout de code vient de la remise à zéro, j'aimerais savoir pourquoi tu ne remets pas tout les compteurs à zéro?

    Code:
    if (cptlin >= nblint - nblins -1) or (cptlin < 2*nblins -1 ) then
    nblint=625 et nblins=5 est ce que je peux mettre directement nbline qui est égal à 620

    J'ai en tête d'enlever la partie ci-dessous:

    Code:
          if (cptpix = nbpixt) or (cptpix = nbpixt/2) then
            if (cptlin = 1 )  then
              blkv <='0';
            elsif (cptlin = nblinb ) then
              blkv <='1';
            elsif (cptlin = nbline ) then
              blkv <='0';
            end if;
          end if;
    
          if (cptpix >= nbpixb) and (cptpix <= nbpixe) and (blkv  = '1') then
            blk <= '1';
          else
            blk <= '0';
          end if;
    Si je comprend bien la partie ci-dessous permet de savoir si on est en train de générer les périodes d'égalisation mais si je ne me trompe pas elles durent 2 lignes et demi plus 2 lignes et demi en début de trame durée de la synchro trame du coup je ne comprends pas comment ca fonctionne en fin de trame quand tu n'as plus que la période d'égalisation, je sais pas si j'ai bien expliqué mon soucis

    Code:
    if (cptpix = nbpixt) or (cptpix = nbpixt/2) then
            egalt <= egal;
            if (cptlin >= nblint - nblins -1) or (cptlin < 2*nblins -1 ) then
              egal <= '1';
            else
              egal <= '0';
            end if;
          end if;
    Code:
    if ((cptpix = nbpixt/2 - nbpixs) or (cptpix = nbpixt - nbpixs)) then
              cs <= '0';
    Ici il ne faut pas également diviser nbpixs par 2? car sinon nous aurons une durée de 4.7 micro seconde

    Je me demande aussi si tu as pris en compte la particularité de la seconde trame juste après la période d'égalisation

    Merci encore de prendre de ton temps afin de m'aider

  30. Publicité
  31. #25
    jiherve

    Re : Problème signal sortie FPGA Lattice Diamond

    Bonjour,


    Code:
          cptpix      <= nbpixt - 10;-- compteur pixel
          cptlin      <= nblint - 10;-- compteur ligne
    cà c'est pour reduire le temps initial de simulation ,c'est du confort on peu initialiser les deux compteur à '1' et pas à zero

    Code:
    if (cptlin >= nblint - nblins -1) or (cptlin < 2*nblins -1 ) then
    ici cela defini la totalité de la synchro trame avec pre et post egalisation , attention comme tout est synchrone il y a un decalage entre la valeur du compteur et ce qui est declenché.
    la pre-egalisation commence a 620 donc le comparateur fonctionne à 619
    la post -egalisation se termine a 10 donc le comparateur fonctionne à 9


    Code:
          if (cptpix = nbpixt) or (cptpix = nbpixt/2) then
            if (cptlin = 1 )  then
              blkv <='0';
            elsif (cptlin = nblinb ) then
              blkv <='1';
            elsif (cptlin = nbline ) then
              blkv <='0';
            end if;
          end if;
    
          if (cptpix >= nbpixb) and (cptpix <= nbpixe) and (blkv  = '1') then
            blk <= '1';
          else
            blk <= '0';
          end if;
    Cà cela génere la partie utile ,visible de la vidéo il serait etonnant que tu n'en ai pas besoin.


    Code:
    if (cptpix = nbpixt) or (cptpix = nbpixt/2) then
            egalt <= egal;
            if (cptlin >= nblint - nblins -1) or (cptlin < 2*nblins -1 ) then
              egal <= '1';
            else
              egal <= '0';
            end if;
          end if;
    Code:
    if ((cptpix = nbpixt/2 - nbpixs) or (cptpix = nbpixt - nbpixs)) then
              cs <= '0';
    Ici il ne faut pas également diviser nbpixs par 2? car sinon nous aurons une durée de 4.7 micro seconde
    lis donc la suite il y a un elsif!!!

    Je me demande aussi si tu as pris en compte la particularité de la seconde trame juste après la période d'égalisation
    il n'y a aucune particularité.
    Compile et fais une simulation avec Modelsim et on en reparle.

    je te joins un code simulable complet sans erreur dans les calculs des constantes (j'avais oublié les changements de type pour les calculs en réel) et fonctionnel et juste:
    Code:
    library ieee,work;
    use ieee.STD_LOGIC_1164.all;
    use ieee.NUMERIC_STD.all;
    use IEEE.math_real.all;
    
    entity test_generateur is
    end;
    
    architecture behavior of test_generateur is
     constant       clk_pro  :integer := 133;-- frequence en MHz
     constant oscillator_duty : TIME :=  integer(1000000.0/real(clk_pro)) * 1 fs; -- 133MHz
    
     constant       nbpixt   :integer := integer(64.0*real(clk_pro));-- durée ligne 64µs
     constant       nbpixs   :integer := integer(4.7*real(clk_pro));-- durée synchro ligne 4,7µs
     constant       nbpixb   :integer := integer(9.7*real(clk_pro));-- debut video en ligne
     constant       nbpixe   :integer := integer((9.7 + 52.0)*real(clk_pro));-- fin video en ligne la durée est de 52µS
     constant       nblint   :integer := 625;-- nombre de lignes
     constant       nblins   :integer := 5;-- durée synchro trame
     constant       nblinb   :integer := 45;-- debut video en trame
     constant       nbline   :integer := 620;-- fin vidéo en trame
     signal mclrn,mclock,sl,st,blk,blkv,fl,cs,egal,egalt      : std_logic;
     signal cptpix,cptlin: integer;
    begin
    mclrn <= '0' , '1'  after  100 ns;
    clock : process
      begin
        mclock  <= '0';
        wait for oscillator_duty/2;
        mclock  <= '1';
        wait for oscillator_duty/2;
      end process clock;
    
    VIDEO_TIMING: process (mclock,mclrn)
      begin
        if (mclrn = '0') then
          sl          <= '0';-- synchro ligne
          st          <= '0';-- synchro trame
          blk         <= '0';-- blanking ligne+trame
          blkv        <= '0';-- blanking trame
          fl          <= '0';-- parité trame
          cs          <= '0';-- synchro composite
          egal        <= '0';-- egalisation
          egalt       <= '0';
          cptpix      <= nbpixt - 10;-- compteur pixel
          cptlin      <= nblint - 10;-- compteur ligne
                
        elsif rising_edge (mclock) then
    
          if (cptpix = nbpixs ) then
            sl <= '0';
            cptpix <= cptpix+1;
          elsif (cptpix < nbpixt ) then
            cptpix <= cptpix+1;
          else
            sl <= '1';
            cptpix <= 1;--1+modu/20;
          end if;
    
          if (cptpix = nbpixt) or (cptpix = nbpixt/2) then
            if (cptlin = nblins) then
              st <= '0';
              cptlin <= cptlin+1;
            elsif (cptlin <nblint) then
              cptlin <= cptlin+1;
            else
              cptlin <= 1 ;
              st <= '1';
              fl <= not fl;
              end if;
          end if;
    
          if (cptpix = nbpixt) or (cptpix = nbpixt/2) then
            if (cptlin = 1 )  then
              blkv <='0';
            elsif (cptlin = nblinb ) then
              blkv <='1';
            elsif (cptlin = nbline ) then
              blkv <='0';
            end if;
          end if;
    
          if (cptpix >= nbpixb) and (cptpix <= nbpixe) and (blkv  = '1') then
            blk <= '1';
          else
            blk <= '0';
          end if;
    
          if (cptpix = nbpixt) or (cptpix = nbpixt/2) then
            egalt <= egal;
            if (cptlin >= nblint - nblins -1) or (cptlin < 2*nblins -1 ) then
              egal <= '1';
            else
              egal <= '0';
            end if;
          end if;
    
          if ((cptpix = nbpixt) or ((egal = '1') and (cptpix = nbpixt/2))) and cs = '0' then
             cs <= '1';
          elsif (egalt = '0') then
            if (cptpix = nbpixs) then
              cs <= '0';
            end if;
          elsif (st = '1') then
            if ((cptpix = nbpixt/2 - nbpixs) or (cptpix = nbpixt - nbpixs)) then
              cs <= '0';
            end if;
          elsif((cptpix = nbpixs/2) or (cptpix = nbpixt/2 + nbpixs/2)) then
              cs <= '0';
          end if;
        end if;
      end process VIDEO_TIMING;
    end;
    il faut lancer la commande :vsim -t fs work.test_generateur.
    ne surtout pas oublier le -t fs car il faut une grande résolution temporelle
    JR
    Dernière modification par Antoane ; 25/05/2016 à 14h18. Motif: Réparation balises quote
    l'électronique c'est pas du vaudou!

  32. #26
    portoe

    Re : Problème signal sortie FPGA Lattice Diamond

    D accord merci pour les réponses à mes questions.
    Merci pour le programme mais je ne le copierai pas, j'essaie avant tout de comprendre de ce que je fais, je ne cherche qu'une aide sur ce forum et je ne veux absolument pas qu on me donne un programme tout fait. Ce n'est pas moi qui ai fais ce programme et je ne souhaite pas retirer les mérites qui te reviennent.
    Dernière modification par portoe ; 25/05/2016 à 16h36.

  33. #27
    jiherve

    Re : Problème signal sortie FPGA Lattice Diamond

    re
    ce n'est qu'un exemple de type 'behavior" il y a encore du travail avant de faire tourner çà @ 133 MHz en vrai!
    mais au moins tu auras une référence pour la tronche des différents signaux utiles.
    JR
    l'électronique c'est pas du vaudou!

Sur le même thème :

Discussions similaires

  1. FPGA Lattice: LCMXO2-1200ZE-2MG132C
    Par technowood dans le forum Programmation et langages, Algorithmique
    Réponses: 2
    Dernier message: 26/06/2012, 14h08
  2. FPGA Lattice: LCMXO2-1200ZE-2MG132C
    Par technowood dans le forum Électronique
    Réponses: 0
    Dernier message: 26/06/2012, 13h50
  3. Probleme signal carré en sortie de pic10f202
    Par mat-et-max dans le forum Électronique
    Réponses: 2
    Dernier message: 04/03/2010, 21h50
  4. Transistor -émetteur commun- problème signal de sortie
    Par gargos1 dans le forum Électronique
    Réponses: 10
    Dernier message: 15/11/2008, 12h55
  5. Réponses: 10
    Dernier message: 03/03/2008, 14h18