deux petites questions de syntaxe

Electronique numérique / Circuits logiques programmables EPLD, CPLD, FPGA d'Altera ou de Xilinx VHDL, Verilog ou SystemC

Modérateur : Modérateur

Invité

deux petites questions de syntaxe

Message par Invité »

Salut,

Je debut en VHDL et j'ai deux petites questions de syntaxe aux quelles je n'arrive pas a trouver les reponses sur le net.
Je developpe pour un FPGA xilinx, j'utilise donc xilinx ISE pour le developpement et modelsim.

Premiere question:
Je souhaite effectuer une convolution. Je multiplie donc mon buffer d'entree par une constante. Mais je souhaite pouvoir modifier cette constante au fur et a mesure du developpement. Donc pour faire propre je voulais faire un peu comme en C avec les #define. Declare les constante au debut du code
J'ai donc employe la synthaxe suivante en utilisant des generic:

Code : Tout sélectionner

entity conv is
	generic(kernel : std_logic_vector(15 downto 0):="0011100011110000");
	port ( buffer1 : in std_logic_vector(7 downto 0);
                         buffer2 : in std_logic_vector(7 downto 0);
                         buffer3 : in std_logic_vector(7 downto 0);
                         buffer4 : in std_logic_vector(7 downto 0);
                         .....................................
                         CLK : in std_logic;
                         buffer_out : out std_logic_vector(7 downto 0));
end conv;

architecture Behavioral of conv is

"declaration des composants"

begin
......
mult1 : mult9by16 port map(A=>kernel,B=>result_sum1,CLK=>CLK,AbyB=>result_mult1);

end Behavioral;

Quand je synthetise avec ISE ca passe sans aucun warning, mais quand je veux simuler, modelsim plante et detecte une faute dans le test bench genere automatiquement par ISE (test bench waveform)

Donc je voulais savoir pourquoi, et si il y a moyen d'utiliser les generics pour declarer se genre de constante.


Et deuxieme question:

J'ai code un simple additionneur 24 bits, et je fait une troncation a la sortie, pour ne recuper que les 8 bits de poids fort.
le code est tres simple

Code : Tout sélectionner

entity add_conv is
	Port ( A : in std_logic_vector(24 downto 0);
                         B : in std_logic_vector(24 downto 0);
                         C : in std_logic_vector(23 downto 0);
	         CLK : in std_logic;
                         result : out std_logic_vector(7 downto 0));
end add_conv;

architecture Behavioral of add_conv is

signal C2 : std_logic_vector(24 downto 0);  
signal result_add : std_logic_vector(24 downto 0); 

begin
process(A,B,C,CLK)
begin
	
	C2(24)<='0';
	C2(23 downto 0)<= C(23 downto 0);
	
	if rising_edge(CLK) then
		result_add<= A + B + C2;
	end if;
end process;

result<=result_add(24 downto 17);

end Behavioral;
Mais lorsque je synthetise j'ai des warning concernant chaque bit que je n'utilise pas pour la sortie:
=>"WARNING:Xst:1291 - FF/Latch <result_add_0> is unconnected in block <add_conv>."

Comment eviter ca?

Voila

Je vous remercie pour votre aide

Sebastien
Preston

Message par Preston »

Salut jeune padawan du VHDL,

Pour ta premiere question: as tu tenter de declarer tes generic dans modelsim avant de lancer une simulation ?

Pour ta deuxieme question: Alors la liste de sensibilité. Elle varie suivant l'utilisation que tu fais .. je m explique. la liste de sensibilité d’un processus doit mentionner tous les signaux lus dans le corps du processus si l’on veut éviter d’inférer des éléments de mémoires lors de la synthèse

Dans ton cas tu utilises un design en flip-flop, en effet en utilisant la commande rising_edge tu vas obtenir des ff (edge c est un flanc, point memoire qui reagit a un flanc d horloge = ff) Bon ton flip flop ne reagit qu a un flanc d horloge et rien d autre !!! donc logiqument ce qui doit se trouver dans ta liste de sensibilite ne doit etre que l horloge et souvent un signal de reset dans ce cas tu ferais un truc du genre

process(clock, reset)
begin
if reset = '1' then
liste de signaux <= '0' ;
else
if clock ='1' and clock'event then
sequencement de tes instructions
end if;
end if;
end process;

Or que se passe t il si tu delcares des signaux sur lesquels tu reagis pas ??
Reponse: un lapin sort du chapeau et un latch se créé !

Tu peux aussi ne rien mettre dans ta liste:

process
begin
wait until CLK = ’1’;
Q <= D;
end process;

Quand mettre des signaux dans ta liste de sensibilité ? machine d etat par exemple ou la, la transition d un etat a un autre se fait via des signaux. ou quand tu veux un process totalement combinatoire la tu dois mettre tout tes signaux dedans.

De la meme maniere qu on a genere un ff au dessus on peut generer un latch.

process(clock)
begin
if clock = '1' then
memoriser
end if;
end process;

N etant pas un jedi du vhdl j espere que mes reponses te seront profitable. Ah oui en bref ce que tu dois faire c est viré tes signaux et laisser le clk. J espere que ca marchera.
serom
NOUVEAU
NOUVEAU
Messages : 2
Inscription : 03 janv. 2006 0:28
Localisation : sydney

Message par serom »

Merci, merci

j'ai compris.

En tout cas je te remercie d'avoir pris le temps de me repondre.

Malheureusement les debuts sont difficiles. A peine ses soucis resolus que deja j'ai cree un nouveau poste :) Peut etre la aussi tu pourra m'aider aussi efficacement :)

encore merci
Répondre