Como projetar multiplexadores em Verilog
Atualizado: 8 de nov. de 2022
Você e seu amigo estão almoçando em um restaurante e decidem marcar todos os gastos em apenas uma comanda. Na hora de pagar a conta no caixa, o atendente multiplica o número de refeições por dois, soma o valor de todas as bebidas e apresenta o valor final a vocês. Você percebe que o atendente somou uma bebida a mais, e pede para subtraí-la da conta. Ao final, com o valor corrigido, você e seu amigo pedem para dividir o valor total por dois, pois vocês vão rachar a conta.
Essa cena, comum em nossas vidas, teve como coadjuvante uma calculadora de 4 operações básicas. Nesta calculadora, há um circuito elementar chamado de multiplexador. É através dele que as operações básicas da calculadora são selecionadas.

Neste tutorial, você vai aprender a:
projetar um circuito multiplexador de 2 entradas (MUX2) usando portas lógicas
implementar o projeto do MUX2 em Verilog
mapear, compilar e prototipar um MUX2 na placa Community
criar um multiplexador de 4 entradas (MUX4) a partir de três MUX2
ler e compreender o relatório resumido do projeto
interagir com um projeto na placa Community
Antes de prosseguir, recomendamos os seguintes tutoriais:
O que é um multiplexador?
Um multiplexador é um circuito digital combinacional que transmite o bit de uma de suas entradas para a sua única saída. A seleção de uma entrada particular é realizada por um sinal de controle.

No lado esquerdo da animação acima, temos a representação de um multiplexador de 2 entradas de 1 bit em forma de chaves. Este multiplexador (ou MUX2) propaga os valores de entrada para a saída, intercalando (ou multiplexando) as entradas de acordo com o posicionamento da chave. Ao lado direito da figura, temos a representação simbólica do mesmo MUX2. Na representação simbólica, o posicionamento da chave é controlado pelo sinal c0.
A partir da animação, é possível identificar que o MUX2 possui 3 entradas e 1 saída, sendo elas: e0, e1, c0 e s0, respectivamente. O MUX2 pode também ser descrito pela seguinte tabela-verdade, onde 'X' pode ser '0' ou '1':
e0 | e1 | c0 | s0 | |
1 | 0 | X | 0 | 0 |
2 | 1 | X | 0 | 1 |
3 | X | 0 | 1 | 0 |
4 | X | 1 | 1 | 1 |
Note que, dependendo da variável c0, a saída s0 não é afetada pelo valor de 'X'. Em outras palavras, o valor de 'X' não importa para a saída s0 (don't care).
Descrevendo um MUX2 em Verilog
A tabela-verdade da seção anterior nos permite gerar a seguinte equação lógica através dos mintermos indicados nas linhas 2 e 4:
s0 = (e0 AND (NOT c0)) OR (e1 AND c0)
A partir dessa equação em forma de soma-de-produto, temos o esquemático do MUX2 na tabela abaixo. O esquemático possui rótulos para os fios internos (w_0, w_1 e w_3). Estes rótulos são necessários para descrever o circuito em Verilog ao lado direito da tabela abaixo.
Esquemático (MUX2) | Código Verilog (MUX2) |
![]() |
wire w_0, w_1, w_2;
not(w_2, c0);
and(w_0, e0, w_2);
and(w_1, e1, c0);
or(s0, w_0, w_1);
|
Veja que a codificação do esquemático para portas lógicas em Verilog é bem direta. O único cuidado a se tomar é colocar a saída da porta lógica sempre na primeira posição à esquerda, deixando as posições seguintes para as entradas da porta lógica.
porta_lógica (saída, entrada1, entrada2, ...)
Nota: a plataforma Pitanga aceita portas lógicas and, or, xor, nand, nor e xnor de até 4 entradas
Para encerrar a codificação do MUX2 em Verilog, falta-nos definir quais são as portas de entrada e saída. Iremos fazer isso utilizando a construção module/endmodule.
![]() |