Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
797 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Suivante
Auteur Sujet :

[VHDL/Verilog] Les FPGA et leur programmation

n°2215009
Hippo-fr
Melon fucker !
Posté le 04-01-2014 à 22:48:50  profilanswer
 

Reprise du message précédent :
Bonsoir  [:hellov]

 

Mon professeur nous a donné un fichier vhdl représentant une ROM, et j'essaye de lire les données (tableau 10*10) mais j'ai quelques soucis.

 

Le process de la rom utilise ceci :

Code :
  1. color(2 downto 0) <=  rom_img(to_integer(unsigned(y)))(to_integer(unsigned(x)))(2 downto 0);


Je ne comprends pas, j'ai l'impression que les parenthèses ne sont pas au bon endroit, mais pourtant ça marche :pt1cable:

 
Code :
  1. color      : out STD_LOGIC_VECTOR(2 DOWNTO 0)    );
 
Code :
  1. TYPE memory_slv is array ( 0 to 10 ) OF STD_LOGIC_VECTOR( 2 DOWNTO 0 );
  2. TYPE memory_img is array ( 0 to 10 ) OF memory_slv;
  3. constant rom_img : memory_img := (


1) Est-ce que la façon d'écrire est correcte (pour color(2 downto 0) <=  rom_img(to_integer(unsigned(y)))(to_integer(unsigned(x)))(2 downto 0)), ou bien les parenthèses ne sont pas bien mises ? Si c'est la bonne façon j'aurais besoin de quelques explications [:fleur de vanille]

 


Dans mon autre fichier vhdl, quand j'essaye de lire la rom j'utilise ceci pour l'instant :

Code :
  1. address := to_integer(internal_counter_hsync);
  2.   case address is
  3.    when 143 to 200 =>
  4.     internal_x <= "0011";
  5.     internal_y <= "0001";
  6.    when 201 to 400 =>
  7.     internal_x <= "0001";
  8.     internal_y <= "0001";
  9.    when others =>
  10.     internal_x <= "0000";
  11.     internal_y <= "0000";
  12.   end case;
 

2) Ça marche bien sauf pour le when others qui est complètement ignoré. De 0 à 143 et de 401 à 800, pourquoi mes deux signaux ne passent pas à 0000 ? Je suis sûr qu'il y a beaucoup plus élégant pour lire mon tableau de 10*10 que de lister tous les cas dans des when, mais j'ai toujours des messages d'erreurs.

 

Un peu d'aide n'est pas de refus ;)

Message cité 1 fois
Message édité par Hippo-fr le 04-01-2014 à 22:50:04

---------------
Creepy boy - ヾ(⌐■_■)ノ♪
mood
Publicité
Posté le 04-01-2014 à 22:48:50  profilanswer
 

n°2215038
Profil sup​primé
Posté le 05-01-2014 à 14:20:20  answer
 

Hippo-fr a écrit :

Bonsoir  [:hellov]
 
Mon professeur nous a donné un fichier vhdl représentant une ROM, et j'essaye de lire les données (tableau 10*10) mais j'ai quelques soucis.  
 


Le code que tu donnes en dessous est de toi ?

Hippo-fr a écrit :

Bonsoir  [:hellov]
 
Le process de la rom utilise ceci :

Code :
  1. color(2 downto 0) <=  rom_img(to_integer(unsigned(y)))(to_integer(unsigned(x)))(2 downto 0);


Je ne comprends pas, j'ai l'impression que les parenthèses ne sont pas au bon endroit, mais pourtant ça marche :pt1cable:  


Jamais croisé cette syntaxe mais bon j'suis un débutant aussi [:sombrero67]  
Qu'est-ce que tu entends par ça marche ?
Enfin là je vois pas trop comment ça marche ce truc: rom_img(to_integer(unsigned(y)))(to_integer(unsigned(x)))
 

Hippo-fr a écrit :


 

Code :
  1. color      : out STD_LOGIC_VECTOR(2 DOWNTO 0)    );




Y a une parenthèse en trop.

Hippo-fr a écrit :


 

Code :
  1. TYPE memory_slv is array ( 0 to 10 ) OF STD_LOGIC_VECTOR( 2 DOWNTO 0 );
  2. TYPE memory_img is array ( 0 to 10 ) OF memory_slv;
  3. constant rom_img : memory_img := (


1) Est-ce que la façon d'écrire est correcte (pour color(2 downto 0) <=  rom_img(to_integer(unsigned(y)))(to_integer(unsigned(x)))(2 downto 0)), ou bien les parenthèses ne sont pas bien mises ? Si c'est la bonne façon j'aurais besoin de quelques explications [:fleur de vanille]  
 


C'est pas finit ça : constant rom_img : memory_img := (
 
Pour ton 1) comme j'ai dit au dessus j'ai jamais vu cette syntaxe. C'est de ton prof ?

Hippo-fr a écrit :

Bonsoir  [:hellov]
Dans mon autre fichier vhdl, quand j'essaye de lire la rom j'utilise ceci pour l'instant :

Code :
  1. address := to_integer(internal_counter_hsync);
  2.   case address is
  3.    when 143 to 200 =>
  4.     internal_x <= "0011";
  5.     internal_y <= "0001";
  6.    when 201 to 400 =>
  7.     internal_x <= "0001";
  8.     internal_y <= "0001";
  9.    when others =>
  10.     internal_x <= "0000";
  11.     internal_y <= "0000";
  12.   end case;


 
2) Ça marche bien sauf pour le when others qui est complètement ignoré. De 0 à 143 et de 401 à 800, pourquoi mes deux signaux ne passent pas à 0000 ? Je suis sûr qu'il y a beaucoup plus élégant pour lire mon tableau de 10*10 que de lister tous les cas dans des when, mais j'ai toujours des messages d'erreurs.
 
Un peu d'aide n'est pas de refus ;)


Le address := to_integer(internal_counter_hsync); me paraît chelou :o
Je connais pas ton code mais tu peux pas mettre address <= to_integer(internal_counter_hsync); dans le process synchrone sur l'horloge ?
 
J'vois pas pour le when others.
 
 
Mais d'une manière générale le tout me paraît bizarre quand même :o
 

n°2215040
h3bus
Troll Inside
Posté le 05-01-2014 à 15:26:05  profilanswer
 

1) Oui c'est la bonne façon, tu as un tableau à deux dimensions et t'y accède rom_img(x)(y).  
Le reste n'est que conversion car les types sont mal choisis.
 
2) Quel est le type de internal_counter_hsync? Il pourrait être évaluer négatifs par la con version en integer.
 
De manière général, utiliser les std_logic_vector c'est le mal ;)


---------------
sheep++
n°2215054
Hippo-fr
Melon fucker !
Posté le 05-01-2014 à 18:53:04  profilanswer
 


Non, le code qui est de moi est le code qui fait 12 lignes, le reste est un fichier rom.vhdl fourni par le professeur. Quand je dis que ça marche, c'est que si j'essaye d'accéder à la ROM en position 4,3; j'ai bien la valeur stockée en rom qui est retournée.
La parenthèse de trop c'est la parenthèse fermante de port(. Et le reste n'est pas fini, car c'est juste les données du tableau 10*10, ça n'a pas trop d'intérêt de les balancer ici je pense mis à part pour prendre de la place.
Le address := to_integer(internal_counter_hsync), c'est parce si je travaillais directement sur les donnés de internal_counter_hsync (std_logic_vector), j'avais des erreurs.

 
h3bus a écrit :

1) Oui c'est la bonne façon, tu as un tableau à deux dimensions et t'y accède rom_img(x)(y).
Le reste n'est que conversion car les types sont mal choisis.

 

2) Quel est le type de internal_counter_hsync? Il pourrait être évaluer négatifs par la con version en integer.

 

De manière général, utiliser les std_logic_vector c'est le mal ;)


D'accord, je comprends mieux. Je m'attendais plutôt à rom_img(x,y) c'est pour ça que je ne comprenais pas.

 
Code :
  1. signal internal_counter_hsync : unsigned (9 downto 0) := "0000000000"; --initial value : 0
 

Pourquoi l'utilisation de std_logic_vector c'est mal ? Quel serait la façon de faire en général ? (pour ce devoir, je vais rester avec les std_logic_vector :o)
Quand je change le case par des if, sans passer par le address := to_integer; j'ai un message qui me dit "Warning: NUMERIC_STD.TO_INTEGER: metavalue detected, returning 0". Et aussi "Iteration limit 10000 is reached. Possible zero delay oscillation detected where simulation can not advance in time because signals can not resolve to a stable value". Ce que je ne comprend pas, c'est que ISim me dit que ça provient de la ligne color(2 downto 0) <=  rom_img(to_integer(unsigned(y)))(to_integer(unsigned(x)))(2 downto 0);
Or je ne change jamais cette ligne, ce fichier provient de rom.vhdl. Je change simplement mon case posté dans mon précédent post par :

 
Code :
  1. if(internal_counter_hsync < 163) then
  2.    internal_x <= internal_x + 1;
  3.    internal_y <= internal_y + 1;
  4.  else
  5.    internal_x <= "0000";
  6.    internal_y <= "0000";
  7.  end if;
 

internal_x,y étant des STD_LOGIC_VECTOR(3 DOWNTO 0).


Message édité par Hippo-fr le 05-01-2014 à 18:59:41

---------------
Creepy boy - ヾ(⌐■_■)ノ♪
n°2215055
h3bus
Troll Inside
Posté le 05-01-2014 à 19:10:00  profilanswer
 

std_logic_vector ne devrait être utilisé qu'aux interfaces externes du FPGA et uniquement pour des valeur qui ne représentent pas un nombre (sinon signed/unsigned est préférable).
Il vaut toujours mieux utiliser un integer (contraint), ou un enum, ou des booléens, ou des record... des types qui signifient quelque chose!
 
Mis à part ça, l'erreur que tu obtient vient surement d'une boucle combinatoire quelque part. Peux-tu poster ton code entier? (ou me l'envoyer en MP)


---------------
sheep++
n°2215057
Profil sup​primé
Posté le 05-01-2014 à 19:48:59  answer
 

J'avais lu que std_logic_vector c'était un truc mis en place par je sais plus quelle boîte et que c'était pas du vhdl officiel :o
Valait mieux utiliser numeric_std :o

n°2215061
h3bus
Troll Inside
Posté le 05-01-2014 à 20:08:08  profilanswer
 

Les librairies std_logic_arith, std_logic_signed/unsigned, ne sont pas dans le standard VHDL et il ne faut effectivement pas les utiliser.

 

Seuls std_logic_1164 et numeric_std devraient être utilisées. (Et les librairies math et textio dans certains cas).

 

std_logic et std_logic_vector sont dans le standard VHDL, aucun problème pour les utiliser, seulement ces types sont le plus souvent inappropriés.

 

Les professeurs actuels apprennent aux élèves des pratiques à proscrire, je passe un temps fou à me battre au boulot pour utiliser VHDL correctement. :/


Message édité par h3bus le 05-01-2014 à 20:08:19

---------------
sheep++
n°2272977
Hippo-fr
Melon fucker !
Posté le 07-01-2016 à 22:05:24  profilanswer
 

Un petit up sur ce topic, il est bien mort :(  
 
Est-ce que vous avez des sites à recommander pour suivre l'actualité lié au monde des FPGA (fr/en) ?


---------------
Creepy boy - ヾ(⌐■_■)ノ♪
n°2272981
h3bus
Troll Inside
Posté le 07-01-2016 à 22:34:39  profilanswer
 

Pendant je suivais les newsgroup
- comp.arch.fpga
- comp.lang.vhdl
- comp.lang.verilog
 
C'est la communauté la plus active je trouve!


---------------
sheep++
n°2272984
Hippo-fr
Melon fucker !
Posté le 07-01-2016 à 23:01:01  profilanswer
 

h3bus a écrit :

Pendant je suivais les newsgroup
- comp.arch.fpga
- comp.lang.vhdl
- comp.lang.verilog
 
C'est la communauté la plus active je trouve!


 
Je ne m'attendais pas du tout aux newsgroups :o
Je vais jeter un coup d'oeil.
 
Je regarde un peu fpgarelated mais je m'y paume sur le site.


---------------
Creepy boy - ヾ(⌐■_■)ノ♪
mood
Publicité
Posté le 07-01-2016 à 23:01:01  profilanswer
 

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
Créer un site sans connaitre la programmation?programmation mémoire à pic
programmation Excel / VBAProgrammation parallel (ppl.h avec visual studio) (débutant inside)
MATLAB programmation urgentProgrammation d'un tirage au sort
Programmation avec publisher 2007Programmation d'une carte relais IPX800 ?
Jeux programmation robotprogrammation maple
Plus de sujets relatifs à : [VHDL/Verilog] Les FPGA et leur programmation


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR