opérations_VHDL
Répondre à la discussion
Affichage des résultats 1 à 7 sur 7

opérations_VHDL



  1. #1
    elec_cup
    Invité

    opérations_VHDL


    ------

    Bonjour,

    alors voila, j'ai un std_logic_vector = 100101 (37 en décimal).
    Ce chiffre correspond à une période d'un signal, 37 ns.
    Je voudrais en calculer sa fréquence, (1/37).
    Ici 37 est-il signé ou non ?
    Pour (1/37), peut-on avoir un vecteur de bits représentatif d'un nombre à virgule ?
    Comment faire SVP ?

    Ensuite pour des questions pour la comprehension:

    -Peut-on faire addition, multiplication,... sur des integers, des vecteurs de bits,... ou seulement sur un type bien défini ?
    -Peut-on multiplier un integer avec un std_logic_vector ? Le résultat serait de quel type ?
    -Que signifie cette écriture :

    --For signed numbers:
    --signal s1,s2 : sfixed(4 downto -3);
    --signal s3 : sfixed(5 downto -3);
    --s1 <= to_sfixed (5.75,s1); -- s1 = "00101110" = 5.75
    --s2 <= to_sfixed (-6.5,s2); -- s2 = "11001100" = -6.5
    --s3 <= s1+s2; -- s3 = "111111010" = -0.75

    Pourquoi (4 downto -3 !?)
    Comment retrouve-t-on les (5.75,-6.5,-0.75)?
    Pourquoi s3 à un bit en plus que s1 et s2?

    En vous remerciant

    Cordialement

    DELALIN Ambroise

    -----

  2. #2
    jiherve

    Re : opérations_VHDL

    Bonsoir,
    les calculs peuvent se faire sur des integer, des signed ou des unsigned ou bien des std_logic_vector.
    Le vhdl permet par l'overloading de package de faire des calculs entre n'importe quoi ceci dit c'est une solution pourrie, on rejoint là le coté limite (traduire non sérieux) du C.
    Du VHDL professionnel , certifiable n'utilise que les déclaration suivantes :
    use IEEE.std_logic_1164.all;
    use IEEE.numeric_std.all;
    use IEEE.math_real.all;
    la dernière librairie ne sert qu'a calculer des constantes au moment de la compilation et n'est généralement pas nécessaire.
    Bien sur le code devient verbeux mais au moins les 'cast' sont explicites.
    JR
    l'électronique c'est pas du vaudou!

  3. #3
    elec_cup
    Invité

    Re : opérations_VHDL

    Bonjour,

    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.numeric_std.all;
    use ieee.std_logic_unsigned.all;
    -----
    entity apprendre is
    port(
    wave_out : out std_logic_vector
    );
    end entity;
    -----
    architecture app of apprendre is
    signal a : std_logic_vector (2 downto 0) :="000";
    signal b : std_logic_vector (2 downto 0) :="000";
    signal c : std_logic_vector (2 downto 0) :="000";
    signal clock : std_logic :='0';
    -----
    begin
    -----
    process (clock)
    variable x : std_logic_vector (2 downto 0) :="000";
    begin
    x := a+1;
    a <= a+1;
    b <= a;
    c <= a;
    end process;
    -----
    process
    begin
    wait for 10 ns;
    clock<='1';
    wait for 10 ns;
    clock<='0';
    end process;
    -----
    end app;

    -------------------------

    Je souhaiterais savoir comment déclarer a,b et c en tant que std_logic_vector, mais de type unsigned, sans utiliser la librairie use ieee.std_logic_unsigned.all;

    Pourquoi cette librairie n'est-elle pas recommandé à l'utilisation ?

    Je me suis renseigné, et les librairies std_logic_arith et std_logic_signed sont, elles aussi, pas recommandées. Pourquoi ?

    Cordialement

    DELALIN Ambroise

  4. #4
    peter pan666

    Re : opérations_VHDL

    Salut,

    Je suppose que tu programmes sous Quartus, si c'est le cas le mieux c'est de le faire en schéma bloc, y a des bloc de fonction déjà tout fait t'as juste à raccorder des fils et à faire deux trois réglages...

    Après tu peux créer tes propres composants et les assembler, y a vraiment de quoi faire des trucs bien complexe mais c'est plus facile à mettre en oeuvre (je trouve).

  5. A voir en vidéo sur Futura
  6. #5
    jiherve

    Re : opérations_VHDL

    Bonjour,
    tu peux écrire:
    a <= std_logic_vector(unsigned(a)+1 );
    pas besoin de la librairie : std_logic_unsigned, les deux autres librairies suffisent
    c'est verbeux mais au moins pas de risque sur la taille.
    Ceci dit avec une déclaration a : unsigned(2 downto 0) on obtient le même résultat.
    Le risque avec des déclaration multiples de librairie c'est la confusion qui peut exister au niveau de certains opérateurs, il est par exemple possible de définir l'addition de std_logic_vector entre eux avec des unsigned, des signed, des integer, et au bout du compte on ne sait plus ce que l'on fait , en particulier des troncatures sauvages peuvent apparaitre. Make it simple!

    Personnellement je suis assez défavorable à l'approche schéma car cela n'est guère portable.
    JR
    l'électronique c'est pas du vaudou!

  7. #6
    elec_cup
    Invité

    Re : opérations_VHDL

    Bonjour,

    ok, merci, ça fonctionne maintenant ! Ensuite, j'aurais d'autres questions à vous posez:
    ----------------------------------------------------------------library ieee;
    use ieee.std_logic_1164.all;
    use ieee.numeric_std.all;
    use ieee.std_logic_unsigned.all;
    -----
    entity apprendre is
    end entity;
    -----
    architecture app of apprendre is
    signal a : signed (3 downto 0) :="1100";
    signal b : signed (3 downto 0) :="1011";
    signal c : signed (3 downto 0) :="0000";
    signal d,e,f : integer :=0;
    -----
    begin
    -----
    process
    begin
    wait for 10 ns;
    d<=to_integer(signed(a));
    e<=to_integer(signed(b));
    c<=a+b;
    f<=to_integer(signed(a+b));

    end process;
    -----
    end app;
    -----------------------------------------------------------------

    Ok pour d=-4
    Pourquoi e=-5, il devrait être égal à -3 non ?
    Ensuite il y a un problème avec c car on me dit que pour l'addition de a et b, la longueur de c doit être égale à celle de a et de b, donc lors de l'addition on omet la carry, représentative du signe du vecteur.
    Ainsi f=7, mais il devrait être égal à -7 !
    Comment faire SVP !

    Cordialement

    DELALIN Ambroise

  8. #7
    jiherve

    Re : opérations_VHDL

    Bonsoir,
    en signé "1011" est égal à -5 voir complément à deux.
    ensuite pour f avec 4 bits signés on ne peut exprimer que des nombres compris entre 7 et -8 or -4 + -5 = -9 on ne peut donc pas le représenter car il faut un bit supplémentaire, par défaut le compilateur utilise la taille d'origine "1100" + "1011" = "10111" mais le le bit de signe saute,
    si tu écris f <= to_integer(a) + to_integer(b) miracle!
    Cela te fait toucher du doigt tout ce que je t'ai écrit en amont.
    JR
    l'électronique c'est pas du vaudou!

Découvrez nos comparatifs produits sur l'informatique et les technologies.