demande en VHDL

demande en VHDL - Divers - Programmation

Marsh Posté le 23-05-2014 à 20:04:28    

Bonsoir mes ami(e)s :
 
Je voudrai juste savoir est ce qu'il y en a quelqu'un qui pourra m'aider  
 
Au niveau de code VHDL !
 
parce que je me suis bloqué !
 
 
Merci d'avance pour votre réponse .

Reply

Marsh Posté le 23-05-2014 à 20:04:28   

Reply

Marsh Posté le 23-05-2014 à 20:08:10    

ouai  :sol:  
mais attention on aide, on répond à des questions, mais on ne fait pas les exercices ni le boulot à ta place ;)

Reply

Marsh Posté le 23-05-2014 à 21:19:24    

Ok ;
 
Je te remercie .
 
Au fait, j'ai écris un programme de la modulation bpsk .mais ce que me gène c'est: il faut faire générique(generate for) pour la longueur de mon code  cela veut dire qu' au lieu d'entrée 4 bits je peux saisie 1bit ,2,3bits ..
sachant que j'ai une séquence de 8 bits chaque 1 bit il y en a (4bits)  
mon souci c'est au niveau de la fonction (generate for) .
J’espère que vous m'avez compris
 
Voici mon code :
 
entity cdma_testbipo is
generic  (
            longueur  : natural :=4 );
 
port (
         clk : in std_logic ;
         rst : in std_logic  ;
         data: in std_logic  ;
        odata: out std_logic  ;
        isis :out  integer range 0 to longueur-1  ;
        CD   :in std_logic_vector( (4*longueur)-1 downto 0) ;
         S   :out integer range -8 to 7 );
end entity ;
 
architecture beh of cdma_testbipo is    
    type RAM is array (0 to longueur-1) of integer range -8 to 7;
        signal i      :integer range 0 to longueur-1 ;
        signal code   : RAM;
        signal idata  :std_logic  ;
         
         
        begin  
       
        F:for j in 0 to longueur-1 generate  
              begin
             
           code(j)<=to_integer(signed(CD((4*longueur)-1 downto 3*longueur)));
           code(j)<=to_integer(signed(CD((3*longueur)-1 downto 2*longueur))) ;
           code(j)<=to_integer(signed(CD((2*longueur)-1 downto longueur )));
           code(j)<=to_integer(signed(CD(longueur-1 downto 0))) ;
         
         
         bpsk :process(clk,rst)
               begin  
                    if(rst='1')then  
                        i<= 0;
                    else  
                        if(clk'event and clk='1')then  
                             
                            i<=i+1 ;
                            if(idata='0') then  
        s<=-code(i);  
       else  
        s<=code(i);
       end if;
     
       if(i=longueur-1) then  
        idata<=data;
       end if;
                               
                          end if ;
                      end if ;
                  end process ;
               
                  isis<=i;
                 
                 odata<=idata ;
              end generate F ;
   end architecture ;          
 
 Merci d'avance . :wahoo:  
 

Reply

Marsh Posté le 23-05-2014 à 22:37:07    

Il manque le "end generate"

 

PS utilise la balise [code=vhdl] c'est plus clair!


Message édité par h3bus le 25-05-2014 à 16:19:53

---------------
sheep++
Reply

Marsh Posté le 23-05-2014 à 23:05:02    

Si ; voir le code tu vas le trouver  end generate F

Reply

Marsh Posté le 23-05-2014 à 23:33:55    

Ah oui, je ne pige pas ton code, tu a des driver multiples sur code(j)


---------------
sheep++
Reply

Marsh Posté le 23-05-2014 à 23:57:38    

ah d'accord ; on a sortie sur 8 bits .
 
chaque bit parmi ces 8 bits nous avons 4bits .
 
j :pour les 4 bits qui est dans chaque bit .
 
?!  

Reply

Marsh Posté le 24-05-2014 à 00:36:13    

Je suis désolé, je ne comprends pas.
 
Explique ce que représentes tes IO et ce que tu veux faire avec.


---------------
sheep++
Reply

Marsh Posté le 24-05-2014 à 16:56:46    

Bonjour ;
 
Je voulais d'entrer des bits variables (code) .
 
Merci d'avance

Reply

Marsh Posté le 24-05-2014 à 17:00:50    

mon code que je faisais c'est chaque bit de code est représenté par 4 bits .
 
alors moi je voulais qu'ils sont variables (4bis ,5bits ,...) c'est pour cela il faut faire generique ...for .
 
c'est ça mon problème.

Reply

Marsh Posté le 24-05-2014 à 17:00:50   

Reply

Marsh Posté le 24-05-2014 à 17:08:12    

j'ai vraiment du mal à comprendre ton code et ton explication.
 
Montre nous un code qui marche, sans générique, avec valeur fixe pour qu'on comprenne un peu mieux.

Reply

Marsh Posté le 24-05-2014 à 17:23:18    

mais dis moi t'as une idée à propos la modulation bpsk !!?? ne c'est pas

Reply

Marsh Posté le 25-05-2014 à 00:54:07    

ça c'est programme principale :
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
 
entity cdm2 is
generic  (
            longueur  : natural :=4 );
 
port (
         clk : in std_logic ;
         rst : in std_logic  ;
         data: in std_logic  ;
        odata: out std_logic  ;
        isis :out  integer range 0 to longueur-1  ;
        CD   :in std_logic_vector( (4*longueur)-1 downto 0) ;
         S   :out integer range -8 to 7 );
end entity ;
 
architecture beh of cdm2 is  
       
           
    type RAM is array (0 to longueur-1) of integer range -8 to 7;
        signal i      :integer range 0 to longueur-1 ;
        signal code   : RAM;
        signal idata  :std_logic  ;
         
         
        begin  
       
        -
             
           code(0)<=to_integer(signed(CD(15 downto 12)));
           code(1)<=to_integer(signed(CD(11 downto 8))) ;
           code(2)<=to_integer(signed(CD(7 downto 4 )));
           code(3)<=to_integer(signed(CD(3 downto 0)));
         
         
         bpsk :process(clk,rst)
               begin  
                    if(rst='1')then  
                        i<= 0;
                    else  
                        if(clk'event and clk='1')then  
                             
                            i<=i+1 ;
                            if(idata='0') then  
        s<=-code(i);  
       else  
        s<=code(i);
       end if;
     
       if(i=longueur-1) then  
        idata<=data;
       end if;
                               
                          end if ;
                      end if ;
                  end process ;
               
                  isis<=i;
                 
                 odata<=idata ;
               
   end architecture ;          
 
 
 
dans le 1ere programme(principale) on a 4 bits pour chaque front montant alors moi je veux faire generique pour que je puisse entrer ce que je voulais c'est à dire (3 bits ;5 bits .......)pour chaque front montant .
 
Merci pour votre aider .

Reply

Marsh Posté le 25-05-2014 à 01:43:43    

Beaucoup à dire sur ce code. Je ferai un point demain...
On va déjà nettoyer le code non générique, puis le passer en générique.

 

Pour tes prochain post, merci d'employer la balise code=vhdl comme indiqué dans ma première réponse.

 

Également, les librairies utilisée ont une importance, mets les dans le code que tu poste !


Message édité par h3bus le 25-05-2014 à 16:19:42

---------------
sheep++
Reply

Marsh Posté le 25-05-2014 à 11:28:40    

La première remarque est le nom des sorties/signaux, c'est peut être courant pour le bspk mais quand je lis le code, leur nom ne me renseigne par sur leur fonction. Un autre choix de nom ou un commentaire peut aider.
 
Ensuite le process bspk n'affecte des valeurs de reset qu'à un seul signal, bien qu'il en pilote d'autre. C'est une bonne pratique de reseter tous les signaux affectés par un process (ce n'est pas indispensable, mais il faut bien maitriser ce qu'on fait pour ne pas le faire).
 
Utilise rising_edge(clk) au lieu de clk'event.
 
Tu ne gères pas l'overflow sur i qui est un integer. Ce n'est pas grave en soit car quand i = 3, i+1 = 0 car il va être encodé sur 2 bits. Mais si le synthétiseur pour une raison x ou y choit de le mettre sur 3 bits, ça ne marchera pas, un test if(i= 3) i <= 0 est plus prudent.
 
Pour être générique, après avoir corrigé les points au dessus, d'après ma compréhension du code, tu as uniquement besoin de passer la génération de code(j) dans un generate.
Note que tu pourrais complètement te passer du generate en récupérant le bon bit span de CD dans ton process. Tu pourrait alors également te passer du type RAM et du signal code.
 


---------------
sheep++
Reply

Marsh Posté le 25-05-2014 à 12:20:29    

si j'ai bien compris on peut faire comme ça :
 
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
 
entity cdma_testbipo is
generic  (
            longueur  : natural :=4 );
 
port (
         clk : in std_logic ;
         rst : in std_logic  ;
         data: in std_logic  ;
        odata: out std_logic  ;
        isis :out  integer range 0 to longueur-1  ;
        CD   :in std_logic_vector( (4*longueur)-1 downto 0) ;
         S   :out integer range -8 to 7 );
end entity ;
 
architecture beh of cdma_testbipo is    
    type RAM is array (0 to longueur-1) of integer range -8 to 7;
        signal i      :integer range 0 to longueur-1 ;
        signal code   : RAM;
        signal idata  :std_logic  ;
         
         
        begin  
       
                         F:for j in 0 to longueur-1 generate  
                          code(j)<=to_integer(signed(CD((longueur)-1 downto 0)));
                             
                            end generate F ;  
                 
                           
         
         
         
         bpsk :process(clk,rst)
               begin  
                    if(rst='1')then  
                        i<= 0;
                    else  
                        if(clk'event and clk='1')then  
                           i<=i+1 ;
                            if(idata='0') then  
        s<=-code(i);  
       else  
        s<=code(i);
       end if;
     
       if(i=longueur-1) then  
        idata<=data;
       end if;
                               
                          end if ;
                      end if ;
                  end process ;
               
                  isis<=i;
                 
                 odata<=idata ;
               
   end architecture ;          
     
tu pourras modifier programme si tu veux !
 
Merci d'avance

Reply

Marsh Posté le 25-05-2014 à 12:33:59    

Presque, il faut que tu sélectionne le bon bitspan dans ton generate. La tu prends toujours le même. Aussi, prend en compte mes remarques sur ton processus, si tu changes longueur et que c'est plus une puissance de 2, le compteur va prendre des valeurs supérieures à longueur-1


Message édité par h3bus le 25-05-2014 à 12:34:57

---------------
sheep++
Reply

Marsh Posté le 25-05-2014 à 12:55:09    

comme ça : ??????
 
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
 
entity cdma_testbipo is
generic  (
            longueur  : natural :=4 );
 
port (
         clk : in std_logic ;
         rst : in std_logic  ;
         data: in std_logic  ;
        odata: out std_logic  ;
        isis :out  integer range 0 to longueur-1  ;
        CD   :in std_logic_vector( (4*longueur)-1 downto 0) ;
         S   :out integer range -8 to 7 );
end entity ;
 
architecture beh of cdma_testbipo is    
    type RAM is array (0 to longueur-1) of integer range -8 to 7;
        signal i      :integer range 0 to longueur-1 ;
        signal code   : RAM;
        signal idata  :std_logic  ;
         
         
        begin  
       
                         F:for j in 0 to longueur-1 generate  
                          code(j)<=to_integer(signed(CD((4*longueur)-1 downto 0)));
                             
                            end generate F ;  
                           
           
           
         
         
         bpsk :process(clk,rst)
               begin  
                    if(rst='1')then  
                        i<= j;
                    else  
                        if rising_edge(clk) then
                           i<=i+1 ;
                            if(idata='0') then  
        s<=-code(i);  
       else  
        s<=code(i);
       end if;
     
       if(i=longueur-1) then  
        idata<=data;
       end if;
                               
                          end if ;
                      end if ;
                  end process ;
               
                  isis<=i;
                 
                 odata<=idata ;
                 
               
   end architecture ;          
     
 
Merci

Reply

Marsh Posté le 25-05-2014 à 15:58:28    

J'ai pas essayé et je ne sais vraiment ce que tu veux faire, mais en code correct voilà ce que ça donne:

Code :
  1. library ieee;
  2. use ieee.std_logic_1164.all;
  3. use ieee.numeric_std.all;
  4.  
  5. entity cdma_testbipo is
  6. generic
  7.    (
  8.        longueur  : natural := 4
  9.    );
  10. port
  11.    (
  12.        clk     : in  std_logic;
  13.        rst     : in  std_logic;
  14.        
  15.        data    : in  std_logic;
  16.        cd      : in  std_logic_vector( (4*longueur)-1 downto 0 );
  17.        
  18.        odata   : out std_logic;
  19.        isis    : out integer range 0 to longueur-1;
  20.        s       : out integer range -8 to 7
  21.    );
  22. end entity;
  23.  
  24. architecture RTL of cdma_testbipo is
  25.    signal i      : integer range 0 to longueur-1;
  26.    signal idata  : std_logic;
  27. begin
  28.  
  29. bpsk : process(clk,rst)
  30. begin  
  31.    if rst = '1' then  
  32.        i <= 0;
  33.        s <= 0;
  34.        idata <= '0';
  35.        
  36.    elsif rising_edge(clk) then
  37.    
  38.        if idata = '0' then  
  39.            s <= -to_integer(signed(CD(4*(i+1) - 1 downto 4*i)));
  40.        else  
  41.            s <= to_integer(signed(CD(4*(i+1) - 1 downto 4*i)));;
  42.        end if;
  43.        
  44.        if i = longueur-1 then
  45.            i       <= 0;
  46.            idata   <= data;
  47.        else
  48.            i <= i+1;
  49.        end if;
  50.      
  51.    end if;
  52. end process;
  53.  
  54. isis  <= i;
  55.  
  56. odata <= idata;
  57.  
  58. end architecture;


Message édité par h3bus le 25-05-2014 à 16:01:01

---------------
sheep++
Reply

Marsh Posté le 25-05-2014 à 16:30:49    

je te remercie ^^

Reply

Marsh Posté le 25-05-2014 à 23:47:45    

Bonsoir mes ami(e)s :
 
j'aimerai bien savoir est ce que vous avez une idée à propos le produit de corrélation ?!
 
Merci d'avance

Reply

Marsh Posté le 26-05-2014 à 10:12:32    

Que veux tu exactement? Montres nous ce que tu as déjà fait!


---------------
sheep++
Reply

Marsh Posté le 26-05-2014 à 10:48:10    

Bonjour ;
 
Ok les données sont les suivantes : on a 4 bascule D ,donnée sur 12 bits ,en plus on a :c(0),c(1),c(2),c(3) sont les codes qui vont multiplié le signal .
 
la question : écrire cette formule en vhdl :   ∑_(k=0 jusqu'à N-1)〖signal*la référence 〗.
e but pour avoir un étalement de spectre DSSS .
 
voici mon code :
 
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
 
entity correla is
 
port (
         clk : in std_logic ;
         rst : in std_logic  ;
         data: in std_logic_vector(11 downto 0)  ;
         code: in std_logic_vector(3 downto 0 )  ;
         Q   :out std_logic_vector(12 downto 1))  ;
end entity ;
 
architecture arch of correla  is
begin
     process(clk,rst)
           variable temp :std_logic_vector(1 to 12) ; --:=(others=>'0') ;
           variable sum  :integer range 0 to 3 ;
           begin  
                  if(rst='1') then  
                     Q<=(others=>'0') ;
                   
                   else  
                        if(clk'event and clk ='1') then  
                            for i in 1 to 4 loop  
                               sum:=0  ;
                               for j in 1 to 11 loop  
                                   sum:=sum+(code(i)*(data(i+j))) ;
                                end loop ;
                                temp(i):=sum ;
                             end loop ;
                         end if ;
                     end if ;
                         Q<=temp ;
            end process ;
 end architecture ;  
                 
Merci pour votre aider .

Reply

Marsh Posté le 26-05-2014 à 10:58:21    

Je me répète, merci de mettre des balise [code=vhdl] [ /code] autour de ton code. C'est illisible!

 

Je n'ai pas cherché à savoir si tu faisais ce que dit dans l'énoncé, mais déjà:
- i varie de 1 à 4 mais code va de 0 à 3. L'indexation code(i) est foireuse
- Pareil pour l'indexation de data
- temp(i)??Indexation foireuse aussi? (temp est défini de 1 à 12)
- ... (j'ai arrêté de lire)


Message édité par h3bus le 26-05-2014 à 10:59:33

---------------
sheep++
Reply

Marsh Posté le 26-05-2014 à 11:21:07    

je crois range (0 à 3) c'est pareil(1 à 4) !!  
 
mais qu'est ce que vous n'avez pas compris !?

Reply

Marsh Posté le 26-05-2014 à 11:46:32    

Non ce n'est pas pareil, que crois tu qu'il va se passer quand ta boucle va tenter d'accéder à code(4)?


---------------
sheep++
Reply

Marsh Posté le 26-05-2014 à 14:19:19    

ah ok d'accord

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed