Pregunta

Estoy diseñando cambio universal de operador aritmético. ¿Hay una mejor manera de lograrlo, además de utilizar el multiplexor de 32 bits (decodificador) de una manera presentada abajo?

ENTITY isra IS 
PORT (
  clk:    in std_logic;
  rst:    in std_logic;
  di:     in std_logic_vector (31 downto 0);
  sel:    in std_logic_vector (31  downto 0);
  res:    out std_logic_vector (31 downto 0) := (others => '0')
);
END isra;


PROCESS
  BEGIN
    WAIT UNTIL clk'EVENT AND clk = '1';
    IF rst = '1' THEN
      res <= (others => '0');
    ELSE
    CASE sel IS
        when X"00000001"  => res <= to_stdlogicvector(to_bitvector(a) sra 1);
        when X"00000002"  => res <= to_stdlogicvector(to_bitvector(a) sra 2);
        ...
        when X"0000001F"  => res <= to_stdlogicvector(to_bitvector(a) sra 31);
        when others => res <= (others => '0');
    END CASE;
END IF;
END PROCESS;
¿Fue útil?

Solución

El uso de indexación?

PROCESS
  VARIABLE shift_count : INTEGER RANGE 0 TO 31;
BEGIN
  IF rst = '1' THEN
    res <= (others => '0');
  ELSIF RISING_EDGE(clk) THEN
    shift_count := to_integer(sel);
    FOR I IN 0 TO 31 LOOP
      IF I + shift_count < 32 THEN
        res(I) <= din(I + shift_count);
      ELSE
        res(I) <= din(31); -- for logical shift right, use '0' instead
      END IF;
    END LOOP;
  END IF;
END PROCESS;

Esta versión es mucho más fácil de parametrizar en un genérico.

Recuerde que VHDL es una descripción de comportamiento, que no especifica un mux. El compilador puede generar diferentes diseños dependiendo de si a optimizar el tamaño, velocidad, permite la canalización, etc.

Tenga en cuenta que 5 2: 1 multiplexores pueden implementar esto en un área mucho más pequeña que una sola de 32: 1 mux. Si este no es el bloque que limita su velocidad de reloj, que sería preferible.

También tenga en cuenta que su entrada sel es demasiado amplia, que sólo tiene que ser 5 bits.

Otros consejos

Puede utilizar la función SRA sin bucles o declaraciones de caso:

res <= to_stdlogicvector(to_bitvector(di) sra to_integer(sel));

Tenga en cuenta que usted necesita para hacer una sel sin firma, no un std_logic_vector:

sel: in unsigned (31  downto 0);

En caso de que no quiere que, todavía puede emitir sel en un signo. También es necesario que nos numeric_bit:

use ieee.numeric_bit.all;

Bien desde un punto de vista del hardware, para desplazamiento a la derecha en un solo reloj un número variable de posiciones, cada bit es un solo flip-flop con uno de los 32 valores posibles en base a una selección. Así que desde ese punto de vista, esto es cómo lo hace.

Me haría sel == 0 un caso y que sea una pasarela, sin embargo. Lógicamente, eso tiene más sentido que definir los ajustes a ceros.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top