Salut
J'ai encore une question de debutant en VDHL.
Voila je viens de decouvrir a ma grande stupeur que la division n'etait pas une operation aussi evidente que les +,-,*,....
Apres avoir pas mal fais de recherches, j'ai vu que l'operateur " / " est relie a un simple operateur Shift-right. Ce qui veut dire que je ne peux faire que des divisions par des constantes qui sont des puissances de 2. (vous me corrigerai si j'ai faux). De toute facon mon outil de synthese(XILINX XST) refuse cette operation et je ne comprend pas pourquoi: =>error:" can not have such operands in this context"
Mais bon ce n'est pas vraiment mon probleme puisque je souhaite faire une division unsigned par unsigned, ou std_logic_vector par std_logic_vector.
Je me sentirai bien de faire un diviseur par moi meme, mais j'ai de serieux doutes
sur le fait qu'il soit optimum.
Donc je voudrai savoir si quelqu'un aurait un code source d'un diviseur dont je pourrai m'inspirer, ou meme un lien sur l'arithmetique de la division binaire, car je n'ai rien trouver de terrible.
Ou si quelqu'un a une autre suggestion, du genre package, core, ...
Merci d'avance
Division en VHDL
Modérateur : Modérateur
Salut, ton probleme vient de la synthese, si tu veux que xilinx xps prend en compte ton operateur "/" alors il faut preciser dans le fichier contrainte que tu veux un diviseur hardware (ceci dit: pas tous les FPGA ont des diviseur hardware inclus donc l'impossibilite de faire la synthese)
La solution ultime c'est de coder ton diviseur SRT, mais c'est un autre probleme.
Dans les applications embarquee de nos jour, quand on a besoin de faire une division: on le fait avec un uP...
La solution ultime c'est de coder ton diviseur SRT, mais c'est un autre probleme.
Dans les applications embarquee de nos jour, quand on a besoin de faire une division: on le fait avec un uP...
Hello,
La division n est chose easy en hardware
Je te conseil de lire un cours d'architecture de processeur, spécifiquement sur les ALU pour avoir une idée. (Je peux te filer le miens ;o)
A partir de la, tu veux faire un diviseur mais de combien de bit ? Le mieux serait de le faire génériquement et a partir de tes valeurs tu fais un générate de ton diviseur. Ce travail est pas easy pour un débutant je te l'accorde.
Solution .. il existe des ip core sur le net. Tu peux aller sur www.opencores.com et la tu devrais trouver un divider (je confirme j en vois deja 3). Bon attarde toi un peu dessus mais passe pas non plus ton temps a ca, instancie le et utilise le directement. T auras bien le temps de regarder plus tard comment il a été codé.
Bonne chance.
La division n est chose easy en hardware
Je te conseil de lire un cours d'architecture de processeur, spécifiquement sur les ALU pour avoir une idée. (Je peux te filer le miens ;o)
A partir de la, tu veux faire un diviseur mais de combien de bit ? Le mieux serait de le faire génériquement et a partir de tes valeurs tu fais un générate de ton diviseur. Ce travail est pas easy pour un débutant je te l'accorde.
Solution .. il existe des ip core sur le net. Tu peux aller sur www.opencores.com et la tu devrais trouver un divider (je confirme j en vois deja 3). Bon attarde toi un peu dessus mais passe pas non plus ton temps a ca, instancie le et utilise le directement. T auras bien le temps de regarder plus tard comment il a été codé.
Bonne chance.
Division
Pour faire un divison (non signe ) ,d'un maniere non optimal mais simple
il suffit d'avoir un soustracteur , un comparateur , et dess bascule , et un compteur.
si tu veux calculer Q <= A /B .
il suffit de dire
Q<= 0 initilament et
tant que (A>B )
Q<= Q+1
A+ <= A - B (avec un registre )
un coup d'h'orloge
fin tant que
defaut la duree de calcul est % a Q .
il existe un algo un peux plus complique avec des decalages ( x2 ) qui est plus rapide .
on cherche B2 =B * 2 ^ n tel que B2<A et n max.
A<= A-B2 et C <= 2 ^n ; C2 <= C;;
tant que B2!= B
B2<= B2 /2;
C2<= C2 >> 1;
clock ;
si A>B2 alors
{
A<=A -B2;
C<= C+ C2;
// comme quand tu divise a la main
}
fin tant que
A titre d'info la division flottante de A /B est remplace par A * ( 1/B ) (le calcul de 1/B etant plus simple que la division)
il suffit d'avoir un soustracteur , un comparateur , et dess bascule , et un compteur.
si tu veux calculer Q <= A /B .
il suffit de dire
Q<= 0 initilament et
tant que (A>B )
Q<= Q+1
A+ <= A - B (avec un registre )
un coup d'h'orloge
fin tant que
defaut la duree de calcul est % a Q .
il existe un algo un peux plus complique avec des decalages ( x2 ) qui est plus rapide .
on cherche B2 =B * 2 ^ n tel que B2<A et n max.
A<= A-B2 et C <= 2 ^n ; C2 <= C;;
tant que B2!= B
B2<= B2 /2;
C2<= C2 >> 1;
clock ;
si A>B2 alors
{
A<=A -B2;
C<= C+ C2;
// comme quand tu divise a la main
}
fin tant que
A titre d'info la division flottante de A /B est remplace par A * ( 1/B ) (le calcul de 1/B etant plus simple que la division)
division en vhdl
salut serom Tout comme toi je suis un débutant dans le vhdl et en ce qui concerne le code source d'un diviseur j'espère que celui là resoudra ton problème
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use work.all;
entity div8 is
port(clk:in std_logic;
n2:in unsigned(7 downto 0);
n1: in unsigned(7 downto 0);
r: out unsigned(7 downto 0);
start: in std_logic;
rdy: out std_logic;
rst: in std_logic);
end div8;
architecture FSMD of div8 is
begin
process(rst, clk)
type t_state is (repos, calcul);
variable etat: t_state:=repos;
variable a, b, q: unsigned(7 downto 0);
begin if(rst='1') then
etat:=repos;
rdy<='1';
elsif rising_edge(clk)then
case etat is
when repos =>
if (start='1') then
a:=n1; b:=n2; q:="000000000";
etat:= calcul;
rdy<='0' after 5 ns;
end if;
when calcul =>
if (a >= b)then
a:=a-b;
q:=q+1;
else
r<=q;
rdy<='1';
etat: repos;
end if;
when others=>
rdy<='1';
etat:= repoS;
end case;
end if;
end process;
end FSMD;
Je ne peux faire rien d'autre Bat toi mon frère, ce qui ne te tue ppas et rend plus fort. A+
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use work.all;
entity div8 is
port(clk:in std_logic;
n2:in unsigned(7 downto 0);
n1: in unsigned(7 downto 0);
r: out unsigned(7 downto 0);
start: in std_logic;
rdy: out std_logic;
rst: in std_logic);
end div8;
architecture FSMD of div8 is
begin
process(rst, clk)
type t_state is (repos, calcul);
variable etat: t_state:=repos;
variable a, b, q: unsigned(7 downto 0);
begin if(rst='1') then
etat:=repos;
rdy<='1';
elsif rising_edge(clk)then
case etat is
when repos =>
if (start='1') then
a:=n1; b:=n2; q:="000000000";
etat:= calcul;
rdy<='0' after 5 ns;
end if;
when calcul =>
if (a >= b)then
a:=a-b;
q:=q+1;
else
r<=q;
rdy<='1';
etat: repos;
end if;
when others=>
rdy<='1';
etat:= repoS;
end case;
end if;
end process;
end FSMD;
Je ne peux faire rien d'autre Bat toi mon frère, ce qui ne te tue ppas et rend plus fort. A+