demande en VHDL - Divers - Programmation
Marsh Posté le 23-05-2014 à 20:08:10
ouai
mais attention on aide, on répond à des questions, mais on ne fait pas les exercices ni le boulot à ta place
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 ut integer range 0 to longueur-1 ;
CD :in std_logic_vector( (4*longueur)-1 downto 0) ;
S ut 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 rocess(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 .
Marsh Posté le 23-05-2014 à 22:37:07
Il manque le "end generate"
PS utilise la balise [code=vhdl] c'est plus clair!
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)
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 our les 4 bits qui est dans chaque bit .
?!
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.
Marsh Posté le 24-05-2014 à 16:56:46
Bonjour ;
Je voulais d'entrer des bits variables (code) .
Merci d'avance
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.
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.
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
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 ut integer range 0 to longueur-1 ;
CD :in std_logic_vector( (4*longueur)-1 downto 0) ;
S ut 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 rocess(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 .
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 !
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.
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 ut integer range 0 to longueur-1 ;
CD :in std_logic_vector( (4*longueur)-1 downto 0) ;
S ut 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 rocess(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
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
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 ut integer range 0 to longueur-1 ;
CD :in std_logic_vector( (4*longueur)-1 downto 0) ;
S ut 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 rocess(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
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 :
|
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
Marsh Posté le 26-05-2014 à 10:12:32
Que veux tu exactement? Montres nous ce que tu as déjà fait!
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 ut 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 .
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)
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 !?
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)?
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 .