Partage
  • Partager sur Facebook
  • Partager sur Twitter

probléme pour décaler une horloge en VHDL

    4 avril 2013 à 16:12:09

    Bonjour,

    Je voudrais décaler mon horloge selon une valeur de selection.

    J'explique mon projet:

    en sortie d'un demultiplexeur 1b/20b (chaque coup d'horloge un bit est mis en paralléle), je rentre dans un bloc VHDl de "detection" pour reconnaitre un mot de 10bits ("k28.5") dans ma sortie paralléle sur 20bit

    ex: mots reconnu sur out(13 downto 4), pour connaitre la position de ce mot je me sert d'un signal "detect" sur 4bits qui m'indique la position du mot k25.5 .

    donc si K28.5 est positionnée sur dout( 9 downto 0) alors detect ="0001"
    si K28.5 est positionnée sur dout( 10 downto 1) alors detect ="0010"
    etc
    etc
    etc
    etc
    si K28.5 est positionnée sur dout( 18 downto 9) alors detect ="1001"


    Et donc maintenant je voudrais donc pour pouvoir aligné correctement mon mot, le placé dans tout les cas a dout(9 downto 0).
    donc mon idée est donc si il ya détection du mots de décaler mon horloge en entré de demutliplexeur de la valeur du signal "detect".

    donc en gros d'utiliser ce systéme:

    process(clk)
    begin
    case (detect) is
    when "0000" => DOUT_val<= CLK;
    when "0001" => DOUT_val<= "decalement de CLk de 1 bit";
    when "0010" => DOUT_val<= "decalement de CLk de 2 bit";
    when "0011" => DOUT_val<="decalement de CLk de 3 bit";
    when "0100" => DOUT_val<="decalement de CLk de 4 bit";
    when "0101" => DOUT_val<= "decalement de CLk de 5 bit";
    when "0110" => DOUT_val<= "decalement de CLk de 6 bit";
    when "0111" => DOUT_val<= "decalement de CLk de 7 bit";
    when "1000" => DOUT_val<= "decalement de CLk de 8 bit";
    when "1001" => DOUT_val<="decalement de CLk de 9 bit";
    when "1010" => DOUT_val<= "decalement de CLk de 10 bit";
    when others => DOUT_val<= CLK;
    end case;
    end process;
    CLK_decaler <= DOUT_val ;

    et donc j'aimerais savoir la démarche a suivre pour réaliser ce décalage d'horloge;

    je voos remercie d'avance pour toutes informations.

    cordialement
    Mathieu
    • Partager sur Facebook
    • Partager sur Twitter
      4 avril 2013 à 18:36:46

      Ton démultiplexeur ne serait-il pas plutôt un registre à décalage ?

      Si oui il y a beaucoup plus simple.

      Tu rentres les bits dans un registre de 10 bits et tu les décales à chaque coup d'horloge. Quand le contenu du registre match ton k28.5, tu sais que tu es aligné, et tu reset un compteur de bits. À chaque bit, tu incrémentes le compteur modulo 10. Ensuite, à chaque fois que le compteur repasse de 9 à 0, tu sais que tu as récupéré un mot de 10 bits, tu l'extrais du registre à décalage et tu le places dans le registre de sortie.

      Il n'y a pas besoin de gros barrel shifter, comme tu es en train de faire, pour implémenter ça, il faut penser "série".

      • Partager sur Facebook
      • Partager sur Twitter
        5 avril 2013 à 10:03:33

        Bonjour,

        Merci pour votre réponse, mais j'utilise bien un démultiplexeur, en fait je travaille sur la partie réception d'un SERDES ("serialiseur/deserialiseur") , mes données arrivent en série a une vitesse de 12gbit/s et je doit donc désérilaiser/demultiplexer mes données.

        Pour cela je tiens compte que dans la partie transmission que l'on a utiliser un codeur 8b/10b et maintenant pour le moment j'ai réalisé dans ma partie réception donc un test sur mes donnée série a l'aide d'un PRBS,  ensuite  ces données sont envoyé dans mon désérialiseur/démultiplexeur qui transforme mes données série en données parallèle.

        J'ai également codé un décodeur 10b/8b et en amont de celui-ci je dois utiliser un "commas word alignement" ce que je suis en train de faire , je détecte mon mots K28.5 ( mots utiliser pour le decodeur 8b/10b pour aider a l'alignement ) et maintenant donc je dois a partir de ce mots aligner correctement mes mots car si mon mots est placée a dout(14 downto 5) par exemple j'aurais moins de 5bits de donnée utile donc c'est pour sa je voulais utiliser ma démarche précédente pour pouvoir décaler mon horloge du désérialiseur afin selon détection du mots k28.5 décaler ces données pour ensuite placée ce mot a la position dout( 9 downto 0 ) et ensuite j'aurais bien 10 bits de donnée utilise qui rentreront dans mon décodeurr 10b/8b.

        J’espère j'ai pu expliquer assez clairement mon projet. Et je vous remercie encore pour votre réponse l'utilisation de registre me sera utile je pense.

        Mathieu

        • Partager sur Facebook
        • Partager sur Twitter
          5 avril 2013 à 15:15:49

          Fallait le dire que c'était un truc de malade ;)

          Dans les serdes que Xilinx fourre généreusement dans ses fpga, il y a une fonction bitslip où la partie rapide (à 12 GHz chez toi) peut couper son horloge pendant 1 ou plusieurs cycles, ce qui décale la sortie parallèle d'autant de bits. Avec ça, une fois le mot d'alignement détecté, si il n'est pas bien aligné, on active le bitslip sur un nombre de bits correspondant au défaut d'alignement, et hop. Vérifie pour voir si ton serdes a cette fonctionnalité.

          Sinon tu n'as pas le choix, il faudra un barrel shifter...

          Donc tu reçois du 10 bit, tu instancies un registre de 20 bits pour garder le mot courant et le mot précédent. Pardon, je le fais en verilog, le VHDL me fout la gerbe.

          input wire [9:0] entree; // mettons que le LSB (bit 0) est le plus récent dans le flux série
          reg [19:0] memoire
          
          always @(posedge clock) begin
              memoire[19:10] <= memoire;[9:0];
              memoire[9:0] <= entree;
          end
          

          Là, on a le mot actuel, et le mot précédent, de préférence dans le bor ordre. Tu peux économiser 10 flop en utilisant seulement un registre de 10 bits, aussi.

          Ensuite il faut chercher le mot d'alignement dans ce mot de 20 bits...

          always @( posedge clock ) begin 
              if( memoire[9:0] == mot_align ) decal <= 0;
              if( memoire[10:1] == mot_align ) decal <= 1;
              ..etc
              if( memoire[18:9] == mot_align ) decal <= 9;
          end
          

          Note que le décalage vaut de 0 à 9 bits, il peut pas valoir 10, sinon ça décale d'un mot entier.

          Après il te faut un barrel shifter :

          reg[9:0] sortie;
          always @( posedge clock ) begin 
              switch( decal )
                  case 0: sortie &lt= memoire[9:0];
                  case 1: sortie &lt= memoire[10:1];
                  ...
                  case 9: sortie &lt= memoire[18:9];
          

          C'est l'idée.

          • Partager sur Facebook
          • Partager sur Twitter
            8 avril 2013 à 8:57:06

            Merci pour votre réponse cela m'aide beaucoup ! oui en effet je travaille sur un truc un peu difficile !! et je travaille en amont d'une carte FPGA et je doit réaliser un bloc fonctionnent comme la partie réception d'un SERDES. Donc je dois le créer moi même.

            En tous cas votre solution m'inspire et je vais suivre cette idée, je vous tiens au courant pour la réussite de ce bloc d'alignement.

            Bien cordialement

            Mathieu

            • Partager sur Facebook
            • Partager sur Twitter
              8 avril 2013 à 9:55:12

              je travaille avec différent bloc je vais vous montrer ou j'en suis

              mon démultiplexeur :

              ma détection de mots :

              et maintenant je travaille sur mon bloc d'alignement ou je vais essayer d'utiliser votre solutions

              maintenant je vais essayer de modifier ce code et utiliser votre démarche.

              -
              Edité par mathieudesprez 8 avril 2013 à 9:59:02

              • Partager sur Facebook
              • Partager sur Twitter
                8 avril 2013 à 10:46:30

                Tu vas instancier ce VHDL dans quoi ? Une FPGA ? Si oui laquelle ? Un ASIC ?
                • Partager sur Facebook
                • Partager sur Twitter
                  8 avril 2013 à 11:53:32

                  En fait je vais implémenter mon code en amont d'un FPGA sur une puce de type ASIC.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    8 avril 2013 à 12:03:46

                    Quel genre d' ASIC ?

                    C'est un projet scolaire (faire un désérialiseur) ou du boulot ? Si 2è option, remplace ton ASIC par une Spartan-6 LXT...

                    Le flux de données source est à 12 Gbits/s, est-tu en mesure d'instancier un flop à 12 GHz dans ton ASIC ?

                    L'horloge est source-synchrone ?

                    Comment tu gères le déphasage et les variations PVT ? Tu peux instancier un délai ?

                    • Partager sur Facebook
                    • Partager sur Twitter
                      8 avril 2013 à 12:12:49

                      En fait je suis en stage de fin d'année d'ecole d'ingénieur et en ce moment je travaille pour le CNRS dans une station de radioastronomie.

                      On  doit travailler aussi sur une clock data recovery et une PLL qui va gérer notamment notre  horloge.  Je suis aussi encore en étude de mon projet donc je n'ai pas définie encore le type d'ASIC .

                      • Partager sur Facebook
                      • Partager sur Twitter
                        8 avril 2013 à 20:04:12

                        Lord Casque Noir a écrit:

                        Quel genre d' ASIC ?

                        C'est un projet scolaire (faire un désérialiseur) ou du boulot ? Si 2è option, remplace ton ASIC par une Spartan-6 LXT...

                        Le flux de données source est à 12 Gbits/s, est-tu en mesure d'instancier un flop à 12 GHz dans ton ASIC ?

                        L'horloge est source-synchrone ?

                        Comment tu gères le déphasage et les variations PVT ? Tu peux instancier un délai ?


                        Spartan 6 LXt me parait juste, sur le site de Xilinx le LXT est donné avec des transceivers à 3.2 Gbps à moins que tu additionne plusieurs transceivers pour avoir les 12Gbps ?

                         Pour avoir travaillé (en conception électronique et pas trop VHDL, un petit peu quand même au niveau des transceivers) avec du Altera, pour avoir du 10 Gbps c'est la gamme Arria V ou Stratix IV/V.

                        Pour le 12 Gbps (12.5 Gbps) c'est du Arria V GZ, une version de l'Arria avec des transceivers du Stratix V, ou alors les Stratix V (mais plus chers).

                        Pour le peu que j'ai étudié des transceivers Altera, je crois qu'ils ont une possibilité de n'utiliser que certains blocs de processing : PMA, PCS, etc. Ce qui permet d'utiliser les fonctions hardware en les configurant pour son protocole.

                        Pour Xilinx, au niveau transceivers 12.5 Gbps ca semble être la famille Kintex 7 et Virtex. Sinon question un peu à part : pourquoi utiliser du 8b/10b à 12Gbps ? le 64b/66b n'est pas suffisant au niveau des transitions et de la DC balance ? 
                        • Partager sur Facebook
                        • Partager sur Twitter
                          8 avril 2013 à 23:02:29

                          Non, je me suis planté de série, à ces débits chez xilinx c'est série 7 (pas toutes), très neuf, ou virtex 6 (cher).

                          Sinon, c'est extrêmement couillu comme projet, d'un niveau très élevé tout de même. J'espère que tu sais où tu mets les pieds...

                          Concevoir un désérialiseur, ça me paraît tout de même bizarre. Tu ne peux pas utiliser une FPGA ? Je ne pense pas que tu vas tirer un million de chips, donc même une FPGA chère et d'une puissance démente risque de te revenir (beaucoup) moins cher qu'une petite série d'ASIC... 

                          • Partager sur Facebook
                          • Partager sur Twitter
                            9 avril 2013 à 9:32:03

                            Ben mon projet à moi s'arréte a l'etude du demultiplexeur/deserialiseur avec decodage, un autre projet consistent au dévellopement de la PLL donc c'est un projet diviser en plusieur partie.

                            Pour le moment c'est intéressant, et on utilise une puce ASIC car a cause de la vitesse qui doit donc étre un débit minimum de 12gbit notamment, et c'est dans mon cahier des charges, sinon pour le decodeur, le 64b/66b aurait aussi convenue mais juste aprés recherche bibliographique j'ai trouvé plus d'utilisation de décodeur 8b/10b.

                            Sinon pour mon alignement j'ai réussi à avoir une simulation correcte, il me reste plus que à corriger mon codage sur mon Signal de détection ("com") qui reste toujours a sa premiére valeur. Sinon en décalant mon horloge de tant de bits selon valeur de ("com") dans mon désérialiseur j'arrive a aligner mes données a partir d'un mot de 10bits.

                            donc on apercoit mes données en entré en série, mon démultiplexeur 1/20b, mon signal de détection de mots ("com") et ensuite mon horloge donc qui est décaler selon la valeur de celui-ci. et enfin ma sortie.

                            Et donc ensuite pour finir d'expliquer mon projet, je dois également réaliser sa conception sous cadence en technologie 0.25 um SiGeC.

                            -
                            Edité par mathieudesprez 9 avril 2013 à 9:41:08

                            • Partager sur Facebook
                            • Partager sur Twitter
                              9 avril 2013 à 22:28:49

                              mathieudesprez a écrit:

                              Pour le moment c'est intéressant, et on utilise une puce ASIC car a cause de la vitesse qui doit donc étre un débit minimum de 12gbit notamment, et c'est dans mon cahier des charges, sinon pour le decodeur, le 64b/66b aurait aussi convenue mais juste aprés recherche bibliographique j'ai trouvé plus d'utilisation de décodeur 8b/10b.

                              Fait attention avec des arguments du type "j'ai choisi X/Y/Z car c'est sur ca que j'ai trouvé le plus de document". Je suis conscient que lorsque l'on ne connait pas trop le sujet en détaille on préfère prendre un choix où on aura plus de documentation, mais cela n'empêche pas d'approfondir le sujet et de connaitre les avantages et désavantages de chaque solution ;)

                              Car tu parles de 12 Gbps, c'est le débit brut ou utile ? Car l'overhead en 8b/10b c'est 25%, c'est-à-dire que pour un débit brut de 12.5 Gbps, tu auras un débit utile de 10 Gbps. Tandis que le 64b/66b n'a qu'un overhead de 3.125%, donc 10 Gbps de débit utile correspond à un débit brut de 10.3125 Gbps.

                              Quand le débit est faible (100 Mbps, voire 1 Gbps maintenant) l'overhead de 25%, bien qu'important en pourcentage est moins "choquant" en valeur brute, mais à 10 Gbps, ca commence à faire 2 Gbps de perdu ;)

                              Ensuite il est vrai que le 64/66 nécessite un scrambler/descrambler, ce qui est un peu plus complexe au niveau compréhension et mise en place :)

                              Je ne dis pas qu'il faut que tu utilise le 64b/66b pour ton application, par exemple l'USB3 utilise le 8b/10b avec un débit utile de 10Gbps (donc 12.5Gbps en brut), néanmoins essaie de te renseigner en détail sur les 2 encodage et d'avoir quelques arguments techniques qui tiendront face à un jury ou à un professionnel (et ca te servira plus tard) :)

                              • Partager sur Facebook
                              • Partager sur Twitter
                                10 avril 2013 à 18:04:01

                                > Pour le moment c'est intéressant, et on utilise une puce ASIC car a cause de la vitesse qui doit donc étre un débit minimum de 12gbit

                                > notamment, et c'est dans mon cahier des charges

                                Si tu as besoin d'un machin avec un serdes de 12 Gbps, et que c'est pour un nombre d'exemplaires faibles, alors tu mets une grosse FPGA, point. Et après lecture du manuel du "Xilinx transceiver wizard", qui fait la taille d'un bottin, tu instancies le truc. La raison pour se prendre le chou avec un ASIC doit être autre, il doit y avoir de l'acquisition de données (ADC ?) à des cadences de malade, ou je ne sais quoi, mais la raison d'utiliser un ASIC doit provenir de la fonction du chip, pas de la nécessité d'avoir  une liaison série 12 Gbps. Le chip doit faire un truc qu'il n'est pas possible de faire autrement. Sinon ça vaut pas le coup, le temps, l'argent...

                                D'autre part, pourquoi une liaison 12G et pas 12 liaisons 1G, ou 24 liaisons 0.5G, genre de truc que maintenant tu trouves dans une FPGA à 10€ ? Ou peut-être qu'il y a plein de liaisons 12G sur ce chip mystère ? lol. 

                                Et pourquoi ne pas utiliser du PCI Express ? Ou de l'ethernet 10G ? Ou du DisplayPort, du HDMI ? Il y a pas mal de chipsets à 10€ qui crachent des bandes passantes égales ou supérieures à ton besoin, tout faits, pas chers, et qu'on peut avoir livrés demain avant 13h... perso, si j'étais dans ton jury, c'est la première question que je te poserais ...

                                Genre là, dans un projet perso, j'ai besoin d'isoler environ 80 Mbits/s de données au total, mais qui représentent plein de canaux. Je partais sur plein d'isolateurs de chez silabs, et puis je me suis tapé le front : un uC ethernet à chaque bout et du code, c'est moins cher, plus flexible, et plus pratique. 

                                Soit dit en passant, tu peux aussi externaliser le serdes, ou acheter un core. Colle un chipset DisplayPort ! T'auras fini vendredi soir.

                                Sinon, il faut que tu connaisses ton process, ce que tu peux instancier, les primitives, leurs timings, etc. C'est pas un truc de mémé genre une machine à états à 20 MHz dans une FPGA moderne, où quel que soit le code, même pas optimisé du tout, le synthétiseur trouvera bien un moyen de te le faire marcher. Là, il faut que tu visualises bien chaque primitive que tu instancies, si elle est synthétisable, et si le tout validera les timings ou pas. Sinon, tu vas perdre ton temps, faire un truc très joli en simulation, mais quand tu vas synthétiser, toutes tes contraintes vont péter, et tu devras repartir de zéro.

                                Par exemple, réponds aux questions suivantes, si tu ne sais pas, plonge dans la doc, c'est pour ton bien :

                                - quelles sont les primitives ?

                                - specs timing du flip flop de base que tu peux instancier ?

                                - tu as mis un reset asynchrone, pourquoi, quel est l'impact, y en a-t-il besoin ?

                                - ton compteur est un compteur ou un one-hot ? dans les 2 cas quelle est la marge de timing ?

                                - motive le choix de ton architecture : registre à décalage ou démultiplexeur ? pourquoi ?

                                Etc. Oui, je te fais chier, mais c'est pour ton bien.

                                -
                                Edité par Lord Casque Noir 10 avril 2013 à 18:05:59

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  11 avril 2013 à 14:45:55

                                  Merci pour vos remarque et non sa me fait pas chier justemment je suis venu la aussi pour apprendre donc toute remarque est intéressante . je vous remrcie d'ailleurs pour toute vos réponse qui m'aide beaucoup !!!
                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  probléme pour décaler une horloge en VHDL

                                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                  • Editeur
                                  • Markdown