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 decontrole_s0. - Quando
controle_s1é '1':- Se
controle_s0for '0',saida_finalseráentrada_a. - Se
controle_s0for '1',saida_finalseráentrada_b.
- Se
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:
- O componente a ser instanciado deve estar disponível no ambiente do projeto (por exemplo, no mesmo diretório ou biblioteca).
- A declaração do componente deve ser feita na seção
ARCHITECTUREdo design que o está instanciando, especificando suas portas e tipos. - 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. - Sinais internos podem ser necessários para conectar a saída de um componente à entrada de outro, como demonstrado com o
sinal_intermediariono multiplexador duplo.