Usar Habilitar para cambiar entre dos Decoders

1

Estoy tratando de poner una entrada de habilitación en un decodificador de 4 a 16 para poder seleccionar entre dos decodificadores. Aquí hay un esquema:

EstoyusandodosdecodificadoresparaseleccionardosdireccionesdiferentesenunaSRAM16x16.Estoypensandoenusarunaentradadehabilitaciónparacambiarentrelosdosdecodificadores.Porejemplo,sihabilitaresalto,eldecodificadorsuperiorseleccionaunadirección.Silaactivaciónesbaja,eldecodificadorinferiorseleccionaunadirección.

Esteeseldecodervhdl,perocuandointentocolocarunaentradaenableyhacerifenable='1'then,nofunciona.

libraryIEEE;useIEEE.STD_LOGIC_1164.all;entitydecode4to16isport(enable:instd_logic;oct:instd_logic_vector(3downto0);dec:outstd_logic_vector(15downto0));enddecode4to16;architecturearchofdecode4to16isbeginifenable='1'thenwithoctselectdec<="0000000000000001" when "0000",
"0000000000000010" when "0001",
"0000000000000100" when "0010",
"0000000000001000" when "0011",
"0000000000010000" when "0100",
"0000000000100000" when "0101",
"0000000001000000" when "0110",
"0000000010000000" when "0111",
"0000000100000000" when "1000",
"0000001000000000" when "1001",
"0000010000000000" when "1010",
"0000100000000000" when "1011",
"0001000000000000" when "1100",
"0010000000000000" when "1101",
"0100000000000000" when "1110",
"1000000000000000" when "1111",
"0000000000000000" when others;

end arch;

Alguien sugirió:

library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity decode4to16 is
port(
oct : in std_logic_vector(3 downto 0);
e : in std_logic;
dec : out std_logic_vector(15 downto 0));
end decode4to16;
architecture arch of decode4to16 is
BEGIN
process(e, oct)
begin
if e = '1' then
case oct is
when "0000" => dec <= "0000000000000001";
when "0001" => dec <= "0000000000000010";
when "0010" => dec <= "0000000000000100";
when "0011" => dec <= "0000000000001000";
when "0100" => dec <= "0000000000010000";
when "0101" => dec <= "0000000000100000";
when "0110" => dec <= "0000000001000000";
when "0111" => dec <= "0000000010000000";
when "1000" => dec <= "0000000100000000";
when "1001" => dec <= "0000001000000000";
when "1010" => dec <= "0000010000000000";
when "1011" => dec <= "0000100000000000";
when "1100" => dec <= "0001000000000000";
when "1101" => dec <= "0010000000000000";
when "1110" => dec <= "0100000000000000";
when "1111" => dec <= "1000000000000000";
when others => dec <= "0000000000000000";
end case;
else null;
end if;
end process;
end arch;

Pero cuando lo probé, la salida permanece cuando e = '0', esto entrará en conflicto con el otro decodificador si comparten el mismo cable de bus. ¿Hay alguna forma (como en otro caso) donde si e = '0', no produzca nada?

    
pregunta devbrs

1 respuesta

1

Lo que describas sería dar salida a 'Z' en la rama else, que se traduce a alta impedancia. Si un controlador genera XYZ y todos los demás controladores conectados a él emiten 'Z', el resultado es XYZ .

La 'Z' se traduce en un búfer de tres estados dentro del FPGA. Sin embargo, los búferes de tres estados ya no existen en los FPGA modernos para nada más que los controladores de salida (es decir, en un pin FPGA). Puedes lograr lo que deseas utilizando un mux en el nivel superior:

muxOut <= decTop when enable = '1' else
          decBot;

Si tiene varios controladores, otro esquema popular es generar ceros cuando no se selecciona un controlador, y o 'todos los controladores juntos.

De lo contrario, nunca conecte varios controladores al mismo cable, es una mala práctica de diseño y es probable que no funcione.

    
respondido por el Jonathan Drolet

Lea otras preguntas en las etiquetas