La señal se vuelve indefinida cuando se usa en el proceso

-2

Estoy teniendo problemas con este código VHDL donde el valor de new_state no se transfiere a la señal state_cnt y, en cambio, se está volviendo indefinido.

¿Qué necesito cambiar para que esto funcione?

Library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_signed.all;
use ieee.std_logic_arith.all;

entity test_controller is
  port (
    clk, reset, wr : in std_logic;
    wr_data : in std_logic_vector(31 downto 0)
    op_a, op_b, op_c : out std_logic_vector(31 downto 0)
  ); 
end test_controller;
architecture rtl of test_controller is

signal busy : std_logic := '0';
signal state_cnt : std_logic_vector(1 downto 0) := "00";

begin

   input_proc : process(wr)
     variable new_state : integer; 
     begin
        if rising_edge(wr) then
          if busy = '0' then
            if state_cnt = "00" then
              op_a <= wr_data;
              new_state := 1;
            elsif state_cnt = "01" then
              op_b <= wr_data;
              new_state := 2;
            elsif state_cnt = "10" then
              op_c <= wr_data;
              busy <= '1';
              new_state := 0;
            end if;
            state_cnt <= conv_std_logic_vector(new_state,2);
         end if;
        end if;
     end process;
end rtl;

Testbench

Library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_signed.all;
use ieee.std_logic_arith.all;

entity tb_test_controller is

end tb_test_controller;

architecture exercise of tb_test_controller is

  component test_controller

      port (
            clk, reset, wr : in std_logic;
            wr_data : in std_logic_vector(31 downto 0);
        op_a, op_b, op_c : out std_logic_vector(31 downto 0)

  ); 

  end component;

  signal clk_i :  std_logic;
  signal reset_i : std_logic;
  signal wrdata_i : std_logic_vector(31 downto 0);
  signal op_a_i : std_logic_vector(31 downto 0);
  signal op_b_i : std_logic_vector(31 downto 0);
  signal op_c_i : std_logic_vector(31 downto 0);
  signal wr_i : std_logic;

  constant CLK_PERIOD : time := 20 ns;
  constant DLY : time := CLK_PERIOD*2;

  begin

    clkmeProc : process
      begin
        clk_i <= '1';
        wait for CLK_PERIOD/2;
        clk_i <= '0';
        wait for CLK_PERIOD/2;
      end process;
    resetmeProc : process
      begin
        wait for DLY;
        reset_i <= '1';
        wait for CLK_PERIOD;
        reset_i <= '0';
        wait;
      end process;
    inputDataProc : process
      begin
        wait on reset_i until reset_i = '0';
        for i in 0 to 10 loop
          wrdata_i <= conv_std_logic_vector(i, 32);
          wr_i <= '1';
          wait for CLK_PERIOD;
          wr_i <= '0';
          wait for CLK_PERIOD;
         end loop;
      end process;     


      DUT : test_controller
      port map
      (
        clk =>clk_i,
        reset => reset_i,
        wr_data => wrdata_i,
        wr => wr_i,
        op_a => op_a_i,
        op_b => op_b_i,
        op_c => op_c_i
      );
    stimProc : process
      begin
        wait;
      end process;

  end exercise;

    
pregunta slasher53

2 respuestas

2

Su código no estaba completo, faltan las declaraciones de puerto de salida de modo para op_a , op_b y op_c de la entidad test_controller.

Aparentemente, utilizando un simulador diferente y luego de corregir la discrepancia en su código, obtengo una respuesta diferente.

No tienes etiquetas ni pistas reales cuya herramienta estás utilizando. Su forma de onda no coincide con el código (corregido) que ha publicado (y se supone que VHDL es portátil).

Lo único que veo mal aquí es que su banco de pruebas debería proporcionar un valor predeterminado para wr_i de '0'. La función rising_edge no verá la transición de 'U' a '1' como un flanco ascendente.

Este tipo de dice que tienes problemas con las herramientas (confío en esta implementación de VHDL aquí).

Proporcione más información sobre la herramienta que está utilizando y proporcione formas de onda que coincidan con su código real que proporcionó.

Mientras tanto, puede ver si el cambio de Paebbel se simula correctamente.

Tenga en cuenta que no tiene nada que asigne el valor de busy a un '0'.

    
respondido por el user8352
2

Transformé tu test_controller en una versión más simple. Utiliza un contador y una declaración de caso. No hay necesidad de variables o conversiones de tipo.

architecture rtl of test_controller is
  signal busy : std_logic := '0';
  signal state_cnt : UNSIGNED(1 downto 0) := "00";
begin
  input_proc : process(wr) 
  begin
    if rising_edge(wr) then
      if busy = '0' then
        state_cnt <= state_cnt +1;
        case state_cnt is
          when 0 =>      op_a <= wr_data;
          when 1 =>      op_b <= wr_data;
          when 2 =>      op_c <= wr_data;
                                 busy <= '1';
          when others => null;
        end case;
      else
        state_cnt <= (others => '0'); 
      end if;
    end if;
  end process;
end rtl;
    
respondido por el Paebbels

Lea otras preguntas en las etiquetas