Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
Altri Linguaggi - VHDL: problema con un registro invertitore
Forum - Altri Linguaggi - VHDL: problema con un registro invertitore

Avatar
Manu89 (Normal User)
Newbie


Messaggi: 12
Iscritto: 07/09/2009

Segnala al moderatore
Postato alle 17:24
Domenica, 15/05/2011
Buongiorno!
Ho cercato sul forum, ma ho visto che non c'è nulla riguardo il VHDL, però potrebbe esserci qualcuno che lo conosce.
Sono diversi giorni che sto letteralmente sclerando per un problema di simulazione.
Dovrei fare un semplice registro che inverte il byte che gli arriva in ingresso.
Dalla simulazione dell'oggetto interno sembrerebbe funzionare, ma appena lo inserisco in un testbench non riesco a farlo comunicare fuori. Ora vi posto il codice, ho commentato dove potrebbe essere il problema, cioè, wordout è sempre Undefined nella simulazione.
Ho trasferito il registro invertitore nel testbench solo per vedere i nodi interni
Codice sorgente - presumibilmente Delphi

  1. LIBRARY ieee;
  2. USE ieee.std_logic_1164.ALL;
  3. USE ieee.std_logic_unsigned.ALL;
  4.  
  5. entity tb_reverseline is
  6.  
  7. end tb_reverseline;
  8.  
  9. architecture tb of tb_reverseline is
  10.  
  11.   --component reverseline
  12. --    port(ingresso, rst_n, clk, en : in std_logic;
  13. --         uscita : out std_logic);
  14. --  end component;
  15.  
  16.   signal wordin : std_logic_vector(7 downto 0) := "10011010";
  17.   signal wordout: std_logic_vector(7 downto 0);
  18.   signal clk_0  : std_logic := '0';
  19.   signal start  : std_logic;
  20.   signal rst_sys: std_logic;
  21.   signal Q    : std_logic_vector(7 downto 0);
  22.  
  23.   begin
  24.     --reverser: reverseline
  25. --      port map(ingresso => wordin(7),
  26. --               rst_n => rst_sys,
  27. --               clk => clk_0,
  28. --               en => start,
  29. --               uscita => wordout(0));
  30.                          
  31.   clk_0 <= not clk_0 after 10 ns;
  32.                
  33.   reset_wave: process
  34.     begin
  35.  
  36.     rst_sys <= '0';
  37.     wait for 42 ns;
  38.     rst_sys <= '1';
  39.     wait for 1000 ns;
  40.  
  41.   end process reset_wave;
  42.  
  43.   enable_wave: process
  44.     begin
  45.      
  46.     start <= '1';
  47.     wait for 10 ns;
  48.     start <= '0';
  49.     wait for 54 ns;
  50.     start <= '1';
  51.     wait for 500 ns;
  52.     start <= '0';
  53.    
  54.   end process enable_wave;
  55.  
  56.   -- questo process rappresenta nient'altro che 2 buffer
  57.  -- uno all'ingresso e uno all'uscita del registro invertitore
  58.  -- è proprio questo che mi dà il problema
  59.  trasmissione: process(clk_0,rst_sys,start)
  60.    variable c: integer := 0;
  61.    begin
  62.      
  63.       if rising_edge(clk_0) and rst_sys = '1' then
  64.        if start = '1' then
  65.          if c = 8 then
  66.            c := 0;
  67.            wordout(0) <= '0';
  68.          else
  69.          c := c + 1;
  70.          wordin(0) <= wordin(1) xor wordin(6);
  71.          wordout(0) <= Q(Q'left);
  72.           for i in 0 to 6 loop
  73.             wordin(i+1) <= wordin(i);
  74.             wordout(i+1) <= wordout(i);
  75.           end loop;
  76.           end if;
  77.         end if;
  78.       end if;
  79.    
  80.    end process trasmissione;
  81.    
  82.    -- questo è il registro invertitore
  83.    rx : process(CLK_0, RST_sys, start)
  84.     --variabile che fa scattare l'operazione di conversione;
  85.    --potrebbe diventare un contatore
  86.      variable count: integer;
  87.      
  88.      begin  
  89.    --effetto del reset e dell'enable asincrono
  90.         if RST_SYS = '0' or start = '0' then
  91.           Q <= (others => '0');
  92.           count := 0;
  93.         elsif rising_edge(clk_0) then
  94.           count := count + 1;
  95.           if count = 9 then
  96.             for i in 0 to Q'left loop
  97.              Q(i) <= Q(Q'left - i);
  98.             end loop;
  99.             count := 0;
  100.             wordout(0) <= '1';
  101.           else
  102.             Q(0) <= wordin(7);
  103.             for i in 1 to Q'left loop
  104.              Q(i) <= Q(i-1);
  105.            end loop;
  106.            --wordout(0) <= Q(Q'left);
  107.           end if;
  108.          
  109.          
  110.         end if;
  111.        
  112.       end process rx;
  113.      
  114.      
  115.    
  116.  end architecture tb;


PM