[Numérique] VHDL - output en std_logic_vector(3 downto 0)
Répondre à la discussion
Affichage des résultats 1 à 18 sur 18

VHDL - output en std_logic_vector(3 downto 0)



  1. #1
    Momo54500

    VHDL - output en std_logic_vector(3 downto 0)


    ------

    Bonjour à tous,

    je tentais de réaliser un bloc en vhdl qui prend simple chaque valeur de 2 vecteurs et effectue un "et" logique entre eux, le tout dans un vecteur également.
    Pourtant, lorsque je simule la sortie est inconnue.

    Voilà le code VHDL

    Code:
    library IEEE;
    library work;
    use IEEE.STD_LOGIC_1164.all;
    use IEEE.numeric_std.all;
    use work.type_package.all;
    use work.func_package.all;
    use work.all;
    
    Entity toto is
    port(
        CLK : in std_logic;
        RESET_N : in std_logic;
        A   : in std_logic_vector(3 downto 0);
        B   : in std_logic_vector(3 downto 0);
        C   : out std_logic_vector(3 downto 0)
    );
    end entity;
    
    Architecture RTL of toto is
    
    
    --Signal
    signal data_out : std_logic_vector(3 downto 0); 
    
    begin
    
    process(CLK)
    begin
    
    if(RESET_N = '0') then
        data_out <=  (others =>'0');
    
    elsif(rising_edge(CLK)) then
        data_out(2) <= A(2) and B(2);
        data_out(1) <= A(1) and B(1);
        data_out(1) <= A(1) and B(1);
    end if;
    
    end process;
    
    C <= data_out;
    
    end architecture;
    Et voilà le code du testbench :

    Code:
    library IEEE;
    library work;
    use ieee.std_logic_1164.all;
    use ieee.numeric_std.all;
    use work.all;
    
    
    Entity testbench_toto is
    end entity;
    
    Architecture TB of testbench_toto is
    
    --Signaux
    signal t_clk, t_rstn : std_logic;
    signal t_a, t_b, t_c  : std_logic_vector(3 downto 0);
    
    
    begin
    
    U1 :  entity toto(RTL) port map(t_clk, t_rstn, t_a, t_b, t_c);
    
    process
    begin
    
    t_clk <= '0';
    wait for 62 ns;
    t_clk <= '1';
    wait for 62 ns;
    
    end process;
    
    t_rstn <= '1';
    
    t_a <= "0011",
        "0101" after 62 ns,
        "1000" after 124 ns,
        "1010" after 186 ns;
    
    t_b <= "1011",
        "0111" after 62 ns,
        "1100" after 124 ns,
        "1110" after 186 ns;
    end architecture;
    Cependant je n'obtiens pas le comportement souhaité et je ne sais pas du tout d'où vient le problème.[

    Nom : x7ssM.jpg
Affichages : 359
Taille : 64,7 Ko

    -----
    Dernière modification par Antoane ; 22/05/2022 à 12h05. Motif: réparation balise [attach]

  2. #2
    jiherve

    Re : VHDL - output en std_logic_vector(3 downto 0)

    bonjour,
    Ah les ravages du copié collé et des reset asthmatiques !
    JR
    l'électronique c'est pas du vaudou!

  3. #3
    polo974

    Re : VHDL - output en std_logic_vector(3 downto 0)

    Le vecteur fait 4 de large.

    La logique est déclarée pour 2, avec une répétition.

    L'horloge et les data bougent en même temps.

    C'est pas logique tout ça...
    Jusqu'ici tout va bien...

  4. #4
    Momo54500

    Re : VHDL - output en std_logic_vector(3 downto 0)

    Bonjour, que voulez vous dire ? Il fallait que je mette le reset à 0 au début ?

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

    Re : VHDL - output en std_logic_vector(3 downto 0)

    re
    ben oui sinon le
    if(RESET_N = '0')
    se repose un max!
    ensuite:
    data_out(2) <= A(2) and B(2);
    data_out(1) <= A(1) and B(1);
    data_out(1) <= A(1) and B(1);
    me semble erroné sur la dernière ligne!
    et il manque un bit.
    et comme souligné par polo le test bench est problématique.
    JR
    Dernière modification par jiherve ; 21/05/2022 à 13h03.
    l'électronique c'est pas du vaudou!

  7. #6
    JPL
    Responsable des forums

    Re : VHDL - output en std_logic_vector(3 downto 0)

    Il est notifié dans les messages importants en tête du forum de programmation que les sujets sur VDHL doivent être postés dans le forum Électronique : https://forums.futura-sciences.com/p...ml#post3303199.
    Rien ne sert de penser, il faut réfléchir avant - Pierre Dac

  8. #7
    Momo54500

    Re : VHDL - output en std_logic_vector(3 downto 0)

    Bonjour,

    merci pour vos réponses.
    Oui en effet je viens de remarquer aussi qu'il manquait un bit.
    Que faudrait-il modifier exactement dans le testbench? Le reset et le changement de data?

    Merci à vous.

  9. #8
    jiherve

    Re : VHDL - output en std_logic_vector(3 downto 0)

    re
    oui pour le reset exemple:
    t_rstn <= '0','1' after 200ns;

    ton horloge a une periode de 124ns donc les stimulis ne peuvent changer plus vite compte tenu de ton besoin or c'est le cas et ensuite il faut faire en sorte de bien émuler des signaux réels, donc si tes valeurs de test sont censées être issues d'un autre étage logique alors elles doivent changer un petit peu après un front d'horloge (montant ou descendant au choix) dans la vraie vie cela assure les Tsu et Th des bascules du FPGA en simulation il faut avoir un "delta".
    Fais un chronogramme à la main et tu trouveras les bonnes valeurs.
    JR
    l'électronique c'est pas du vaudou!

  10. #9
    Momo54500

    Re : VHDL - output en std_logic_vector(3 downto 0)

    Re,
    merci à vous pour votre réponse.
    Oui en effet c'est pas logique, je vais essayer de changer le testbench.

  11. #10
    Momo54500

    Re : VHDL - output en std_logic_vector(3 downto 0)

    Rebonjour,

    merci à vous pour votre aide, et j'ai pu obtenir un chronogramme qui me parait cohérent.
    J'avais également une autre question :
    j'ai réalisé un bloc SPI (Serial peripheral Interface) pour pouvoir envoyer des données en série. Cependant lorsque je lance mon chronogramme, et malgré plusieurs changements dans le testbench, je n'arrive pas à obtenir le résultat attendu. J'ai dessiné le chronogramme sur feuille, du coup comme vous pouvez le voir dans le code VHDL, on souhaite envoyer les données tous les 4 coups d'horloge.

    Voilà le code VHDL du bloc SPI :


    Code:
    library IEEE;
    use IEEE.STD_LOGIC_1164.all;
    use IEEE.numeric_std.all;
    
    
    entity SPI is
      generic (
       NB_BIT_TO_SEND : in  integer range 1 to 255);                          -- Number of bit of the serial transfer 
      port (                                                                  
        RST_N         : in  std_logic;                                        -- Reset signal
        MCLK          : in  std_logic;                                        -- Master clock signal (32MHz)
        SS_N          : in  std_logic;                                        -- SPI chip select 
       -- SCLK          : in  std_logic;                                        -- SPI clock 
        DATA_TO_SEND  : in  std_logic_vector(NB_BIT_TO_SEND-1 downto 0);      -- Data input
        SPI_OUT       : out std_logic);                                       -- Serial data output, DATA_TO_SEND'LSB first
    end SPI;
    
    architecture RTL of SPI is
    
    signal cnt_clk      : integer range 0 to NB_BIT_TO_SEND+1;
    
    begin
    	process(MCLK,RST_N)
      begin                                               
    		if (RST_N  = '0')      then    
          SPI_OUT  <= '0';
          cnt_clk  <=  0 ;
     		elsif (rising_edge(MCLK)) then  
          if(SS_N = '0')  then   -- SCLK rising_edge
            cnt_clk <= cnt_clk + 1 ;
            if (cnt_clk < NB_BIT_TO_SEND)    then 
              SPI_OUT   <= DATA_TO_SEND(cnt_clk);
            elsif (cnt_clk = NB_BIT_TO_SEND) then   
              cnt_clk   <= 0;
            end if;
          end if;
        end if;
    	end process;
      
    
    end RTL;
    Voilà le code du testbench :

    Code:
    library IEEE;
    library work;
    use ieee.std_logic_1164.all;
    use ieee.numeric_std.all;
    use work.all;
    
    Entity testbench_SPI is
    end entity;
    
    Architecture TB of testbench_SPI is
    
    --Signaux
    signal t_rstn		: std_logic;
    signal t_mclk		: std_logic;
    signal t_ss		: std_logic;
    --signal t_sclk		: std_logic;
    signal t_data_in	: std_logic_vector(3 downto 0);
    signal t_data_out	: std_logic;
    
    --Component
    component SPI is
      generic (
       NB_BIT_TO_SEND : in  integer range 1 to 255);                          -- Number of bit of the serial transfer 
      port (                                                                  
        RST_N         : in  std_logic;                                        -- Reset signal
        MCLK          : in  std_logic;                                        -- Master clock signal (32MHz)
        SS_N          : in  std_logic;                                        -- SPI chip select 
        --SCLK          : in  std_logic;                                        -- SPI clock 
        DATA_TO_SEND  : in  std_logic_vector(NB_BIT_TO_SEND-1 downto 0);      -- Data input
        SPI_OUT       : out std_logic);                                       -- Serial data output, DATA_TO_SEND'LSB first
    end component;
    
    begin
    
    SPI_bloc : SPI generic map(4) port map(t_rstn, t_mclk, t_ss, t_data_in, t_data_out);
    
    --Reset
    t_rstn		<= '0', '1' after 200 ns;
    
    --Master Clock
    Master_Clock : process
    begin
    
    t_mclk  	<= '1';
    wait for 31.25 ns;
    t_mclk 		<= '0';
    wait for 31.25 ns;
    
    end process;
    
    
    -- Chip Select
    t_ss 		<= '1',  '0' after 200 ns;
    
    --Input data
    t_data_in	 <=     "0011",  
    			"1100" after 260 ns,
    			"1000" after 520 ns,
    			"1011" after 780 ns,
    			"1101" after 1040 ns,
    			"1001" after 1300 ns,
    			"1010" after 1560 ns,
    			"0101" after 1820 ns,
    			"0011" after 2080 ns,
    			"1001" after 2340 ns,
    			"1111" after 2600 ns,
    			"1011" after 2820 ns;
    			
    
    end architecture;
    Et voilà la simulation :

    Nom : Capture3.jpg
Affichages : 269
Taille : 59,0 Ko

    Merci à vous.

    La simulation obtenue n'est pas bonne, car comme on peut le voir, pour le premier nombre qui est 3 donc "0011" on aurait du obtenir '1', '0', '0', '0', or on obtient '1', '0', '1', '1'

  12. #11
    jiherve

    Re : VHDL - output en std_logic_vector(3 downto 0)

    bonjour,
    il manque un signal de retour entre l'entité SPI et le test bench car tu ne peux pas changer la donnée à émettre avant que celle ci ne soit émise, donc ton signal t_ss ne doit pas être un état permanent et les données ne doivent changer que si l’émetteur est libre.
    Le test bench doit donc être synchronisé .
    JR
    l'électronique c'est pas du vaudou!

  13. #12
    Momo54500

    Re : VHDL - output en std_logic_vector(3 downto 0)

    Bonjour,

    merci à vous pour votre réponse. Que voulez vous dire par signal de retour? le signal t_ss passe automatiquement à '1' lorsque l'on a atteint la valeur du compteur nan?

  14. #13
    jiherve

    Re : VHDL - output en std_logic_vector(3 downto 0)

    re
    ben non où est ce écrit?
    t_ss <= '1', '0' after 200 ns;
    il n'y a rien de plus!
    JR
    l'électronique c'est pas du vaudou!

  15. #14
    Momo54500

    Re : VHDL - output en std_logic_vector(3 downto 0)

    Ah oui je vois.
    Donc il faut que je rajoute un signal dans l'architecture qui repasse à 0 quand le compteur a fini de compter?

    Momo54500

  16. #15
    Momo54500

    Re : VHDL - output en std_logic_vector(3 downto 0)

    Ah oui j'ai compris ce que vous voulez dire, je change directement dans le testbench en mettant par exemple :

    t_ss <= '1' after (62.5 * 4) ns ?

  17. #16
    Momo54500

    Re : VHDL - output en std_logic_vector(3 downto 0)

    Re,

    voilà le testbench que j'ai effectué :

    Code:
    library IEEE;
    library work;
    use ieee.std_logic_1164.all;
    use ieee.numeric_std.all;
    use work.all;
    
    Entity testbench_SPI is
    end entity;
    
    Architecture TB of testbench_SPI is
    
    --Signaux
    signal t_rstn		: std_logic;
    signal t_mclk		: std_logic;
    signal t_ss		: std_logic;
    --signal t_sclk		: std_logic;
    signal t_data_in	: std_logic_vector(3 downto 0);
    signal t_data_out	: std_logic;
    
    --Component
    component SPI is
      generic (
       NB_BIT_TO_SEND : in  integer range 1 to 255);                          -- Number of bit of the serial transfer 
      port (                                                                  
        RST_N         : in  std_logic;                                        -- Reset signal
        MCLK          : in  std_logic;                                        -- Master clock signal (32MHz)
        SS_N          : in  std_logic;                                        -- SPI chip select 
        --SCLK          : in  std_logic;                                        -- SPI clock 
        DATA_TO_SEND  : in  std_logic_vector(NB_BIT_TO_SEND-1 downto 0);      -- Data input
        SPI_OUT       : out std_logic);                                       -- Serial data output, DATA_TO_SEND'LSB first
    end component;
    
    begin
    
    SPI_bloc : SPI generic map(4) port map(t_rstn, t_mclk, t_ss, t_data_in, t_data_out);
    
    --Reset
    t_rstn		<= '0', '1' after 62.5 ns;
    
    --Master Clock
    Master_Clock : process
    begin
    
    t_mclk  	<= '1';
    wait for 31.25 ns;
    t_mclk 		<= '0';
    wait for 31.25 ns;
    
    end process;
    
    
    -- Chip Select
    t_ss 		<= '1',  '0' after 62.5 ns; -- '1' after ;
    
    --Input data
    t_data_in	 <=     "0001",  
    			"0011" after 62.5  ns,
    			"1011" after 312.5 ns,
    			"1000" after 562.5 ns; 			
    
    end architecture;
    Et voilà le résultat obtenu :

    Capture5.jpg

    Et voilà ce quid devrait être le résultat (sans prendre en compte les temps de setup et hold time) :

    Capture6.jpg

  18. #17
    Momo54500

    Re : VHDL - output en std_logic_vector(3 downto 0)

    Re,

    je suis revenu sur le premier bloc et il semblerait que je me sois trompé et qu'l y ait une erreur dans la simulation puisqu'elle ne donne pas la bonne valeur en sortie.

    Voilà ce que j'obtiens :

    Nom : Capture9.jpg
Affichages : 277
Taille : 69,6 Ko

    J'ai mis en bleu ce que j'aurais du obtenir.

    Et voilà le code du testbench :

    Code:
    library IEEE;
    library work;
    use ieee.std_logic_1164.all;
    use ieee.numeric_std.all;
    use work.all;
    
    
    Entity testbench_exemple_1 is
    end entity;
    
    Architecture TB of testbench_exemple_1 is
    
    --Signaux
    signal t_clk, t_rstn : std_logic;
    signal t_a, t_b, t_c  : std_logic_vector(3 downto 0);
    
    --Component
    component exemple_1 is
    port(
    	CLK	: in std_logic;
    	RESET_N	: in std_logic;
    	A 	: in std_logic_vector(3 downto 0);
    	B 	: in std_logic_vector(3 downto 0);
    	C 	: out std_logic_vector(3 downto 0)
    );
    end component;
    
    begin
    
    U1 :   exemple_1 port map(t_clk, t_rstn, t_a, t_b, t_c);
    
    process
    begin
    
    t_clk <= '1';
    wait for 31.25 ns;
    t_clk <= '0';
    wait for 31.25 ns;
    
    end process;
    
    t_rstn <= '0', '1' after 62.5 ns;
    
    t_a <= "0011",
    	"0101" after 62.5 ns,
    	"1000" after 125 ns,
    	"1010" after 187.5 ns;
    
    t_b <= "1011",
    	"0111" after 62.5 ns,
    	"1100" after 125 ns,
    	"1110" after 187.5 ns;
    end architecture;
    Je ne vois pas bien d'où peut provenir l'erreur.

    Merci à vous.

  19. #18
    Momo54500

    Re : VHDL - output en std_logic_vector(3 downto 0)

    Re,

    je réactualise le fil

Discussions similaires

  1. [Exercices] Conversion std_logic_vector en décimal vhdl
    Par Momo54500 dans le forum Électronique
    Réponses: 1
    Dernier message: 27/07/2021, 11h47
  2. [Programmation] Problème en VHDL avec les multi fichiers vhdl
    Par invitecea2057a dans le forum Électronique
    Réponses: 2
    Dernier message: 02/02/2016, 12h32
  3. vhdl std_logic_vector (X downto 0) ???
    Par inviteb4ec01d1 dans le forum Électronique
    Réponses: 2
    Dernier message: 21/04/2015, 13h03
  4. hexadecimal to std_logic_vector
    Par invitef7520bd9 dans le forum Électronique
    Réponses: 0
    Dernier message: 30/12/2013, 16h20
  5. signed unsigned std_logic_vector vhdl
    Par invite938b5933 dans le forum Électronique
    Réponses: 1
    Dernier message: 13/07/2010, 21h26
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...