¿Por qué usar un multiplexor para seleccionar GND y VCC en lugar de un inversor?

0

He creado un módulo VHDL que genera un patrón ancho de un bit de "1010101010 ..." continuamente, siempre que se afirme una señal de entrada llamada "inicio". Este es el diseño de circuito elaborado producido por Xilinx Vivado v2014.4 (64 bits, Linux):

Lapregunta

¿Cuáleselpropósitodelmultiplexor"next_state_i"? Parece que un simple inversor entre Q y D sería un diseño más simple. ¿Existe alguna ventaja al usar un multiplexor en lugar de un inversor?

El Código

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity TASK2_PRE is
    Port ( clock, start : in STD_LOGIC;
           data_out     : out STD_LOGIC);
end TASK2_PRE;

architecture Behavioral of TASK2_PRE is

    signal current_state    : STD_LOGIC := '0';
    signal next_state       : STD_LOGIC := '0';

begin

    -- no need to decode current state - map FFs directly to outputs
    data_out <= current_state;

    -- decode next state
    next_state_decode : process(current_state, start)

    begin

        if (start = '0') then
            next_state <= '0';

        elsif (current_state = '0') then
            next_state <= '1';

        else
            next_state <= '0';

        end if;

    end process next_state_decode;

    -- update current state
    update : process(clock)
    begin

        if (clock'event AND clock = '1') then
            current_state <= next_state;
        end if;
    end process update;

end Behavioral;

Nota: Sé que el enfoque de la máquina de estado es un poco torpe solo para generar este patrón, pero la implementación de este comportamiento como FSM fue un requisito de este proyecto para una clase.

    
pregunta skrrgwasme

3 respuestas

2

El diagrama es una representación literal de su código: if - else - end if en el código fuente de VHDL se asigna directamente a un multiplexor en el hardware. No se ha realizado ninguna optimización.

Si sintetizara esta lógica para un FPGA, ambos muxes se implementarían dentro de una única LUT (tabla de búsqueda) que impulsa la entrada al FF.

    
respondido por el Dave Tweed
2

Si estuviera creando una función específica específica a partir de puertas lógicas individuales, un inversor sería una buena opción.

Si está apuntando a un diseño en un FPGA, entonces tiene que usar los componentes que proporciona el FPGA. El fabricante hace que todos los componentes sean lo más versátiles posible, ya que deben poder configurarse para hacer cualquier cosa. Como un mux puede hacer el trabajo de un inversor, pero un inversor no puede hacer el trabajo de un mux, entonces un mux es de lo que Vivado construye la lógica.

    
respondido por el Neil_UK
0

A veces, cuando un código como el siguiente genera un multiplexor en el esquema (Vivado 2017.1):

foo: process(clk) is
    if (rising_edge(clk)) then
        if (somesignal = '0') then
            ..
        end if;
    end if;
end process foo;

Puedo hacer que el diseño coloque un inversor en lugar de un multiplexor asignando primero el inverso a otra señal y luego utilizando esa señal invertida para la prueba de '1' en su lugar:

not_somesignal <= not somesignal;

foo: process(clk) is
    if (rising_edge(clk)) then
        if (not_somesignal = '1') then
            ...
        end if;
    end if;
end process foo;

El multiplexor no siempre se eliminará (en la verificación esquemática de que el mux en realidad solo tiene entradas VCC y GND) y, a veces, el desenrollado en expresiones combinacionales funciona mejor cuando la lógica necesaria solo necesita combinar uno o dos caracteres mínimos / máximos ( combinando con y / y según corresponda).

    
respondido por el Brian Jack

Lea otras preguntas en las etiquetas