Tutorial de Verilog: Decodificador ou DEMUX

decodificador

No post anterior, mostrei como fazer um Mutiplexador. Neste post mostro como funciona um decodificador, ou demultiplexador. Escolhi para essa abordagem três circuitos diferentes:

  • Circuito Decodificador 2 pra 4;
  • Circuito Decodificador 2 pra 4, o mesmo circuito, mas com Enable;
  • Circuito Decodificador 3 pra 8.

Vamos começar mostrando o circuito mais simples, o decodificador 2 pra 4, onde duas entradas são convertidas para quatro saídas.

Circuito Decodificador 2 pra 4

Para o primeiro circuito dois sinais de entrada se transformam em quatro sinais de saída em que, conforme o valor de entrada, há o valor 1 em apenas um dos pinos de saída. A lógica que o circuito deve respeitar para esse circuito decodificador está mostrado na figura a seguir:

decodificador

A partir das equações para cada uma das saídas, podemos desenhar o circuito elétrico que representa o circuito decodificador de 2 pra 4. Esse circuito está apresentado abaixo:

Diagrama Elétrico do Circuito:

demux

Para representar o circuito em HDL, podemos simplesmente codificar o circuito acima utilizando portas lógicas. O código para o circuito acima, seu testbench e o projeto em Verilog estão a seguir:

Representação do Circuito em Verilog:

Comentários sobre o código Verilog:

Ao utilizar porta 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. Esse nome é 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)

Declarei a saída com quatro bits, então utilizei o formato [n-1,0] para a saída X.

Testbench:

Forma de Onda Resultante da Simulação:

decodificador

Faça download do projeto a seguir:

download_proteus_arduino_lcd

Circuito Decodificador 2 pra 4 com Enable

Para a representação de um segundo circuito decodificador ou Demux, incluí um sinal e enable, que habilita ou não o funcionamento do circuito. Se o sinal de Enable for um para esse circuito, ele funcionará como o primeiro circuito mostrado neste post. Se for zero, teremos zero na saída. O circuito está a seguir:

demux - Circuito

 

Diagrama Elétrico do Circuito:

demux - Diagrama elétrico

Representação do Circuito em Verilog:

Comentário sobre o código Verilog:

Utilizei o mesmo formato do código anterior. Reparem que construí NANDs de três entradas desta vez. Em cada uma das entradas das portas NANDs eu adicionei o sinal de enable.

Testbench:

Forma de Onda Resultante da Simulação:

two2four

Faça download do projeto a seguir:

download_proteus_arduino_lcd

Circuito Decodificador 3 pra 8 com enable

Desenvolvi então um decodificador de 3 pra 8, com enable. Desta vez também incluí uma função no circuito que, se houver algum outro sinal injetado na entrada diferente de zeros ou uns, a saída será desconhecida e será mais fácil diagnosticar um possível erro no futuro:

demux-2

Representação do Circuito em Verilog:

Comentário sobre o código Verilog:

O código acima foi feito utilizando o padrão comportamental (behavioral), que é um padrão de mais alto nível, onde não utilizamos portas lógicas no código, para que o modelamento da lógica seja feito conforme o comportamento esperado pelo circuito projetado. 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 de 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 usadas para detectar erros no design, que se propagam por todo circuito, se utilizarmos esse componente de hardware junto com outros componentes, para circuitos maiores.

Temos quatro conjuntos de sinais de entrada, A, B, C e Enable. Todos os sinais têm um sinal apenas, ou seja, podem ser representados por um bit cada. Quando utilizamos a construção

queremos representar quatro bits juntos, que nesse caso podem ser utilizados para a função Case checar a sequência desses sinais. Repare que se Enable for zero, a saída é zero.

A saída X é representada por 8 bits e, portanto, declarada como [0,7].

Testbench:

Forma de Onda Resultante da Simulação:

three2eight

É isso ai pessoal, espero que tenham gostado dessas dicas de hardware e adoraria de ouvir de vocês como posso melhorar os próximos textos. Deixem seus comentários abaixo.

Outros artigos da série

<< Tutorial de Verilog – 7 formas de representar um MUX em VerilogTutorial de Verilog: Meio Somador (Half Adder) >>
Website | Veja + conteúdo

Sou formado em Engenharia Elétrica na USP Sao Carlos, com mestrado em Engenharia Elétrica no Rochester Institute of Technology pelo CsF. Tenho 17 anos de experiência em projetos de circuitos eletrônicos. Escrevo regularmente para o Embarcados, adoro eventos sobre tecnologia, onde posso rever amigos e conhecer pessoas do ramo.

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