Get Even More Visitors To Your Blog, Upgrade To A Business Listing >>

Começando com Verilog 2 - Instanciação de Módulos

Posted on Sep 30 • Originally published at blog.marlonhenq.dev Curti muito a repercussão do último post e em especial muito obrigado a He4rt Developers, essa comunidade que participo faz uns 3 anos e que é sensacional, não deixe de entrar.Porém, acredito que ainda tem mais algumas coisas a serem abordadas para que você comece bem com Verilog e principalmente tenha todo o conhecimento para gabaritar o HDLbits.Bom, como o título já diz, esta é a parte dois do post “Começando com Verilog” então caso você não tenha lido a primeira parte, cola aqui nesse link primeiro:https://dev.to/marlonhenq/comecando-com-verilog-13n0Uma das principais coisas que acabei não dizendo no último post é que módulos podem instanciar outros módulos.Os que possuem olhares muito atentos podem até ter percebido isso quando falei sobre Verilog Estrutural “O Verilog Estrutural cria sua lógica chamando portas como módulos.”, porém irei explicar mais detalhadamente agora.Uma forma muito comum de se fazer um multiplexador em Verilog é usando o operador ternário:Obs: Olha ai uma nova forma de declarar os inputs e outputs, no post passado eu repetia sempre a palavra input e output para cada entrada/saida, mas caso elas sejam iguais (isto é, possuem a mesma quantidade de bits) você pode apenas colocar virgulas (como sempre Verilog possui várias formas de fazer a mesma coisa).Caso você não saiba o que é um multiplexador, ele nada mais é que um permutador de Entradas. No caso os inputs “a” e “b” são as entradas do nosso multiplexador, a “sel” é a nossa porta seletora, caso “sel” receba 0 o que vem por “a” é direcionado a saída “out”, caso “sel” receba 1 o que vem de “b” será direcionado a “out”.Ele pode ser descrito pela tabela:Aí está a representação do último código com “a” recebendo 1 (representado pelo verde), “b” recebendo 0 (vermelho) e “sel” recebendo 0, assim o valor de “a” é direcionado a “out”:Mudando a entrada de “sel” para 1, temos o que vem por “b” indo para “out”:Mas e se agora quisermos um multiplexador de 4 entradas?Obviamente, vamos ter que aumentar nossas entradas para agora “a”, “b”, “c” e “d” nossa seleção “sel” também deve aumentar para 2 bits.E um código que poderia resolver isso seria:A representação deste código é:De fato funciona, mas a legibilidade de ternários encadeados não é muito boa, e se quisermos então um multiplexador de 8 entradas? Ai sim, temos um grande problema, e uma forma mais elegante de fazer isso é instanciar módulos por outros módulos.Para instanciar módulos dentro de outros módulos em Verilog a sintaxe é “nome_do_modulo nome_da_instanciação (entrada1, entrada2,… saida1…);”.Vamos lá, tendo o multiplexador de 2 entradas podemos fazer um multiplexador de 4 entradas instanciando o de 2 entradas três vezes, segue o código:Representação gráfica do modulo mux4:Outra forma de instanciar módulos (mais verbosa, porém que prefiro) é a de repetir o nome das portas do módulo que está sendo instanciado dessa forma:Assim, além de ficar mais claro como está sendo o roteamento, não é necessário utilizar a ordem das entradas e saídas do módulo original, é inclusive possível suprimir algumas destas (caso não for necessário para algum tipo de instanciação).Outro circuito muito comum é o de somador binário, ele basicamente tem 3 entradas, os dois dígitos que ira receber, e a entrada de “vai um” (cin), de saídas temos a saída da soma, além de uma saída de “vai um” (cout), para um próximo somador.Um código para um somador binário de um único dígito é:O somador binário de um bit é graficamente representado assim:Um somador de 2 bits a partir da instanciação do somador simples pode ser:Obs: Olha ai também uma forma nova de se declarar um wire! O fio “coutIntern” foi declarado de forma implícita, já que ele apenas é citado já sendo usado pelos módulos mesmo não sendo declarado formalmente com “wire coutIntern;” anteriormente.Contudo, fique atento, apenas wires de um único bit podem ser declarados dessa forma.E graficamente o somador de 2 bits fica assim:E se agora quisermos um somador de 100 bits? Acho que seria muito trabalho repetir essas linhas 100 vezes, né?E é mesmo, mas temos uma forma mais elegante de fazer isso, o Generate For.O Generate nada mais é que um bloco onde se pode executar alguns comandos que após realizarem suas condições uma (ou mais) instância(s) de módulo(s) pode(m) ser(em) incorporada(s) (ou não) ao circuito.Dentro do Generate pode se utilizar “ifs”, “cases” e (os mais utilizados) os “fors” que realizarão loops os quais cada interação pode instanciar módulos.Falando pode parecer difícil, então vamos direto para o código que é bastante autoexplicativo:Após a criação do nosso módulo “adder100” e a declaração das nossas entradas e saídas, temos a criação de uma variável de geração “genvar” com o nome de “i”. Após isso, o primeiro módulo de adder é instanciado (ad0), já que este precisa receber o valor de “cin” ele acaba por ficar fora do nosso loop de geração.Porém, agora todos os nossos demais 99 módulos irão interagir com vetores, ou seja, podem ser gerados por um loop de geração.Assim, vem o nosso for com declaração muito próxima de C, onde a cada interação é instanciado um módulo adder de um bit.Obs: A utilização do for pode dar a entender a ideia de linguagens de programação de que cada interação é adicionado um módulo ao longo do tempo, mas isso é apenas uma automação para que não seja necessário escrever 100 linhas quase iguais de código.No final, o que teremos é 100 módulos rodando ao mesmo tempo, como se fossem 100 CIs de adição binária em uma mesma placa. Blz?E que fique a dica, essa é a resposta para o exercício Adder100i do HDLBits!A visualização para esse circuito graficamente é:Éhh… Bom, esse circuito é grande de mais para se visualizar e testar graficamente pelo DigitalJS. Em uma tela cheia o máximo que conseguimos ver é 15 instancias (de 100) e meu notebook sofreu para gerar essa simulação.O que faremos para testar esse tipo de circuito, então?Testes! Mais especificamente neste caso chamamos de “TestBench”, porém irei deixar isso para o próximo post!Como sempre, obrigado por ter lido este post até aqui!Demais dúvidas, comentários e sugestões podem ser enviados aqui embaixo (para o pessoal do DevTo) ou lá no meu Twitter @marlonhenq.Flw!Templates let you quickly answer FAQs or store snippets for re-use.Post incrível, ajuda muito nas aulas de circuitos digitais! Are you sure you want to hide this comment? It will become hidden in your post, but will still be visible via the comment's permalink. Hide child comments as well Confirm For further actions, you may consider blocking this person and/or reporting abuse Herofy - Aug 19 Akinnimi Stefan Emmanuel - Aug 15 James Hubert - Aug 20 Logeswaran GV - Sep 18 Once suspended, marlonhenq will not be able to comment or publish posts until their suspension is removed. Once unsuspended, marlonhenq will be able to comment and publish posts again. Once unpublished, all posts by marlonhenq will become hidden and only accessible to themselves. If marlonhenq is not suspended, they can still re-publish their posts from their dashboard. Note: Once unpublished, this post will become invisible to the public and only accessible to Marlon. They can still re-publish the post if they are not suspended. Thanks for keeping DEV Community safe. Here is what you can do to flag marlonhenq: marlonhenq consistently posts content that violates DEV Community's code of conduct because it is harassing, offensive or spammy. Unflagging marlonhenq will restore default visibility to their posts. DEV Community — A constructive and inclusive social network for software developers. With you every step of your journey. Built on Forem — the open source software that powers DEV and other inclusive communities.Made with love and Ruby on Rails. DEV Community © 2016 - 2023. We're a place where coders share, stay up-to-date and grow their careers.



This post first appeared on VedVyas Articles, please read the originial post: here

Share the post

Começando com Verilog 2 - Instanciação de Módulos

×

Subscribe to Vedvyas Articles

Get updates delivered right to your inbox!

Thank you for your subscription

×