Design de Multiplexadores em VHDL e Reutilização de Componentes

Implementação de um Multiplexador 2 para 1 em VHDL

O desenvolvimento de circuitos lógicos combinacionais utilizando VHDL é uma prática fundamental na engenharia de hardware. Este artigo aborda a implementação de um multiplexador 2 para 1 (MUX 2x1) e, subsequentemente, a construção de um multiplexador duplo 2 para 1 através da instanciação de componentes, uma técnica crucial para a modularidade e reutilização de código em projetos de larga escala.

Princípios do Multiplexador 2 para 1

Um multiplexador 2 para 1 possui duas entradas de dados (IN0, IN1), uma entrada de seleção (S), e uma saída (OUT). A função do seletor é direcionar uma das entradas de dados para a saída. Especificamente, se a entrada de seleção S for '0', a saída replica o valor de IN0; se S for '1', a saída replica o valor de IN1.

Código VHDL para o Multiplexador 2 para 1

A seguir, apresenta-se o código VHDL para a implementação de um multiplexador 2 para 1. Este design é conciso e utiliza uma atribuição condicional de sinal para expressar a lógica de seleção.


LIBRARY ieee;
USE ieee.std_logic_1164.ALL;

ENTITY seletor_2x1 IS
    PORT (
        entrada_dado0 : IN STD_LOGIC;
        entrada_dado1 : IN STD_LOGIC;
        seletor       : IN STD_LOGIC;
        saida_mux     : OUT STD_LOGIC
    );
END seletor_2x1;

ARCHITECTURE fluxo_dados OF seletor_2x1 IS
BEGIN
    -- Atribuição condicional de sinal para a lógica do multiplexador
    saida_mux <= entrada_dado0 WHEN seletor = '0' ELSE entrada_dado1;
END fluxo_dados;

Para verificar a funcionalidade, uma simulação pode ser configurada com entrada_dado0 sempre em nível lógico alto ('1') e entrada_dado1 em nível lógico baixo ('0'). Observa-se que quando seletor está em '0', saida_mux acompanha entrada_dado0 (ou seja, '1'). Inversamente, quando seletor está em '1', saida_mux segue entrada_dado1 (ou seja, '0'). Isso confirma a correta operação do multiplexador.

Projeto de um Multiplexador Duplo 2 para 1

A capacidade de reutilizar módulos de hardware existentes é um pilar do design VHDL eficiente. Um multiplexador duplo 2 para 1 pode ser construído instanciando o módulo seletor_2x1 desenvolvido enteriormente.

Arquitetura Lógica do Multiplexador Duplo 2 para 1

A arquitetura consiste em dois multiplexadores 2 para 1 (U1 e U2). A saída do primeiro multiplexador (U1) é conectada a uma das entradas de dados do segundo multiplexador (U2). Isso permite uma seleção em cascata, onde um primeiro seletor (S0) escolhe entre as entradas iniciais (IN0, IN1), e um segundo seletor (S1) escolhe entre a saída do primeiro multiplexador e uma nova entrada (IN2).

Visualmente, podemos imaginar U1 com entradas IN0, IN1 e seletor S0, produzindo uma saída intermediária. Esta saída intermediária serve como uma das entradas para U2, que também recebe uma entrada adicional IN2 e é controlado pelo seletor S1 para produzir a saída final.

Código VHDL para o Multiplexador Duplo 2 para 1

O código a seguir demonstra a instanciação do componente seletor_2x1 para criar o multiplexador duplo.


LIBRARY ieee;
USE ieee.std_logic_1164.ALL;

ENTITY seletor_duplo_2x1 IS
    PORT (
        entrada_a, entrada_b, entrada_c : IN  STD_LOGIC;
        controle_s0, controle_s1        : IN  STD_LOGIC;
        saida_final                     : OUT STD_LOGIC
    );
END seletor_duplo_2x1;

ARCHITECTURE estrutural OF seletor_duplo_2x1 IS
    -- Declaração do componente MUX 2x1
    COMPONENT seletor_2x1
        PORT (
            entrada_dado0 : IN STD_LOGIC;
            entrada_dado1 : IN STD_LOGIC;
            seletor        : IN STD_LOGIC;
            saida_mux     : OUT STD_LOGIC
        );
    END COMPONENT;

    -- Sinal interno para conectar os dois multiplexadores
    SIGNAL sinal_intermediario : STD_LOGIC;

BEGIN
    -- Instanciação do primeiro MUX (U1)
    mux_u1 : seletor_2x1
    PORT MAP (
        entrada_dado0 => entrada_a,
        entrada_dado1 => entrada_b,
        seletor       => controle_s0,
        saida_mux     => sinal_intermediario
    );

    -- Instanciação do segundo MUX (U2)
    PORT MAP (
        entrada_dado0 => entrada_c,
        entrada_dado1 => sinal_intermediario,
        seletor       => controle_s1,
        saida_mux     => saida_final
    );
END estrutural;

Para a simulação do multiplexador duplo, podemos prever o comportamento da seguinte forma:

  • Quando controle_s1 é '0', saida_final é entrada_c, independentemente de controle_s0.
  • Quando controle_s1 é '1':
    • Se controle_s0 for '0', saida_final será entrada_a.
    • Se controle_s0 for '1', saida_final será entrada_b.

Os resultados da simulação devem confirmar esta lógica, demonstrando que o design em cascata funciona conforme o esperado.

Considerações sobre a Implementação Física (Pinagem)

Ao implementar o design VHDL em um FPGA, é essencial associar as portas lógicas do VHDL (como entrada_a, controle_s0, saida_final) a pinos físicos específicos do chip FPGA. Esta etapa, conhecida como pinagem ou atribuição de pinos, garante que o circuito digital interaja corretamente com os componentes externos da placa de desenvolvimento (por exemplo, botões, chaves, LEDs ou saídas de áudio).

Para o seletor_duplo_2x1, as entradas e saídas seriam mapeadas para os pinos do FPGA, permitindo que sinais externos controlem os seletores e entradas, e que a saída possa ser observada através de um dispositivo de saída.

Comparativo entre Edição Gráfica e Textual em VHDL e Instanciação de Componentes

Edição Gráfica vs. Edição Textual (VHDL)

A principal diferença entre a edição gráfica e a textual na descrição de hardware reside na abstração e no nível de detalhe. A edição gráfica (esquemas) exige que o projetista visualize e construa o circuito em termos de portas lógicas e interconexões físicas, o que demanda um sólido conhecimento de hardware. Por outro lado, a edição textual com VHDL permite descrever a funcionalidade lógica e o comportamento do circuito, sem a necessidade imediata de se preocupar com a implementação física exata das portas. Isso torna o design mais abstrato e flexível, permitindo que o compilador sinteitze a melhor estrutura de hardware com base na descrição comportamental ou de fluxo de dados.

O Papel da Instanciação de Componentes

A instanciação de componentes é um recurso poderoso em VHDL que permite a reutilização de blocos de design pré-existentes.

  • Propósito: Introduzir um módulo (componente) que já foi projetado e verificado, inetgrando-o em um design de nível superior. Isso promove a modularidade, facilitando o gerenciamento de projetos complexos, a depuração e a reutilização de IP (Propriedade Intelectual).
  • Considerações na Aplicação:
    1. O componente a ser instanciado deve estar disponível no ambiente do projeto (por exemplo, no mesmo diretório ou biblioteca).
    2. A declaração do componente deve ser feita na seção ARCHITECTURE do design que o está instanciando, especificando suas portas e tipos.
    3. A associação das portas do componente às portas ou sinais do design atual é feita através do mapeamento de portas (PORT MAP). É crucial que os tipos e a direção (IN/OUT) das portas correspondam.
    4. Sinais internos podem ser necessários para conectar a saída de um componente à entrada de outro, como demonstrado com o sinal_intermediario no multiplexador duplo.

Tags: VHDL FPGA Multiplexer Lógica Combinacional Instanciação de Componentes

Publicado em 11-2 03:15