Decodificación en VHDL - Enmascaramiento de bits

0

Estoy buscando la forma óptima de hacer esto en VHDL:

"000" -> -------1
"001" -> ------1-
"010" -> -----1--
"011" -> ----1---
"100" -> ---1----
"101" -> --1-----
"110" -> -1------
"111" -> 1-------

¿Hay una mejor manera de hacer esto que un interruptor grande (caso)? Me dijeron que usara un bucle for, pero no veo cómo

    
pregunta Fluffy

3 respuestas

1

lo descubrió. Necesitaba un descanso, esto es lo que hago para hacerlo más elegante:

for i in 0 to 7 loop
     if (i = unsigned(rx_data(7 downto 5))) then
           cs_o(i) <= '1';
     end if;
end loop ; 

rx_data(7 downto 5) son los 3 bits que deben codificarse en el byte cs_o .

[EDITAR] O incluso mejor (créditos para A. Kieffer):

cs_o(to_integer(unsigned(rx_data(7 downto 5)))) <= '1'; 

Esto transforma una declaración de cambio de más de 20 líneas en 1. wow

    
respondido por el Fluffy
0

Eso parece una palanca de cambios de barril. Se utilizan en unidades de punto flotante o en cualquier lugar donde se requiera un registro de desplazamiento programable.

Requiere dos para bucles porque creas una matriz de multiplexores.

Por otra parte, si desea generar su patrón, puede cargar 1 en una variable y seguir cambiando hasta obtener el número requerido. Hay muchas formas de implementarlo, dependiendo del rendimiento requerido, por ejemplo. Mayús registrador + contador.

Editar También debo agregar que si solo desea generar su patrón, puede crear una matriz de constantes y asignarlo en un proceso. Aquí es donde usas tu bucle for. Su pregunta es un tanto confusa sobre qué quiere lograr exactamente. Me refiero a una salida constante de todos los 1s que satisfaga su no importa.

    
respondido por el user110971
0

Podrías implementarlo como un proceso o una función. Mi ejemplo utiliza una función, que se puede reutilizar.

La función se define en utils paquete de nuestra PoC-Library . Los paquetes también contienen la transformación inversa y otro binario < = > codificaciones xxx.

Función :

-- Binary-Code to One-Hot-Code
function bin2onehot(Value : std_logic_vector) return std_logic_vector is
    variable result     : std_logic_vector(2**Value'length - 1 downto 0);
begin
    result  := (others => '0');
    result(to_integer(unsigned(Value, 0))) := '1';
    return result;
end function;

Nota: el resultado se inicializa en el cuerpo de la función, por lo que también funciona con Altera Quartus.

Uso :

signal bin    : std_logic_vector(2 downto 0);
signal onehot : std_logic_vector(7 downto 0);
...
onehot <= bin2onehot(bin);

Fuente: PoC.utils paquete

    
respondido por el Paebbels

Lea otras preguntas en las etiquetas