problema de registro de desplazamiento en VHDL

2

Estoy diseñando un registro de desplazamiento de 56 bits para almacenar los bits que entran.

En mi sistema, los datos de 8 bits siguen llegando desde un generador y necesito emitir el valor máximo detectado con 3 bytes a cada lado. Quiero que los datos se almacenen en un registro de desplazamiento de 56 bits para dar una salida Ponga eso consiste en el máximo y los otros 7 bytes como se muestra en el gráfico.

El sistema compara cada byte que llega con un valor máximo temporal y dará una salida de 56 bits cada vez que se detecte un nuevo valor máximo.

Me pregunto cómo puedo mantener los nuevos datos entrantes en el centro, por lo que, una vez que se descubra que los nuevos datos son mayores que el máximo temporal, puedo eliminar toda la señal serial de 56 bits. .

Intenté escribir algo, pero Modelsim me dio esto

  

El tipo de destino ieee.std_logic_1164.STD_LOGIC_VECTOR en la asignación de señal es diferente del tipo de expresión ieee.NUMERIC_STD.SIGNED. para temp_shift_register (31downto 24) .....

shift : process (clk)
begin
  if rising_edge(clk) and begin_req ='1' then 
    for i in 55 downto 8 loop 
      temp_shift_register(i) <= temp_shift_register(i-8); 
    end loop;
    temp_shift_register(31 downto 24) <= temp_byte; 
  else null;
  end if;
end process;

Lasdeclaracionesdeseñalesson:

signaltemp_shift_register:std_logic_vector(55downto0):="00000000000000000000000000000000000000000000000000000000";
signal perm_shift_register : std_logic_vector (55 downto 0):= "00000000000000000000000000000000000000000000000000000000";
signal temp_byte : signed (7 downto 0);
    
pregunta EEEidolt

1 respuesta

4

Como los tipos de matriz signed y std_logic_vector tienen el mismo tipo de elemento, puede convertir entre ambos tipos de la siguiente manera:

signal x : std_logic_vector(7 downto 0); -- 8 bit for example
signal y : signed(7 downto 0);

y <= signed(x);

y volver

signal y : signed(7 downto 0);
signal z : std_logic_vector(7 downto 0); -- 8 bit for example

z <= std_logic_vector(y);

Por supuesto, también puedes usar variables en lugar de señales (usando la asignación := ).

Por lo tanto, para su registro de turnos necesitará:

temp_shift_register(31 downto 24) <= std_logic_vector(temp_byte);

Otros comentarios

Esta línea no es obligatoria:

  else null;

Te falta cambiar en nuevos valores en la posición temp_shift_register(7 downto 0) .

En lugar de for ... end loop; , puede asignar todos los bits a la vez:

temp_shift_register(55 downto 8) <= temp_shift_register(47 downto 0);

Cómo proceder

Teniendo en cuenta su otra pregunta , la idea básica es tener un segundo registro de resultados de 56 bits. que almacena el máximo actual y los valores (bytes) al lado:

signal result_register : std_logic_vector(55 downto 0) := (others => '0');

Entonces tendrás que:

  • Cambie los nuevos valores de la memoria al registro de desplazamiento en los bits más bajos.
  • Compare el byte medio del registro de desplazamiento con el byte medio del registro de resultados. Si el primero es mayor, copie el registro de desplazamiento en el registro de resultados.

El código se vería así:

process (clk) is
begin
  if rising_edge(clk) then
    -- shift register
    temp_shift_register(55 downto 8) <= temp_shift_register(47 downto 0);
    temp_shift_register(7 downto 0)  <= new_byte_from_memory;

    -- check for new maximum
    if signed(temp_shift_register(31 downto 24)) > signed(result_register(31 downto 24))  then
      result_register <= temp_shift_register;
    end if;
  end if;
end process;

Tendrá que extender el código al menos 1) para restablecer ambos registros, y 2) Cambie el registro solo cuando haya nuevos datos de la memoria disponibles.

    
respondido por el Martin Zabel

Lea otras preguntas en las etiquetas