Tutorial de Verilog – 7 formas de representar um MUX em Verilog

MUX em Verilog

Dando prosseguimento ao Tutorial de Verilog, vou mostrar abaixo sete formas diferentes de implementar um mesmo circuito, o MUX, apresentado anteriormente.

A seguir vou implementar um MUX em Verilog de sete abordagens diferentes, testar o circuito e imprimir os resultados e o circuito gerado. Utilizo nessa abordagem o Quartus 13 da Altera, software grátis para desenvolvimento de circuitos simples e legal para trabalhar com HDL no Windows. Qualquer pessoa pode reproduzir essas experiências ou utilizar o código como bem entender.

1. MUX usando portas lógicas

Implemento a seguir o circuito MUX utilizando portas lógicas.

Representação do Circuito em Verilog:

Comentários sobre o código Verilog:

Ao utilizar portas lógicas, utilizei na frente do nome da porta lógica um nome para esse componente, como se estivesse criando um componente elétrico em uma ferramenta de esquemático. Utilizei os nomes u1, u2, u3 e u4 para isso. Esse rótulo é utilizado para se criar o Netlist, ou hardware resultante do projeto.

A estrutura de uma porta lógica em verilog sempre é:

portaLogica nome (saida, entrada1, entrada2, … , entradaN)

Poderia ao invés de utilizar input wire utilizar apenas wire. O mesmo poderia fazer para output wire, onde poderia omitir a palavra wire neste caso.

Testbench:

Resultado no terminal:

MUX em Verilog

Onda de Saída:

MUX em Verilog

Circuito gerado:

MUX em Verilog

Baixe o projeto completo MUX1 para o Quartus 13 ou 14.

download-multiplexador

2. MUX usando assign e condição ?

Representação do Circuito em Verilog:

Comentários sobre o código Verilog:

Utilizei uma estrutura onde a condição é testada, e se for verdadeira, executa uma condição e se não, a outra. Nesse caso, X recebe o valor de B se S for 1 e para qualquer outro valor de S, X recebe 0. 

Utilizei o mesmo Testbench, trocando MUX1 por MUX2. Os resultados foram exatamente os mesmos para a simulação.  

Circuito gerado:

MUX em Verilog

Baixe aqui o projeto MUX2 para o Quartus 13 ou 14.

download-multiplexador

3. MUX usando if

Representação do Circuito em Verilog:

Comentários sobre o código Verilog:

O código acima foi feito usando o padrão comportamental (behavioral), que é um padrão de mais alto nível, para que o modelamento da lógica seja feito conforme o comportamento esperado pelo circuito projetado. Utilizei if else, como utilizado na linguagem C. Nesse bloco, analiso a condição do sinal de entrada S, utilizando if e else, e tomo ação dependendo do valor de S. Essa interação always sempre acontece quando um dos sinais dentro da lista entre parenteses é alterado. Neste caso considerei todos os sinais de entrada. Então poderia usar:

Utilizei o mesmo Testbench, trocando MUX1 por MUX3. Os resultados foram exatamente os mesmos para a simulação.  

Circuito gerado:

MUX em Verilog

Baixe aqui o projeto MUX3 para o Quartus 13 ou 14.

download-multiplexador

4. MUX usando case

Representação do Circuito em Verilog:

Comentários sobre o código Verilog:

O código acima também foi feito utilizando o padrão comportamental (behavioral). Utilizei um bloco always que sempre executa quando há uma mudança de qualquer uma das entradas, declaradas como input. Dentro desse bloco, usei case, que ajuda quando há diversas decisões a serem tomadas, como o switch case para o caso da linguagem C. Case faz com que testemos se determinadas condições de um sinal condizem com alguns sinais esperados. Existe apenas uma condição para default, que é a condição que cobre todos os outros sinais não descritos na lista do Case. Mais de uma condição de default causa erro de síntese do circuito. Essa condição pode ser usada para detectar erros no design, que se propagam por todo circuito, se utilizarmos esse componente de hardware junto com outros componentes, para circuitos maiores. Case é ideal principalmente quando se há muitas condições a serem atendidas.

Verifique que X é definido como reg e que o bloco case termina com endcase.

Utilizei o mesmo Testbench, trocando MUX1 por MUX4. Os resultados foram exatamente os mesmos para a simulação.  

Circuito gerado:

MUX em Verilog

Baixe aqui o projeto MUX4 para o Quartus 13 ou 14.

download-multiplexador

5. MUX usando lógica Digital com always

Representação do Circuito em Verilog:

Comentários sobre o código Verilog:

O código acima também foi feito usando o padrão comportamental (behavioral) e é a forma mais rápida de escrever um código de forma eficiente. Usa apenas lógica digital, é bem intuitivo e fácil de entender. Na linha onde está presente a lógica da saída X em relação às entradas, o que é descrito é exatamente a expressão booleana do MUX.

É bom lembrar novamente que pode-se usar simplesmente:

e

Utilizei o mesmo Testbench, trocando MUX1 por MUX5. Os resultados foram exatamente os mesmos para a simulação.  

Circuito gerado:

MUX em Verilog

Baixe aqui o projeto MUX5 para o Quartus 13 ou 14.

download-multiplexador

6. MUX usando Tabelas com Primitivas definidas pelo usuário: UDP

Representação do Circuito em Verilog:

Comentários sobre o código Verilog:

Nesse tipo de implementação, é necessário que se defina todos os possíveis estados das entradas em forma de tabela e o que acontecerá em cada um dos casos com as saídas. Vamos analisar a primeira linha a tabela:

Se a entrada S for iguaal a zero, a entrada A for 1, X receberá o valor 1, independente do valor de B, que está representado por uma exclamação. A diretiva dois pontos separa as entradas das saídas.

Veja que quando queremos utilizar tabelas UDP, precisamos começar o código com a palavra primitive.

Testbench:

Os resultados foram exatamente os mesmos para a simulação.  

Circuito gerado:

MUX em Verilog

Baixe aqui o projeto MUX6 para o Quartus 13 ou 14.

download-multiplexador

7. MUX usando apenas portas lógicas NAND

Representação do Circuito em Verilog:

Comentários sobre o código Verilog:

O código acima é implementado apenas com portas lógicas, conforme a sintaxe mostrada no primeiro exemplo. É a implementação mais rápida quando feita em um ASIC devido à construção das portas NAND. 

Testbench:

Onda de Saída:

MUX em Verilog

Baixe aqui o projeto MUX7 para o Quartus 13 ou 14.

download-multiplexador

Para aprender mais sobre Verilog

E isso é tudo pessoal, espero que tenham gostado dessas 7 dicas de hardware e adoraria de ouvir de vocês como posso melhorar os próximos textos. Mandem feedbacks, críticas, enfim, deixem seus comentários abaixo.

Outros artigos da série

<< Tutorial de Verilog – O primeiro Projeto com QuartusTutorial de Verilog: Decodificador ou DEMUX >>
Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Comentários:
Notificações
Notificar
guest
0 Comentários
Inline Feedbacks
View all comments
Talvez você goste:

Séries



Outros da Série

Menu