Función de transición VHDL [cerrado]

-1

Me encargaron la creación de una función "transiciones" que toma como entrada un valor de tipo std_logic de longitud arbitraria. El valor devuelto debe ser un número entero que registre el número de transiciones (0 → 1 o 1 → 0) a medida que escanea el patrón de bits binarios de izquierda a derecha (o de derecha a izquierda). Por ejemplo, el valor 0110010011 devolvería 5; el valor 001 devolvería 1.

A continuación hay un fragmento de código VHDL que puede usar para probar su función. Agregue su función al código y simule para verificar que su código esté dando el resultado correcto. Muestra tu código y los resultados de la simulación. En su simulación, muestre los primeros 100 ns, con t2, t4, t6 y t8, todos mostrados como decimal con signo o sin signo, y los datos mostrados como binarios.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity test_transitions is
end test_transitions;

architecture Behavioral of test_transitions is
  signal data: std_logic_vector (7 downto 0):="01111100";
  signal t8, t6, t4, t2: integer;
begin
  tt: process
  begin
    wait for 10 ns;
    data <= data+1;
  end process tt;

  t8 <= transitions(data);
  t6 <= transitions(data(5 downto 0));
  t4 <= transitions(data(3 downto 0));
  t2 <= transitions(data(1 downto 0));

end Behavioral;

Esto es lo que codifiqué, pero sigo recibiendo varios errores de sintaxis cuando realizo la Prueba de Sintaxis de Verificación de Comportamiento en Xilinx ISE Design Suite. Cualquier ayuda sería apreciada grandemente.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity TransitionFunction is
end TransitionFunction;

architecture Behavioral of TransitionFunction is

  function transition(signal data: in std_logic) return integer is 
    variable count: integer;
  begin
    count:= 0;
    for i in data'range loop
      if data(i) /= data(i+1) then
        count := count + 1;
      end if;
    end loop;
    return count;
  end transition;

  signal data: std_logic_vector(7 downto 0):="01111100";
  signal t8, t6, t4, t2: integer;
begin

  tt:   process
  begin
    wait for 10 ns;
    data <= data+1;
  end process tt;

  t8 <= transitions(data);
  t6 <= transitions(data(5 downto 0)));
  t4 <= transitions(data(3 downto 0)));
  t2 <= transitions(data(1 downto 0))); 

end Behavioral;

Mensajes de error:

    
pregunta Sofia Zapata

1 respuesta

0

Por un lado, verifique los parámetros de entrada de su función.

function transition(signal data: in std_logic) return integer is

debería ser

function transition(signal data: in std_logic_vector) return integer is

Luego, en el cuerpo principal, estás intentando usar una función transitions , que no existe. Debe ser transition . O cambia el nombre de tu función.

Finalmente, tienes demasiados paréntesis de cierre en

t6 <= transitions(data(5 downto 0))); , etc ...

Nota: al corregirlos se borrarán los errores de sintaxis. Esto no significa necesariamente que su código hará lo que usted espera.

editar - por comentarios:
  

Creo que debido a (i + 1)

Correcto. Su índice vectorial se basa en 0, es decir, data(0) es el bit 1 st , y data(data'length-1) es su último bit.

El atributo range de un std_logic_vector te da (n downto 0) . Por ejemplo:

SIGNAL x : STD_LOGIC_VECTOR (7 downto 0);
-- x'RANGE = (7 downto 0)

Entonces, cuando el bucle llegue al final y i=7 , su data(i+1) siempre intentará acceder a un índice que está fuera de los límites del vector.

  

Intenté limitar el índice para que se detenga en 6 con la línea "for i in 0 to 6 loop"

Esto no va a funcionar en ninguno de estos casos:

  t6 <= transition(data(5 downto 0)));
  t4 <= transition(data(3 downto 0)));
  t2 <= transition(data(1 downto 0)));

Lo que quieres es asegurarte de que tu bucle siempre se repita en data'length-2 , de modo que cuando i=data'length-2 , i+1 = data'length-1 , que es el último índice posible de tu vector.

Entonces,

for i in 0 to data'length-2 loop
  if data(i) /= data(i+1) then
    count := count + 1;
  end if;
end loop;

Tenga en cuenta que esto también funcionará para vectores de 1 bit:

t1 <= transition(data(0 downto 0));

En este caso, el bucle for simplemente se omitirá, y count regresará con su valor inicializado count := 0 , lo cual tiene sentido ya que no habrá transiciones contables.

    
respondido por el Blair Fonville

Lea otras preguntas en las etiquetas