detector de señal máxima vhdl [cerrado]

-2

Lo siento, he hecho una pregunta similar pero no obtuve una respuesta, así que publiqué esta pregunta

Actualmente estoy diseñando un detector máximo en VHDL que es parte de mi tarea. Todo el sistema consta de un generador de datos, un procesador de datos y un procesador cmd. Lo que estoy haciendo actualmente es el procesador de datos.

El procesador de datos recibe una señal BCD de 12 bits del procesador cmd y solicita una cierta cantidad de bytes bit SIGNADOS aleatorios de 8 bits de un generador de datos correspondiente al valor de la señal BCD, luego debe averiguar el máximo y emitir el a 56 en todo el conjunto de líneas que contienen los 7 bytes que comprenden el pico en el medio (es decir, los índices de bits 31 a 23), y los 3 bytes a cada lado. La imagen de abajo muestra el diagrama de bloques.

Escribíunprocesocomoesteparaaveriguarelmáximoysuubicaciónenlamatriz,peronosécómotratarconlosdatosfirmados.Porlotanto,solicitoalgunosconsejospararefinarelcódigooparavolveraescribirotroqueseacapazdereconocerbytesfirmados

    
pregunta EEEidolt

1 respuesta

0

Para responder a las preguntas en los comentarios:

  

... pero ¿quiso decir que debería usar el paquete STD_LOGIC_SIGNED?

     

¿Me pregunto si el compilador es lo suficientemente inteligente como para reconocer el signo de cada número?

El compilador es lo suficientemente inteligente si utiliza los tipos de datos correctos. Un std_logic_vector es solo una matriz (vector) de std_logic valores (bits). Este vector no tiene signo. Si usa signed en lugar de std_logic_vector , el compilador sabe que está tratando los números firmados.

No utilice los paquetes std_logic_arith y std_logic_signed de Synopsys. Han sido super-sembradas por el paquete estándar VHDL numeric_std . Este paquete define el tipo de datos signed junto con operadores relacionales como < , <= , = , /= , > , >= . Ambos operandos en la comparación pueden tener una longitud diferente, el operando más corto se extenderá primero con un signo.

Puedes convertir de std_logic_vector a signed con:

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 ejemplo, para encontrar el valor máximo en una matriz de números firmados, puedes hacerlo:

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity maximum_finder is
end maximum_finder;

architecture behavioral of maximum_finder is
  type array_of_signed is array(natural range <>) of signed(3 downto 0);
  signal signed_numbers : array_of_signed(0 to 2) :=
    ( 0 => "0000",  --  0
      1 => "0001",  --  1
      2 => "1111"); -- -1

  signal maximum : signed(3 downto 0);

begin  -- behavioral

  process(signed_numbers)
    variable tmp : signed(3 downto 0);
  begin
    tmp := "1000";                      -- smallest number = -8
    for i in signed_numbers'range loop
      if signed_numbers(i) > tmp then
        tmp := signed_numbers(i);
      end if;
    end loop;  -- i
    maximum <= tmp;
  end process;

end behavioral;

Por supuesto, esto no resuelve tu tarea. Tienes que adaptarlo, para evitar el plagio.

    
respondido por el Martin Zabel

Lea otras preguntas en las etiquetas