<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Marlon</title>
    <description>The latest articles on DEV Community by Marlon (@marlonhenq).</description>
    <link>https://dev.to/marlonhenq</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F842684%2F3ddeacd6-72cc-4e8e-beb9-44372c3b33a9.jpeg</url>
      <title>DEV Community: Marlon</title>
      <link>https://dev.to/marlonhenq</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/marlonhenq"/>
    <language>en</language>
    <item>
      <title>RubberDuck o que é, e como fazer um com o seu Arduino Leonardo (ou com esp32, RP Pico e etc)</title>
      <dc:creator>Marlon</dc:creator>
      <pubDate>Thu, 25 Apr 2024 03:00:00 +0000</pubDate>
      <link>https://dev.to/marlonhenq/rubberduck-o-que-e-e-como-fazer-um-com-o-seu-arduino-leonardo-ou-com-esp32-rp-pico-e-etc-14l5</link>
      <guid>https://dev.to/marlonhenq/rubberduck-o-que-e-e-como-fazer-um-com-o-seu-arduino-leonardo-ou-com-esp32-rp-pico-e-etc-14l5</guid>
      <description>&lt;p&gt;Como sempre peguei um hiato grande nos posts do blog, mas estamos de volta e hoje vamos falar de uma ferramenta que os hackermans adoram e que é extremamente fácil e útil de fazer, o famoso RubberDuck.&lt;/p&gt;

&lt;p&gt;Mas antes...&lt;/p&gt;

&lt;h2&gt;
  
  
  Um Disclaimer
&lt;/h2&gt;

&lt;p&gt;Antes de começar a falar sobre o RubberDuck, é importante dizer que este post é puramente informativo, você pode usar as informações aqui contidas para fins educacionais, de segurança ou para facilitar o seu dia a dia, mas não me responsabilizo por qualquer uso indevido das informações aqui existentes.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é um RubberDuck?
&lt;/h2&gt;

&lt;p&gt;O RubberDuck é um dispositivo que é feito para parecer muito com um pendrive comum, mas que pode emular um teclado ou mouse e executar diferentes comandos no momento em que é conectado a um hardware.&lt;/p&gt;

&lt;p&gt;Ele é muito utilizado para automação de tarefas, testes de segurança e até mesmo para ataques de acessos físicos ou engenharia social.&lt;/p&gt;

&lt;p&gt;Sim o RubberDuck é uma metonímia, que é uma palavra difícil para dizer que uma marca ficou tão grande que o nome do produto virou sinônimo do produto em si, como é o caso da Gillette, Bombril e Xerox.&lt;br&gt;
O nome de dispositivos que fazem o que o RubberDuck faz de maneira genérica são BadUSBs ou keystroke injectiors.&lt;/p&gt;
&lt;h2&gt;
  
  
  Como fazer o seu RubberDuck (ou BadUSB)?
&lt;/h2&gt;

&lt;p&gt;Para fazer o seu RubberDuck você vai precisar de um microcontrolador que possa emular um teclado e a parte legal é que quase todos os microcontroladores modernos podem fazer isso, como o ESP32, Raspberry Pi Pico, ATmega32u4 (que é o micro controlador do Arduino Leonardo, Micro e Pro Micro), attiny85 (que é o microcontrolador do Digispark) e muitos outros.&lt;/p&gt;

&lt;p&gt;Aqui vou usar a Arduino IDE para programar um Arduino Leonardo.&lt;/p&gt;

&lt;p&gt;Abrindo a Arduino IDE, vamos apertar 'ctrl + shif + i' para abrir o gerenciador de bibliotecas e vamos instalar a biblioteca "Keyboard" que é a biblioteca que vamos usar para emular o teclado.&lt;/p&gt;

&lt;p&gt;Feito isso vamos para o código, que é bem simples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;
&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;"Keyboard.h"&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;Keyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;begin&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;loop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Pressiona a tecla do Windows&lt;/span&gt;
    &lt;span class="n"&gt;Keyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;press&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;KEY_LEFT_GUI&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// ou Keyboard.press(KEY_RIGHT_GUI); dependendo do teclado&lt;/span&gt;
    &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="c1"&gt;// Solta a tecla do Windows&lt;/span&gt;
    &lt;span class="n"&gt;Keyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;release&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;KEY_LEFT_GUI&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// ou Keyboard.release(KEY_RIGHT_GUI); dependendo do teclado&lt;/span&gt;

    &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;Keyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hyper"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1500&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Pressiona a tecla Control e 1&lt;/span&gt;
    &lt;span class="n"&gt;Keyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;press&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;KEY_LEFT_CTRL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;Keyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;press&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;49&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="c1"&gt;// SOlta as teclas Control e 1&lt;/span&gt;
    &lt;span class="n"&gt;Keyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;releaseAll&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;Keyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"cowsay Hack_The_Planet"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse código faz o seguinte:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pressiona a tecla do Windows&lt;/li&gt;
&lt;li&gt;Digita "Hyper"&lt;/li&gt;
&lt;li&gt;Pressiona a tecla Control e 1&lt;/li&gt;
&lt;li&gt;Digita "cowsay Hack_The_Planet"&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fywiyluk8obpjz076fl59.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fywiyluk8obpjz076fl59.png" alt=" " width="791" height="485"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lógico que você pode fazer muito mais do que isso, mas esse é um exemplo simples de como você pode fazer um RubberDuck.&lt;/p&gt;

&lt;p&gt;E como eu disse antes, você pode usar qualquer microcontrolador que possa emular um teclado, então você pode fazer um RubberDuck com um ESP32, Raspberry Pi Pico, Digispark, etc.&lt;/p&gt;

&lt;h2&gt;
  
  
  Isso é tudo pessoal
&lt;/h2&gt;

&lt;p&gt;Eu sei, esse foi um post pequeno, mas eu precisava sair do hiato de alguma forma e achei que esse post seria uma forma legal de fazer isso.&lt;/p&gt;

&lt;p&gt;Logo eu volto aqui com mais posts e mais projetos, então fiquem ligados.&lt;/p&gt;

&lt;p&gt;Até a próxima.&lt;/p&gt;

</description>
      <category>arduino</category>
      <category>hardware</category>
      <category>hacking</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Começando com Verilog 2 - Instanciação de Módulos</title>
      <dc:creator>Marlon</dc:creator>
      <pubDate>Sat, 30 Sep 2023 18:06:43 +0000</pubDate>
      <link>https://dev.to/marlonhenq/comecando-com-verilog-2-instanciacao-de-modulos-1mno</link>
      <guid>https://dev.to/marlonhenq/comecando-com-verilog-2-instanciacao-de-modulos-1mno</guid>
      <description>&lt;h1&gt;
  
  
  Opa, eae?
&lt;/h1&gt;

&lt;p&gt;Curti muito a repercussão do último post e em especial muito obrigado a &lt;a href="https://twitter.com/He4rtDevs" rel="noopener noreferrer"&gt;He4rt Developers&lt;/a&gt;, essa comunidade que participo faz uns 3 anos e que é sensacional, não deixe de entrar.&lt;/p&gt;

&lt;p&gt;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 &lt;a href="https://hdlbits.01xz.net/wiki/Main_Page" rel="noopener noreferrer"&gt;HDLbits&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;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:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/marlonhenq/comecando-com-verilog-13n0"&gt;https://dev.to/marlonhenq/comecando-com-verilog-13n0&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Aumentando a complexidade ou subindo a abstração com a instanciação de módulos
&lt;/h1&gt;

&lt;p&gt;Uma das principais coisas que acabei não dizendo no último post é que módulos podem instanciar outros módulos.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;Uma forma muito comum de se fazer um multiplexador em Verilog é usando o operador ternário:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight verilog"&gt;&lt;code&gt;&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="n"&gt;top_module&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;


    &lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sel&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;endmodule&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;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).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;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”.&lt;/p&gt;

&lt;p&gt;Ele pode ser descrito pela tabela:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;A&lt;/th&gt;
&lt;th&gt;B&lt;/th&gt;
&lt;th&gt;Sel&lt;/th&gt;
&lt;th&gt;Out&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;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”:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8bmhp1835e46tzrz7gon.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8bmhp1835e46tzrz7gon.png" alt=" " width="615" height="317"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mudando a entrada de “sel” para 1, temos o que vem por “b” indo para “out”:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ormeponc8skjd4w6syu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ormeponc8skjd4w6syu.png" alt=" " width="615" height="317"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mas e se agora quisermos um multiplexador de 4 entradas?&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;E um código que poderia resolver isso seria:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight verilog"&gt;&lt;code&gt;&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="n"&gt;top_module&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; 
    &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;sel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt; 

    &lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sel&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sel&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sel&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;endmodule&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A representação deste código é:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foez109wbphjrful98noa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foez109wbphjrful98noa.png" alt=" " width="800" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;Para instanciar módulos dentro de outros módulos em Verilog a sintaxe é “nome_do_modulo nome_da_instanciação (entrada1, entrada2,… saida1…);”.&lt;/p&gt;

&lt;p&gt;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:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight verilog"&gt;&lt;code&gt;&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="n"&gt;mux2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="c1"&gt;//multiplexador de 2 entradas já apresentado&lt;/span&gt;
    &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt; 

    &lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sel&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;endmodule&lt;/span&gt;

&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="n"&gt;mux4&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="c1"&gt;//multiplexador de 4 entradas&lt;/span&gt;
    &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;sel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt; 

    &lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="n"&gt;fio1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fio2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;mux2&lt;/span&gt; &lt;span class="n"&gt;multiplexador1&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sel&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;fio1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;mux2&lt;/span&gt; &lt;span class="n"&gt;multiplexador2&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sel&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;fio2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;mux2&lt;/span&gt; &lt;span class="n"&gt;multiplexadorFinal&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fio1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fio2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sel&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;endmodule&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Representação gráfica do modulo mux4:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy65pmva5ojplpwib8hc4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy65pmva5ojplpwib8hc4.png" alt=" " width="800" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;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:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight verilog"&gt;&lt;code&gt;&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="n"&gt;mux4&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;sel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt; 

    &lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="n"&gt;fio1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fio2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;mux2&lt;/span&gt; &lt;span class="n"&gt;multiplexador1&lt;/span&gt; &lt;span class="p"&gt;(.&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sel&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fio1&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="n"&gt;mux2&lt;/span&gt; &lt;span class="n"&gt;multiplexador2&lt;/span&gt; &lt;span class="p"&gt;(.&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sel&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fio2&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

    &lt;span class="n"&gt;mux2&lt;/span&gt; &lt;span class="n"&gt;multiplexadorFinal&lt;/span&gt; &lt;span class="p"&gt;(.&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fio1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fio2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sel&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="k"&gt;endmodule&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;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).&lt;/p&gt;

&lt;h1&gt;
  
  
  Aumentando muito a complexidade com a instanciação de N módulos via Generate For
&lt;/h1&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;Um código para um somador binário de um único dígito é:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight verilog"&gt;&lt;code&gt;&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="n"&gt;adder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="n"&gt;cin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="n"&gt;cout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="n"&gt;cin&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;cin&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cin&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="k"&gt;endmodule&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O somador binário de um bit é graficamente representado assim:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsp1628hd3blo1o1zs62p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsp1628hd3blo1o1zs62p.png" alt=" " width="800" height="332"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Um somador de 2 bits a partir da instanciação do somador simples pode ser:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight verilog"&gt;&lt;code&gt;&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="n"&gt;adder2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="n"&gt;cin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="n"&gt;cout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;adder&lt;/span&gt; &lt;span class="n"&gt;ad1&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;cin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;coutIntern&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="n"&gt;adder&lt;/span&gt; &lt;span class="n"&gt;ad2&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;coutIntern&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

&lt;span class="k"&gt;endmodule&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;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.&lt;br&gt;
Contudo, fique atento, apenas wires de um único bit podem ser declarados dessa forma.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;E graficamente o somador de 2 bits fica assim:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe9vgwjenpgivrzd9uo1q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe9vgwjenpgivrzd9uo1q.png" alt=" " width="800" height="226"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E se agora quisermos um somador de 100 bits? Acho que seria muito trabalho repetir essas linhas 100 vezes, né?&lt;br&gt;
E é mesmo, mas temos uma forma mais elegante de fazer isso, o Generate For.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;Falando pode parecer difícil, então vamos direto para o código que é bastante autoexplicativo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight verilog"&gt;&lt;code&gt;&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="n"&gt;adder100&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; 
    &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;99&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="n"&gt;cin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;99&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;cout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;99&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;genvar&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;adder&lt;/span&gt; &lt;span class="n"&gt;ad0&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;cin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cout&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

     &lt;span class="k"&gt;generate&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;begin&lt;/span&gt;
                &lt;span class="n"&gt;adder&lt;/span&gt; &lt;span class="n"&gt;ad&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;cout&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;cout&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
        &lt;span class="k"&gt;end&lt;/span&gt;
     &lt;span class="k"&gt;endgenerate&lt;/span&gt;


&lt;span class="k"&gt;endmodule&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;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”. &lt;/p&gt;

&lt;p&gt;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.&lt;br&gt;
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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;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.&lt;br&gt;
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?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;E que fique a dica, essa é a resposta para o exercício &lt;a href="https://hdlbits.01xz.net/wiki/Adder100i" rel="noopener noreferrer"&gt;Adder100i&lt;/a&gt; do HDLBits!&lt;/p&gt;

&lt;p&gt;A visualização para esse circuito graficamente é:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frgkwdu1pjhv6p7tq80t9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frgkwdu1pjhv6p7tq80t9.png" alt=" " width="800" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;É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.&lt;/p&gt;

&lt;p&gt;O que faremos para testar esse tipo de circuito, então?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Testes!&lt;/strong&gt; Mais especificamente neste caso chamamos de “TestBench”, porém irei deixar isso para o próximo post!&lt;/p&gt;

&lt;h1&gt;
  
  
  Isso é tudo!
&lt;/h1&gt;

&lt;p&gt;Como sempre, obrigado por ter lido este post até aqui!&lt;/p&gt;

&lt;p&gt;Demais dúvidas, comentários e sugestões podem ser enviados aqui embaixo (para o pessoal do DevTo) ou lá no meu Twitter &lt;a href="https://twitter.com/MarlonHenq" rel="noopener noreferrer"&gt;@marlonhenq&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Flw!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Começando com Verilog</title>
      <dc:creator>Marlon</dc:creator>
      <pubDate>Sat, 16 Sep 2023 05:54:14 +0000</pubDate>
      <link>https://dev.to/marlonhenq/comecando-com-verilog-13n0</link>
      <guid>https://dev.to/marlonhenq/comecando-com-verilog-13n0</guid>
      <description>&lt;h1&gt;
  
  
  Opa, eae?
&lt;/h1&gt;

&lt;p&gt;Demorou, mas chegamos a um dos posts que realmente tinha uma galera me cobrando para fazer… Circuitos e Verilog sem mais delongas vamos para o conteúdo!&lt;/p&gt;

&lt;h1&gt;
  
  
  Introdução
&lt;/h1&gt;

&lt;p&gt;Se você quer aprender sobre Verilog acredito que já deve ter passado pela criação de circuitos com álgebra booleana no papel ou com ferramentas como &lt;a href="http://www.cburch.com/logisim/" rel="noopener noreferrer"&gt;Logisim&lt;/a&gt; e &lt;a href="https://circuitverse.org/" rel="noopener noreferrer"&gt;CircuitVerse&lt;/a&gt; (quem sabe até com redstone no Minecraft?).&lt;/p&gt;

&lt;p&gt;Caso ainda não tenha estudado sobre circuitos lógicos, você ainda pode continuar lendo este post, porém a criação de bons códigos em HDLs, se dá pelo bom conhecimento de lógica booleana, então recomendo que estude isso primeiro.&lt;/p&gt;

&lt;h1&gt;
  
  
  Álgebra Booleana (uma breve recordação)
&lt;/h1&gt;

&lt;p&gt;No princípio, um fio.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9sdvdojwtpnhav3uq2bz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9sdvdojwtpnhav3uq2bz.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;É isso mesmo, é só um fio. Porém, o importante para nós é o estado dele, também chamado de nível lógico.&lt;br&gt;
O nível lógico em circuitos digitais se dá por um intervalo de tensões e isso pode variar entre circuitos e famílias de portas lógicas, porém sempre vão seguir um padrão como este:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fheldlie7my4g66owwzoi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fheldlie7my4g66owwzoi.png" alt=" " width="245" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No nosso exemplo, com uma porta da família CMOS temos um intervalo de 5v a 3.5v o qual o circuito interpretará o sinal de entrada como HIGH (Alto), ou nível lógico 1.&lt;br&gt;
Seguindo o mesmo exemplo, entre 1.5v e 0v o circuito interpretará a entrada de sinal como LOW (Baixo), descrito também como nível lógico 0.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;PS: O que acontece caso o sinal recebido esteja entre 3.5v e 1.5v? Simplesmente isso não deve ocorrer, sério! Caso for trabalhar com CIs como este em protoboards trate de não enviar valores nesse intervalo. Os Circuitos integrados não são projetados para receber valores nesse gap e no geral, a especificação diz que não se sabe o que pode sair como resultado após entradas duvidosas como estas. Em outras palavras, seu circuito não funcionará adequadamente.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Contudo, por mais que seja importante entender de onde surgem os níveis lógicos, quando estamos trabalhando com circuitos digitais, não nos preocuparemos com a tensão em momento algum, iremos apenas tratar dos estados (Altos(1) e Baixos(0)).&lt;/p&gt;

&lt;p&gt;Assim iremos descrever algo como: “esses fios ou as entradas dessa porta, estão com nível lógico Alto ou Baixo”&lt;/p&gt;
&lt;h1&gt;
  
  
  Portas Lógicas!
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6767432j7t2gu4moyt4t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6767432j7t2gu4moyt4t.png" alt=" " width="604" height="845"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Descrevendo de maneira rápida, elas são um amontoado de componentes eletrônicos tendo como principal os transistores.&lt;br&gt;
Possuem N entradas que se unificam em uma só saída, e tem o seu comportamento descrito por tabelas verdade.&lt;/p&gt;
&lt;h1&gt;
  
  
  Circuitos Lógicos!
&lt;/h1&gt;

&lt;p&gt;A partir do momento que temos portas lógicas podemos agrupá-las em circuitos e solucionar problemas lógicos mais complexos.&lt;/p&gt;

&lt;p&gt;Vamos supor um problema:&lt;br&gt;
Você possui um escritório com duas janelas e uma porta, em cada abertura está instalado um sensor que indica quando a mesma está aberta retornando o estado 1 (e 0 quando está fechada).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxirkrczh3bzfcm6bhw0g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxirkrczh3bzfcm6bhw0g.png" alt=" " width="800" height="395"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Quando você está no escritório sempre deixa a porta aberta, e como está dentro do comodo as janelas podem estar em qualquer posição, pois ninguém tentará entrar pela janela enquanto você está por lá.&lt;br&gt;
Porém, você é uma pessoa um pouco esquecida e saiu algumas vezes do seu local de trabalho fechando a porta, porém deixando ao menos uma janela aberta.&lt;/p&gt;

&lt;p&gt;Como sabe eletrônica, resolveu colocar um alarme (que reproduz som caso receba 1 em sua entrada e fique ocioso caso receba 0) para que isso não ocorra mais. Assim, caso esteja fechando a porta, contudo ao menos uma das janelas esteja aberta, o alarme soará o fazendo entrar novamente, fechar a(s) janela(s) aberta(s) e por fim sair deixando o local em segurança.&lt;/p&gt;

&lt;p&gt;A princípio, para quem ainda está começando com lógica de boole, este problema pode parecer complexo, mas já te adianto que com uma unidade de 3 das portas citada a cima ele pode ser solucionado, vejamos:&lt;/p&gt;

&lt;p&gt;Devemos saber quando uma OU outra janela está aberta (ou até ambas), assim podemos unificar o sinal dos dois sensores das janelas na saida de uma por OR.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqo275nrtdmtt1k1o07w5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqo275nrtdmtt1k1o07w5.png" alt=" " width="423" height="152"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bom, agora sabemos quando alguma janela está aberta, caso isso aconteça E a porta esteja fechada devemos acionar o alarme! Assim, caso a saída do nosso OR seja 1 E nossa porta esteja fechada (portanto emitindo o estado 0) temos que ter o sinal 1 para nosso alarme.&lt;/p&gt;

&lt;p&gt;Podemos Inverter a saída do sensor da nossa porta, com uma porta NOT, agora quando for fechada temos como resultado 1.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4sakvt4r9rg1u655ivf7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4sakvt4r9rg1u655ivf7.png" alt=" " width="423" height="87"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E quando tivermos 1 vindo da nossa porta OR E 1 vindo da nossa porta NOT temos nosso caso de acionamento do alarme, logo um AND entre esses dois sinas pode resolver nosso problema!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9bm9mmdgsjkmcofbgudx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9bm9mmdgsjkmcofbgudx.png" alt=" " width="800" height="213"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E por fim temos nosso circuito! Mesmo com poucas portas conseguimos descrever um problema maior e real!&lt;/p&gt;

&lt;p&gt;Lógico, há muitas outras formas de se chegar neste circuito além da dedução, o ideal inclusive é utilizar formar mais elegantes, como a criação de tabelas verdades e a simplificação por mintermos ou maxtermos, quem sabe até a utilização de mapas de karnaugh.&lt;br&gt;
Porém, aqui neste post estou apenas relembrando alguns conceitos de álgebra booleana, o foco aqui será o Verilog.&lt;/p&gt;
&lt;h1&gt;
  
  
  Linguagens de Descrição de Hardware (HDLs)
&lt;/h1&gt;

&lt;p&gt;Linguagens de Descrição e Hardware são, como o próprio nome já diz, linguagens utilizadas para descrever como são hardwares.&lt;br&gt;
Ok?... Mas o que exatamente é isso?&lt;/p&gt;

&lt;p&gt;Quando se está aprendendo sobre eletrônica digital, e assim, desenvolvendo circuitos como o exemplo anterior, é comum desenhar em papéis ou utilizar ferramentas gráficas (como as já citadas Logisim e CircuitVerse), onde pelo “arrasta e solta” de portas lógicas criam-se circuitos maiores.&lt;/p&gt;

&lt;p&gt;Para pequenos projetos, essa forma de criação é válida e ajuda muito o entendimento pelo visual. Porém, projetos mais complexos exigiriam folhas e folhas ou ficariam confusos em pequenas telas. Além disso, às vezes necessita-se replicar componentes a exaustão com a instanciação de N módulos, desenhar tudo isso levaria tempo de mais e a replicação por ctrl+c, além de ser deselegante, criaria os mesmos problemas de manutenibilidade de replicação de códigos em programas.&lt;/p&gt;

&lt;p&gt;Em resposta a tudo isso, surgem as HDLs, vindo como linguagens próximas em sintaxe as linguagens de programação e tendo como vantagem extra a simulação com testes em computadores e hardwares específicos (FPGAs).&lt;/p&gt;

&lt;p&gt;As HDLs ainda podem descrever o hardware pela descrição formal de seus circuitos, isto é, descrever os componentes e portas lógicas os conectando um a um, ou também informar como o circuito deve funcionar e deixar a encargo dos compiladores e interpretadores criarem um circuito para uma resposta equivalente. (Falaremos mais disso em Verilog e suas formas Comportamentais, Estruturais e Funcionais).&lt;/p&gt;
&lt;h1&gt;
  
  
  HDLs VS Linguagens de Programação
&lt;/h1&gt;

&lt;p&gt;Se tem algo que deve ficar claro aqui e se você tiver que levar apenas um conhecimento deste grande post leve esta informação:&lt;br&gt;
“Linguagens de Descrição de Hardware NÃO são Linguagens de Programação!”.&lt;/p&gt;

&lt;p&gt;Elas de fato parecem linguagens de programação, possuem sintaxes parecidas e até copiadas, mas não são!&lt;/p&gt;

&lt;p&gt;Por que isso deve ficar claro? &lt;br&gt;
Quando se está aprendendo HDLs e não se associa o pensamento a hardware e circuitos, é muito comum, pela próxima sintaxe, cair no pensamento imperativo de linguagens comuns de programação. &lt;/p&gt;

&lt;p&gt;Isto pode fazer você pensar que as portas e módulos ali descritos estão funcionando de maneira sequencial, ou seja, um após o outro conforme estão descritos no arquivo. Porém, isto não acontece na realidade, os módulos ali descritos estão equivalentemente a circuitos fixos em uma protoboard ou PCB, não existe quem é ativado ou está funcionando primeiro (a não ser de circuitos acionados por clock), todos ali estão ao mesmo tempo, funcionando, recebendo suas entradas e acionando suas saídas. &lt;/p&gt;

&lt;p&gt;Isto tanto é verdade que, na prática, tanto faz a ordem que as linhas do seu código aparecem, você pode alterá-las mudando de ordem no arquivo e isso não mudará o circuito final feito. &lt;/p&gt;

&lt;p&gt;Lembre-se, você apenas está descrevendo uma placa dizendo o que está nela e como estão ligados.&lt;/p&gt;

&lt;p&gt;Dito isto, não programamos em Verilog ou em qualquer outra linguagem de descrição de hardware.&lt;br&gt;
Eu sei, isso é triste e decepcionante, mas como não estamos tratando de linguagens de programação, não estamos programando.&lt;br&gt;
O que estamos fazendo, então? Descrevendo!&lt;/p&gt;

&lt;p&gt;Quando se está utilizando HDLs você está descrevendo hardware, logo, quando alguém olhar sua tela e o perguntar “O que você está fazendo?”, você já tem a resposta “Eu estou descrevendo hardware!”, aposto que irá impressionar todas as gatinhas e gatões e fazer você ter um excelente encontro depois.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Um adendo: Pela minha lógica, salvo algum equívoco, não podemos programar, mas podemos sim “codar” em HDLs. Veja bem, “codar” vem da nossa forma de abrasileirar “coding” que nada mais é que “codificação”, assim, se estamos fazendo código, não interessa de qual tipo, estamos codificando ou “codando” e como HDLs são códigos, logo, podemos dizer que estamos codando em Verilog ou demais linguagens de descrição de hardware.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;
  
  
  Verilog
&lt;/h1&gt;

&lt;p&gt;Chegamos finalmente no Verilog!&lt;br&gt;
Verilog é simplesmente uma das primeiras e acredito que a linguagem de descrição de hardware mais utilizada.&lt;/p&gt;

&lt;p&gt;Nela tudo o que fazemos está dentro de módulos, assim o início de um projeto se dá pela instanciação do primeiro módulo, que pode receber qualquer nome, vamos ao código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight verilog"&gt;&lt;code&gt;&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="n"&gt;meuModulo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="n"&gt;entrada&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="n"&gt;saida&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;saida&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;entrada&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;endmodule&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Temos inicialmente a palavra reservada module, esta instancia nosso modulo, após ela vem o nome que daremos ao nosso módulo “meuModulo”.&lt;br&gt;
Em seguinte vem, entre parenteses, a listagem das entradas e saídas com as palavras reservadas input e output, e após elas os nomes das portas que damos aos nossos módulos.&lt;/p&gt;

&lt;p&gt;No fim temos a palavra reservada endmodule a qual fecha nosso bloco de módulo e ao meio que desenvolveremos a lógica deste.&lt;/p&gt;

&lt;p&gt;Como conteúdo do nosso módulo temos apenas uma linha assign entrada = saida;, nela estamos atribuindo a entrada a saída diretamente, pois não estamos fazendo nada com o sinal, ou seja, aqui criamos apenas um fio, tudo que vem pela entrada sai pela saída sem nenhuma lógica adicional.&lt;/p&gt;

&lt;p&gt;Representação visual do módulo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl9uaakpuowpwmvshe077.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl9uaakpuowpwmvshe077.png" alt=" " width="383" height="95"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  Sintaxe:
&lt;/h1&gt;
&lt;h2&gt;
  
  
  -Ligações com Fios, Registradores e Lógicos (Wires, Regs and Logics)
&lt;/h2&gt;

&lt;p&gt;Todos os inputs e outputs dos módulos em Verilog são fios (Wires), além disso, wires auxiliares podem ser declarados dentro de módulos com a sintaxe “&lt;code&gt;wire nome_do_fio;&lt;/code&gt;”.&lt;/p&gt;

&lt;p&gt;Fios funcionam como fios na vida real, isto é, ligam coisas e o estado que eles representam depende de naquele mesmo momento estarem recebendo este estado.&lt;br&gt;
Um fio só irá “devolver” 1 se no mesmo momento da “consulta” ele estiver recebendo 1 de alguma fonte.&lt;/p&gt;

&lt;p&gt;Muito parecido aos fios, registradores também recebem e emitem valores, porém estes guardam os valores recebidos até que recebam um valor diferente, ou seja, se um reg em algum momento receber o estado 1, irá emitir esse estado até que receba 0, caso nunca receba 0 irá emitir para sempre 1.&lt;/p&gt;

&lt;p&gt;A sintaxe para descrever um registrador é: “&lt;code&gt;reg nome_do_registrador;&lt;/code&gt;”&lt;/p&gt;

&lt;p&gt;Verilog recebeu diversas atualizações ao longo do tempo, porém sempre manteve compatibilidade com as versões antigas; por isso, há às vezes, muitas sintaxes e modos de se descrever a mesma coisa.&lt;br&gt;
Uma das grandes atualizações do Verilog e a mais recente é a SystemVerilog, e nela foi introduzido um novo tipo de ligação a Lógica.&lt;/p&gt;

&lt;p&gt;Em muitos códigos verilog a diferença prática entre regs e wires passa a ser nula, podendo se usar qualquer um dos dois e tendo como final um circuito que resolve o mesmo problema, além disso, essa diferença acabava por complicar um pouco o desenvolvimento em verilog sobretudo para iniciantes.&lt;/p&gt;

&lt;p&gt;Assim, na versão SystemVerilog a ligação lógica foi desenvolvida como uma abstração para substituir ambos (regs e wires) deixando a encargo do interpretador decidir como logic irá se comportar.&lt;/p&gt;

&lt;p&gt;A sintaxe para descrever um lógico é: “&lt;code&gt;logic nome_do_registrador;&lt;/code&gt;”&lt;/p&gt;
&lt;h2&gt;
  
  
  -Vetores ou Barramentos (Vectors/Buses)
&lt;/h2&gt;

&lt;p&gt;Até agora tratamos de wires, regs e logics com apenas 1 bit, porém cada um destes podem ser um vetor que representa um barramento de N bits a sintaxe para barramentos será:&lt;/p&gt;

&lt;p&gt;O tipo (wire, reg, logic) seguido do tamanho representado pelo último valor do barramento seguido de dois pontos e o primeiro valor (entre colchetes) e o nome do nosso vetor.&lt;br&gt;
Ex: Um vetor de 8 bits do tipo wire será descrito assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight verilog"&gt;&lt;code&gt;&lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Da mesma forma um vetor de 16 bits do tipo reg será descrito:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight verilog"&gt;&lt;code&gt;&lt;span class="kt"&gt;reg&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Também pode-se querer separar apenas um bit ou alguns bits de um vetor, neste caso se utiliza a mesma notação dos colchetes, porém após o nome do vetor, ex:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight verilog"&gt;&lt;code&gt;&lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo atribui-se a “a” o terceiro bit do vetor.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight verilog"&gt;&lt;code&gt;&lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste exemplo atribui-se a “b” os bits da posição 3 a 5 (lembrando que “b” deve ser declarado antes como um vetor de pelo menos 3 bits).&lt;/p&gt;

&lt;h2&gt;
  
  
  -Operadores Lógicos (Logic Operators)
&lt;/h2&gt;

&lt;p&gt;Operadores lógicos são, como o próprio nome já, diz operadores que exercem funções lógicas, ou nesse caso funções de portas lógicas.&lt;br&gt;
Assim eles irão receber dois bits e retornar a resposta de um bit coerente a ponta lógica que o símbolo representa.&lt;/p&gt;

&lt;p&gt;São eles:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Símbolo&lt;/th&gt;
&lt;th&gt;Função&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&amp;amp;&amp;amp;&lt;/td&gt;
&lt;td&gt;And&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;||&lt;/td&gt;
&lt;td&gt;Or&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;!&lt;/td&gt;
&lt;td&gt;Not&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Um exemplo utilizando o operador And, seria:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight verilog"&gt;&lt;code&gt;&lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 

&lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui o wire, result recebe constantemente o valor resultante da porta AND com as entras “a” e “b”.&lt;/p&gt;

&lt;h2&gt;
  
  
  -Operadores Bit a Bit (Bitwise Operators)
&lt;/h2&gt;

&lt;p&gt;Operadores bit a bit irão performar em cada bit de um vetor separadamente, ex:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight verilog"&gt;&lt;code&gt;&lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;//Três vetores de 3 bits cada&lt;/span&gt;

&lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui atribui-se a operação And dos vetores “a” e “b” bit a bit no resultado. Este código seria equivalente a:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight verilog"&gt;&lt;code&gt;
&lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;//Três vetores de 3 bits cada&lt;/span&gt;

&lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Onde cada bit é atribuído individualmente.&lt;/p&gt;

&lt;p&gt;Tabela de operadores bit a bit: &lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Símbolo&lt;/th&gt;
&lt;th&gt;Função&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&amp;amp;&lt;/td&gt;
&lt;td&gt;And&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;|&lt;/td&gt;
&lt;td&gt;Or&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;~&lt;/td&gt;
&lt;td&gt;Not&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;^&lt;/td&gt;
&lt;td&gt;Xor&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Operadores bit a bit ainda podem se comportar como operadores de redução de vetores, isso acontece caso sejam colocados juntos a um único vetor, realizando assim a operação do símbolo com todos os valores deste barramento, retornando um único bit resultado dessa operação. Ex:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight verilog"&gt;&lt;code&gt;
&lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 

&lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este código seria equivalente a:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight verilog"&gt;&lt;code&gt;&lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 

&lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Obs: Operadores bit a bit podem ser usados com wires, regs e lógicos de um único bit (não vetores), e irão performar igual a operadores lógicos, porém isso não é considerado uma boa prática.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  -Operadores Aritméticos (Arithmetic Operators)
&lt;/h2&gt;

&lt;p&gt;Operadores aritméticos, são os mais parecidos com linguagens de programação, eles podem ser utilizados para bits únicos, porém são bem mais comuns serem utilizados junto a vetores, a tabela que os representa é:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Símbolo&lt;/th&gt;
&lt;th&gt;Função&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;td&gt;Adição&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;Subtração&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;*&lt;/td&gt;
&lt;td&gt;Multiplicação&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/&lt;/td&gt;
&lt;td&gt;Divisão&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;%&lt;/td&gt;
&lt;td&gt;Mod (Resto da divisão)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;**&lt;/td&gt;
&lt;td&gt;Exponenciação&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Um código que representa a soma binária é:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight verilog"&gt;&lt;code&gt;&lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Atenção: Nestas operações, para o bom funcionamento, deve-se ficar atento ao tamanho dos vetores que recebem o valor da operação, visto que estes devem conseguir comportar o valor resultante da operação. Caso o vetor de destino tenha menos bits que o valor resultante, os bits mais significativos serão perdidos, podendo comprometer o bom funcionamento.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  -Representação numérica
&lt;/h2&gt;

&lt;p&gt;Verilog pode automaticamente converter números em diferentes bases para realizar comparações ou atribuições a notação para isso é:&lt;br&gt;
O tamanho necessário para armazenar o número em binário, seguido de aspas simples, uma letra reservada para representar em que base está escrita o número (d = decimal, h = hexadecimal, b = binário, o = octal) e o número propriamente dito. Ex:&lt;/p&gt;

&lt;p&gt;Atribuindo a um vetor o número 12 em decimal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight verilog"&gt;&lt;code&gt;&lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;vector&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4'd12&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Atribuindo a um vetor o número 1F em hexadecimal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight verilog"&gt;&lt;code&gt;&lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;vector&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mh"&gt;8'h1f&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Atenção: Assim como nas operações aritméticas, o vetor de destino precisa conter o número suficiente de bits para representar corretamente o número atribuído, caso isso não ocorra os bits mais significativos serão perdidos podendo comprometer a boa lógica do se circuito.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  -Concatenação e Replicação
&lt;/h2&gt;

&lt;p&gt;Ainda na manipulação de vetores tem-se a concatenação e replicação.&lt;br&gt;
A concatenação se dá por juntar bits e/ou vetores, ex:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight verilog"&gt;&lt;code&gt;&lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;vector0&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;//Concatenação de “a” e “c” (podem representar vetores ou bits únicos)&lt;/span&gt;

&lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;vector1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mb"&gt;2'b10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Concatenação de “a”, “b”, 10 (em binário) e “d”&lt;/span&gt;

&lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;vector2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Concatenação do bit na segunda posição de “a”, “b”, “c” e do intervalo de bits desde a posição 3 até a posição 1 do vetor “d”&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui atribuímos aos vetores diferentes concatenações que utilizam bits, outros vetores ou partes de outros vetores.&lt;/p&gt;

&lt;p&gt;A replicação possuí uma sintaxe muito parecida a concatenação, coloca-se quantas vezes irá se repetir o valor seguida do valor entre chaves. Ex:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight verilog"&gt;&lt;code&gt;&lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;vector0&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="mb"&gt;1'b1&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;//10 bits “1” seguidos&lt;/span&gt;

&lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;vector1&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="mb"&gt;2'b10&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;//12 vezes a replicação dos bits “10”&lt;/span&gt;

&lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;vector2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;//6 vezes o bit da posição 15 do vetor “a”&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Concatenações e replicações muitas vezes são utilizadas juntas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight verilog"&gt;&lt;code&gt;&lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;vector&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="mb"&gt;1'b0&lt;/span&gt;&lt;span class="o"&gt;}}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;//Bit da posição 15 do vetor a seguido de 15 zeros&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  -Verilog Estrutural e Funcional
&lt;/h1&gt;

&lt;p&gt;As formas Estrutual e Funcional de Verilog muitas vezes são descritas apenas como Funcional, isso vai variar de autores e sites, por isso irei explicar as duas separadamente e caso você queira, pode entende-las como uma só.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verilog Funcional:
&lt;/h2&gt;

&lt;p&gt;Para todo efeito, é o verilog que estamos usando até agora, dentro dos módulos para representar as portas e circuitos utilizamos atribuições (assign), seguidas de operadores que criam a lógica do nosso circuito, um exemplo do nosso circuito das janelas e portas descrito no começo desse post é:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight verilog"&gt;&lt;code&gt;&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="n"&gt;acionaAlarme&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="n"&gt;janela0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="n"&gt;janela1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="n"&gt;porta0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="n"&gt;saida&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;assign&lt;/span&gt; &lt;span class="n"&gt;saida&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;porta0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;janela0&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;janela1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;endmodule&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Obs: Os parenteses são usados para definir quais ligações devem acontecer primeiro (assim como em qual conta deve preceder em linguagens de programação).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Verilog Estrutural:
&lt;/h2&gt;

&lt;p&gt;O verilog Estrutural cria sua lógica chamando portas como módulos.&lt;br&gt;
A sintaxe padrão é: o nome da porta e entre parenteses seu output (sempre em primeiro) e seus inputs logo após (separados por virgulas).&lt;br&gt;
Ex:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight verilog"&gt;&lt;code&gt;&lt;span class="kt"&gt;and&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;output&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;inut1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;input2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kt"&gt;not&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;output&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;input1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E um código equivalente ao apresentado anteriormente seria:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight verilog"&gt;&lt;code&gt;&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="n"&gt;acionaAlarme1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="n"&gt;janela0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="n"&gt;janela1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="n"&gt;porta0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="n"&gt;saida&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="kt"&gt;wire&lt;/span&gt; &lt;span class="n"&gt;portaN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;janelas&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kt"&gt;not&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;portaN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;porta0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kt"&gt;or&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;janelas&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;janela0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;janela1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kt"&gt;and&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;saida&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;portaN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;janelas&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;endmodule&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Verilog Comportamental:
&lt;/h2&gt;

&lt;p&gt;Não estamos trando de Elixir, mas de fato é aqui que a mágica e alquimia acontece.&lt;/p&gt;

&lt;p&gt;Até agora descrevemos o circuito como ele é, ou seja, quais portas deve utilizar, quais segmentos de vetores deve utilizar, como estão as ligações ente módulos e etc.&lt;/p&gt;

&lt;p&gt;No verilog comportamental não faremos isso, e sim descreveremos como o circuito deve se comportar, a criação do circuito fisicamente com as portas lógicas será dada pelo interpretador.&lt;/p&gt;

&lt;p&gt;Aqui a criação de códigos Verilog se torna muito mais próxima da criação de códigos em linguagens de programação, porém volto a lembrar, por mais que você efetivamente não esteja fazendo o circuito o interpretador estará, e tudo que você cria representa um circuito em uma placa e não um código em uma máquina.&lt;/p&gt;

&lt;p&gt;A tag que marca os módulos comportamentais é a tag “always” que normalmente será sucessida de um “@” (at) e alguma entrada, como clock do circuito em circuitos com clock, alguma saida de outro módulo, ou até mesmo “*” que representa qualquer mudança possível em qualquer lugar do circuito.&lt;br&gt;
A entrada do always irá ditar quando este bloco é executado.&lt;/p&gt;

&lt;p&gt;Dentro da tag always, pode-se usar comparações com ifs ou cases ou atribuições que só ocorrem caso a entrada do always seja confirmada.&lt;/p&gt;

&lt;p&gt;O código equivalente a os dois já apresentados aqui, porém no modelo Comportamental é:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight verilog"&gt;&lt;code&gt;&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="n"&gt;acionaAlarme2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="n"&gt;janela0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="n"&gt;janela1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="kt"&gt;input&lt;/span&gt; &lt;span class="n"&gt;porta0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="kt"&gt;output&lt;/span&gt; &lt;span class="n"&gt;saida&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;always&lt;/span&gt; &lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;begin&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;porta0&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mb"&gt;1'b0&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;janela0&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;janela1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;begin&lt;/span&gt;
            &lt;span class="n"&gt;saida&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mb"&gt;1'b1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;begin&lt;/span&gt;
            &lt;span class="n"&gt;saida&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mb"&gt;1'b0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="k"&gt;endmodule&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O modelo comportamental é de fato uma linguagem a parte e é bastante complexo, sua utilização é muito comum em circuitos com armazenamento (flip-flops) como as máquinas de estado.&lt;br&gt;
Irei deixar apenas a introdução desse tipo de módulos nesse post, podendo futaramente abordar mais sobre ele em publicações futuras.&lt;/p&gt;

&lt;h1&gt;
  
  
  Ferramentas
&lt;/h1&gt;

&lt;p&gt;Para quem está começando acredito que a melhor forma de aprender é se deparar e se submeter à problemas, para isso o site &lt;a href="https://hdlbits.01xz.net/" rel="noopener noreferrer"&gt;HDLBits&lt;/a&gt; é ótimo!&lt;br&gt;
Para quem é de programação já deve ter visto sites de desafios como &lt;a href="https://exercism.org/" rel="noopener noreferrer"&gt;Exercism&lt;/a&gt; ou o &lt;a href="https://www.beecrowd.com.br/" rel="noopener noreferrer"&gt;Beecrowd&lt;/a&gt; (antigo URI Jungle), o HDLBits é a versão deles para hardware e verilog, lá há vários exercícios, os quais você submete sua resposta e ela é avaliada por testes para indicar o bom funcionamento.&lt;/p&gt;

&lt;p&gt;Caso precisem de ajuda eu tenho esse repositório com resoluções de boa parte dos exercicios do site em: &lt;a href="https://github.com/MarlonHenq/Verilog-HDLBits-solutions" rel="noopener noreferrer"&gt;https://github.com/MarlonHenq/Verilog-HDLBits-solutions&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Outra forma muito bacana de aprender Verilog e de visualizar seus códigos é utilizar o &lt;a href="https://digitaljs.tilk.eu/" rel="noopener noreferrer"&gt;DigitalJs&lt;/a&gt; que possui sua versão online no site e também é uma &lt;a href="https://marketplace.visualstudio.com/items?itemName=yuyichao.digitaljs" rel="noopener noreferrer"&gt;extensão no VSCode&lt;/a&gt;, todas as imagens dos circuitos deste post foram feitos com essa ferramenta.&lt;/p&gt;

&lt;h1&gt;
  
  
  Isso é tudo!
&lt;/h1&gt;

&lt;p&gt;Ufa! Esse post demorou muito para ser feito e foi muito complexo, mas espero que você tenha gostado e aprendido muito!&lt;br&gt;
Caso reste dúvidas deixe ai embaixo (para o pessoal do Dev.To) ou me chamem no twitter &lt;a href="https://twitter.com/MarlonHenq" rel="noopener noreferrer"&gt;@MarlonHenq&lt;/a&gt;.&lt;br&gt;
Me sigam lá para demais atualizações e posts e caso esse post tenha te ajudado não deixe de compartilhar nas suas redes.&lt;/p&gt;

&lt;p&gt;Flw!&lt;/p&gt;

&lt;h1&gt;
  
  
  Hey Saiu a continuação deste post
&lt;/h1&gt;

&lt;p&gt;Confira em: &lt;a href="https://dev.to/marlonhenq/comecando-com-verilog-2-instanciacao-de-modulos-1mno"&gt;https://dev.to/marlonhenq/comecando-com-verilog-2-instanciacao-de-modulos-1mno&lt;/a&gt;&lt;/p&gt;

</description>
      <category>hardware</category>
      <category>verilog</category>
      <category>beginners</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Criando web scrapers de maneira rápida com Beautiful Soup</title>
      <dc:creator>Marlon</dc:creator>
      <pubDate>Tue, 22 Aug 2023 15:26:18 +0000</pubDate>
      <link>https://dev.to/marlonhenq/criando-web-scrapers-de-maneira-rapida-com-beautiful-soup-4no1</link>
      <guid>https://dev.to/marlonhenq/criando-web-scrapers-de-maneira-rapida-com-beautiful-soup-4no1</guid>
      <description>&lt;h2&gt;
  
  
  Opa, eae?
&lt;/h2&gt;

&lt;p&gt;Recentemente tive que fazer um web scrapper simples (de preferência rápido) e me deparei com antigas tecnologias de raspagem de dados que já usei como Selenium e Scrapy e bom… Eles não são muito simples.&lt;/p&gt;

&lt;p&gt;Se você já usou o Selenium sabe da dificuldade e da não praticidade de ter que instalar webdrivers, depois ter o seu bot rodando em um navegador não é nada muito elegante, muito menos performático.&lt;br&gt;
Scrapy é de fato uma excelente ferramenta muito robusta para web scraping, porém ela não é muito prática, basta ver quantos arquivos ela gera para, nesse caso, um bot extremamente simples.&lt;/p&gt;

&lt;p&gt;E foi ai que eu acabei me deparando com o Beautiful Soup.&lt;/p&gt;
&lt;h2&gt;
  
  
  Beautiful Soup
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fev85214624l8fm8zpns7.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fev85214624l8fm8zpns7.gif" alt=" " width="498" height="278"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Beautiful Soup é uma biblioteca de Python para análise de documentos HTML e XML. O que ele faz é transformar o conteúdo do arquivo em uma árvore de ficheiros, assim fica mais fácil por meio dos métodos da própria lib pesquisar e modificar trechos do código HTML.&lt;/p&gt;

&lt;p&gt;Para usarmos essa lib precisamos do nosso gerenciador de pacotes do Python o Pip e rodar o seguinte comando no terminal mais próximo:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;pip install beautifulsoup4&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;E é isso! Nada de projetos pré-prontos gigantes e com 300 arquivos. Bora codar!&lt;/p&gt;
&lt;h2&gt;
  
  
  Extraindo dados do Quotes to Scrape
&lt;/h2&gt;

&lt;p&gt;Para quem não sabe o “&lt;a href="https://quotes.toscrape.com/page/1/" rel="noopener noreferrer"&gt;Quotes to Scrape&lt;/a&gt;” é um site de citações de pessoas famosas feito justamente para treinar scraping. Ele não apresenta de fato grandes desafios que podem acontecer no trabalho de raspagem de sites mais complexos e que talvez que até tentem impedir automatizações, mas serve como um treino inicial para começar nesse mundo.&lt;/p&gt;

&lt;p&gt;O objetivo aqui será vasculhar todas as páginas (10 no total) e procurar todas as citações a Albert Einstein.&lt;br&gt;
Não irei fazer suspense, então segue o código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;bs4&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BeautifulSoup&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="c1"&gt;# URL of the page we want to scrape
&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://quotes.toscrape.com/page/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;initial_page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;end_page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;author&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Albert Einstein&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;quotes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

&lt;span class="c1"&gt;# Loop through the pages
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;initial_page&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;end_page&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

    &lt;span class="c1"&gt;# Get the HTML content
&lt;/span&gt;    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

    &lt;span class="c1"&gt;# Create a BeautifulSoup object
&lt;/span&gt;    &lt;span class="n"&gt;soup&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;BeautifulSoup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;html.parser&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Get the quotes
&lt;/span&gt;    &lt;span class="n"&gt;page_quotes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;soup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find_all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;div&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;class_&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;quote&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Verify if the author is in the quote and save it
&lt;/span&gt;    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;quote&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;page_quotes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;quote&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;small&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;class_&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;author&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;author&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;quote_text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;quote&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;span&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;class_&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;

            &lt;span class="n"&gt;quotes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;quote_text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Quote found: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;quote_text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Number of quotes: &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;quotes&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Link para o código no GitHub: &lt;a href="https://github.com/MarlonHenq/Web-Scraping-Quotes-to-Scrape-Beautiful-Soup" rel="noopener noreferrer"&gt;https://github.com/MarlonHenq/Web-Scraping-Quotes-to-Scrape-Beautiful-Soup&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Extremamente simples, né? (ainda mais com um comentário a cada linha hahah)&lt;/p&gt;

&lt;p&gt;Mas vamos de alguns pontos:&lt;/p&gt;

&lt;p&gt;Bom, o BS não pega as informações da página diretamente da web, então a gente chama também a lib “requests” para poder pegar o conteúdo em texto do HTML da página por meio do &lt;strong&gt;requests.get()&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Dado o código da página a gente faz a nossa sopa com &lt;strong&gt;BeautifulSoup(response.text, “html.parser”)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Aí é só aplicar os filtros! Selecionamos todos os quotes com &lt;strong&gt;soup.find_all(“div”, class_=”quote”)&lt;/strong&gt;. Marlon, como eu sei qual tag e classe devo pegar? Basta olhar o código dá página, inspecione o elemento de um quote com botão direito do mouse e tenha isso:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4tsfqhhgkmvltdmx63bz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4tsfqhhgkmvltdmx63bz.png" alt=" " width="800" height="391"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Possuindo todas as citações de uma página verificamos se o autor é o nosso querido cientista de língua para fora (Novamente basta olhar as tags e classes no código da página com o inspecionar elemento), e caso for salvamos na nossa lista de quotes e escrevemos a mensagem na tela.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu1sm9158qtxuqk1r00bd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu1sm9158qtxuqk1r00bd.png" alt=" " width="800" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bingo! Temos todas as frases de Einstein na tela!&lt;/p&gt;

&lt;h2&gt;
  
  
  Isso é tudo!
&lt;/h2&gt;

&lt;p&gt;Post extremamente simples, de uma ferramenta muito útil no seu dia a dia.&lt;/p&gt;

&lt;p&gt;Caso queira outro exemplo, tenho o código que me inspirou a fazer esse post, um raspador do ranking do HDLBits disponível em: &lt;a href="https://github.com/MarlonHenq/Web-Scraping-HDLBits-profiles" rel="noopener noreferrer"&gt;https://github.com/MarlonHenq/Web-Scraping-HDLBits-profiles&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Se gostou, não se esqueça de me seguir lá no Twitter para receber mais posts: @&lt;a href="https://twitter.com/MarlonHenq" rel="noopener noreferrer"&gt;MarlonHenq&lt;/a&gt;&lt;br&gt;
Aproveita e me responde lá se sopa é ou não janta.&lt;/p&gt;

&lt;p&gt;Vou indo que minha sopa já está pronta!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsvqjbwirxqyv0xrsrhdp.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsvqjbwirxqyv0xrsrhdp.gif" alt=" " width="600" height="450"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Este post foi originalmente postando em: &lt;a href="https://blog.marlonhenq.dev/posts/5/criando-web-scrapers-de-maneira-rapida-com-beautiful-soup.php" rel="noopener noreferrer"&gt;blog.marlonhenq.dev&lt;/a&gt; - Dia 29-06-2023&lt;/p&gt;

</description>
      <category>python</category>
      <category>webscraping</category>
      <category>beginners</category>
      <category>programming</category>
    </item>
    <item>
      <title>Git e GitHub: O que são e qual a diferença</title>
      <dc:creator>Marlon</dc:creator>
      <pubDate>Tue, 22 Aug 2023 15:19:01 +0000</pubDate>
      <link>https://dev.to/marlonhenq/git-e-github-o-que-sao-e-qual-a-diferenca-1kei</link>
      <guid>https://dev.to/marlonhenq/git-e-github-o-que-sao-e-qual-a-diferenca-1kei</guid>
      <description>&lt;h2&gt;
  
  
  Opa, eae?
&lt;/h2&gt;

&lt;p&gt;Se você está entrando na área de tecnologia com certeza já ouviu esses dois termos e já viu alguém ou até mesmo você já confundiu os dois e é esse o objetivo desse post, elucidar os conceitos e de quebra aprender a usar um pouco.&lt;br&gt;
Porém, já aviso: esse post, por mais que utilize alguns comandos, não tem a pretensão de ser um tutorial de Git, caso você queria algo assim sugiro que consulte o &lt;a href="https://github.com/DanielHe4rt/git4noobs" rel="noopener noreferrer"&gt;Git4noobs&lt;/a&gt; ou a &lt;a href="https://git-scm.com/docs" rel="noopener noreferrer"&gt;documentação&lt;/a&gt;.&lt;br&gt;
Aqui focaremos no que são, o motivo de serem criados e para que usamos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Git
&lt;/h2&gt;

&lt;p&gt;O Git é uma ferramenta de versionamento de código (na verdade, qualquer tipo de arquivo de texto basicamente), mas o que é uma ferramenta de versionamento?&lt;br&gt;
Quando você criou algum projeto seja ele texto, edição de vídeo, imagem ou código, já deve ter criado versões dele e acabou com uma pasta cheia de cópias como “certo-sem-capa.docx”, “terminado.docx”, “finalEnviar.docx”, “agoraSimFinal.docx”, “ENVIARRRR.docx”?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9vttc29joogn9wnh60g2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9vttc29joogn9wnh60g2.png" alt=" " width="529" height="366"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Eu diria que a maioria já fez algo parecido e nisso temos alguns problemas:&lt;br&gt;
  - Não sabemos qual realmente é o arquivo de projeto final, se alguns meses se passarem nem você que criou muito provavelmente vai saber.&lt;br&gt;
  - Não sabemos também qual foi a evolução, ou seja, qual arquivo fomos modificando para chegar em outro arquivo.&lt;br&gt;
  - No caso específico de texto (e código, claro), também é bem provável que já tenha escrito um parágrafo ou função, tenha apagado e em outro dia tenha percebido que não deveria, ai o único jeito é escrever de novo.&lt;br&gt;
  - Cada nova “versão” do seu projeto requer uma cópia do arquivo original com as partes que não foram modificadas e também as que foram inseridas, removidas ou modificadas, ou seja, você passa a guardar dados em redundância consumindo mais espaço que o necessário. Em um arquivo isso pode até ser desprezível considerando o custo baixo de armazenamento de hoje, mas em grandes repositórios de projetos isso pode representar uma boa perda de espaço.&lt;/p&gt;

&lt;p&gt;Como resolver tudo isso? Git! Git, meus amigos!&lt;/p&gt;

&lt;p&gt;E como o Git resolve isso?&lt;/p&gt;

&lt;p&gt;A partir do momento que você já tem o git instalado no seu computador para iniciar um novo projeto basta estar na pasta/diretório e utilizar o ‘&lt;strong&gt;git init&lt;/strong&gt;’.&lt;br&gt;
Assim você acaba de criar um repositório Git no seu projeto. A princípio, nada ocorre, mas para os olhos mais atentos foi criado a pasta (diretório) ".git" (por padrão no linux pastas/repositórios ou arquivos iniciados com ‘.’ (ponto) são ocultos, assim para ver deve-se habilitar a visualização de arquivos ocultos no seu gerenciador de arquivos).&lt;/p&gt;

&lt;p&gt;Você NUNCA deve mexer na “.git” caso não queira problemas, estou falando aqui mais para critério de curiosidade de onde ficam as configurações do seu repositório e as alterações commitadas do seu código. É importante saber da “.git” também caso queira copiar os arquivos para outro lugar e também queira levar o git com suas configurações de projeto e commits junto (apesar de termos formas mais elegantes de fazer uma cópia pelo git).&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ps. Explicarei o que é ‘commit’ logo.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Tendo um repositório git, o próximo comando será para adicionar os seus arquivos de código nele, para isso vamos digitar o ‘*&lt;em&gt;git add * *&lt;/em&gt;’ (git add pode receber nomes de arquivos ou os parâmetros ‘*’, ou ‘.’ para adicionar todos os arquivos possíveis presentes no diretório).&lt;/p&gt;

&lt;p&gt;O ‘&lt;strong&gt;git add&lt;/strong&gt;’ apenas lista e mostra os arquivos que receberam alterações foram adicionados ou removidos adicionando tudo isso em um local separado (chamamos esse local de “Área de staging” e você pode ver essas modificações utilizando ‘git status’), mas ainda nada foi ‘salvo’, para isso devemos usar o "&lt;strong&gt;git commit -m “Comentário do seu commit&lt;/strong&gt;”".&lt;br&gt;
E Pronto, o que basicamente acabou de ser feito foi uma imagem do seu repositório atual com todos os arquivos que estão presentes nele, a partir de agora quaisquer modificações que forem feitas adicionadas pelo ‘&lt;strong&gt;git add&lt;/strong&gt;’ e commitadas pelo ‘&lt;strong&gt;git commit&lt;/strong&gt;’ serão salvas também no seu repositório git.&lt;/p&gt;

&lt;p&gt;Massa Marlon! Mas o que realmente acabou de ser feito?&lt;/p&gt;

&lt;p&gt;Bora lá, quando você iniciou seu repositório pelo "git init" e após isso commitou sua primeira alteração o git salvou o primeiro estado dos seus arquivos, por exemplo:&lt;/p&gt;

&lt;p&gt;Aqui tenho uma pasta com dois arquivos o “code.lua” e o “comentarios.txt”.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmwrtldkw9h59yykfv5ck.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmwrtldkw9h59yykfv5ck.png" alt=" " width="651" height="473"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O conteúdo de “code.lua” é:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu76rn05wgarwagtkltfa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu76rn05wgarwagtkltfa.png" alt=" " width="620" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O conteúdo de “comentarios.txt” é:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv79qhtaet5ul5g8itbzi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv79qhtaet5ul5g8itbzi.png" alt=" " width="800" height="368"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ainda não temos nenhum repositório Git criado aqui então bora lá:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsa0lb1irpkyfkf7evg3k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsa0lb1irpkyfkf7evg3k.png" alt=" " width="800" height="481"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após um repositório vazio criado precisamos adicionar nossos arquivos:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbu3tiwxhg79ydb9ep52v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbu3tiwxhg79ydb9ep52v.png" alt=" " width="800" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Arquivos adicionados à área de staging, agora falta só commitar:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa7k4qpemxwl3v19uduem.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa7k4qpemxwl3v19uduem.png" alt=" " width="800" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Beleza! Primeiro commit feito, mas eai?&lt;/p&gt;

&lt;p&gt;Vamos modificar um arquivo (code.lua) para poder testar um pouco mais:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl53ihda68x2xeooy1pih.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl53ihda68x2xeooy1pih.png" alt=" " width="800" height="473"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E agora vamos commitar essas mudanças:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdvb1rasdo4blhdxjlfe7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdvb1rasdo4blhdxjlfe7.png" alt=" " width="800" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tudo salvo, se dermos um ‘&lt;strong&gt;git log&lt;/strong&gt;’ podemos ver nossos commits aqui.&lt;/p&gt;

&lt;p&gt;Blz, mas como eu posso ver essas modificações?&lt;br&gt;
Com o ‘&lt;strong&gt;git diff&lt;/strong&gt;’ podemos fazer a diferença entre dois commits e ver a evolução do código:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkagn5axn4itkb3gmzty1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkagn5axn4itkb3gmzty1.png" alt=" " width="800" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbw35bw52d8bk999nxuhk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbw35bw52d8bk999nxuhk.png" alt=" " width="800" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pronto! Percebemos agora que todas as alterações que fazemos e commitamos ficam salvas e podem ser consultadas posteriormente, inclusive caso você queira desfazer as alterações você pode voltar a commits anteriores por meio do ‘&lt;strong&gt;git reset&lt;/strong&gt;’.&lt;br&gt;
Porém, acho que já joguei comandos demais para você e como o objetivo desse post não é ser um tutorial de como usar Git e sim entender como ele funciona e como usamos deixarei o resto com a documentação e o Git4noobs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Branches (ramificações)
&lt;/h2&gt;

&lt;p&gt;Todas as alterações salvas que fizemos até agora (os commits) estão localizadas em uma ramificação/branch.&lt;br&gt;
A branch principal do git por padrão é chamada de “master”, também em alguns lugares e repositórios mais novos ela pode ser chamada de “main”, isso acontece pelo histórico não muito legal da palavra “master” e o que ela pode significar em outros contextos.&lt;br&gt;
Inclusive caso você queria mudar o nome da sua branch utilize &lt;strong&gt;git branch -m “novo nome”&lt;/strong&gt;, isso é muito comum de ser feito.&lt;/p&gt;

&lt;p&gt;A utilização de branches serve para organizar melhor o seu repositório. Você pode, por exemplo, identificar um bug e perceber que terá que realizar vários commits para arrumá-lo, assim você cria uma branch especial com outro nome só para resolver o bug e quando estiver tudo certo realiza o ‘merg’ (de fundir mesmo), ou seja, taca as alterações que corrigem esse bug para a sua branch de origem.&lt;/p&gt;

&lt;p&gt;Branches também são muito usadas para trabalhar em conjunto!&lt;br&gt;
Até aqui só falamos de repositórios locais, mas a maioria dos repositórios locais estão relacionados a algum repositório armazenado em algum servidor, justamente para servir a várias pessoas. Dessa forma, você e seu amigo podem, ao mesmo tempo, modificar partes do código, cada um em sua branch, ao final cada um funde seu código à ‘main’ e o projeto está pronto (parece muito mais elegante que trocar arquivos por drive, né?).&lt;/p&gt;

&lt;p&gt;Diferentes branches também são bastante utilizadas hoje, pois as branches main/master (ou qualquer outro nome da branch principal do repositório) estão muito relacionadas ao deploy. Ou seja, em alguns projetos tudo que vai a branch principal vai automaticamente ao servidor em produção, assim fica meio óbvio perceber que não é bom codar diretamente nessas branches, pois qualquer alteração será automaticamente uma atualização na aplicação.&lt;br&gt;
Traduzindo em miúdos, qualquer erro commitado na main vai derrubar a sua aplicação nesse tipo de repositório, logo é bom desenvolver e testar em outra ramificação.&lt;/p&gt;

&lt;h2&gt;
  
  
  GitHub
&lt;/h2&gt;

&lt;p&gt;Chegamos nele! O tal do GitHub!&lt;/p&gt;

&lt;p&gt;O GitHub é, de maneira simples, o maior host de repositórios Git do mundo. Quando falei que a maioria dos repositórios locais estão relacionados a algum repositório em algum servidor, geralmente estão no GitHub. E de quebra o GitHub dá uma interface amigável para visualizar, mergear’ branches, administrar acessos a repositórios e deixar público repositórios Git abertos. Grandes projetos open source estão publicados e são mantidos por lá.&lt;/p&gt;

&lt;p&gt;O GitHub se descreve, e de certa forma é mesmo, uma rede social. Lá você tem o seu perfil, pode deixar alguns repositórios seus abertos como uma forma de mostrar o seu trabalho, ainda pode seguir pessoas e dar estrelas (basicamente likes) em seus repositórios.&lt;/p&gt;

&lt;p&gt;Vale lembrar que como o GitHub ainda existem outros serviços como &lt;a href="https://bitbucket.org/" rel="noopener noreferrer"&gt;Bitbucket&lt;/a&gt; e &lt;a href="https://about.gitlab.com/" rel="noopener noreferrer"&gt;GitLab&lt;/a&gt;, que basicamente são concorrentes diretos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Diferença entre Git e Github
&lt;/h2&gt;

&lt;p&gt;Se você leu esse post até aqui, primeiro, obrigado! Mas espero que você entenda que querer falar de diferença entre Git e GitHub não faz sentido, a pergunta “Qual a diferença entre Git e GitHub?” não faz sentido.&lt;br&gt;
Isso acontece porque eles não são nem conceitos iguais, nem diferentes, o Git se propõe a ser um software de versionamento com a possibilidade de conectar repositórios locais a remotos. Partindo dessa ideia o GitHub vem como uma rede social onde se hospeda repositórios Git podendo facilitar a disponibilidade de código e compartilhamento de projetos. O conceito do GitHub depende da existência do Git, mas não tem como compará-los, pois eles nem possuem o mesmo propósito.&lt;/p&gt;

&lt;p&gt;Existe uma piada de que quando se pergunta “Qual a diferença entre Git e GitHub?” a resposta sempre é “É a mesma que a do Porn e do PornHub” e o maior problema é que realmente é uma boa comparação! Do mesmo jeito que existem repositórios Git, existem vídeos pornôs e do mesmo jeito que você pode compartilhar seu repositório online no GitHub, bom, existe o PornHub para o outro lado também kkkkk&lt;br&gt;
Eu não sei se precisava explicar isso para você com esse nível de detalhamento, porém acredito que agora fica fácil de entender...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj7v72n6ahmwhx0d584vn.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj7v72n6ahmwhx0d584vn.gif" alt=" " width="498" height="249"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Bom, isso é tudo pessoal!
&lt;/h2&gt;

&lt;p&gt;Meu documento de texto aqui já está na sétima página isso que ele nem possui as imagens que serão adicionadas no post final que você acabou de ler.&lt;/p&gt;

&lt;p&gt;Espero que tenha aprendido e entendido um pouco mais sobre essas tecnologias aqui, para saber de novos posts me siga lá no Twitter: @&lt;a href="https://twitter.com/MarlonHenq" rel="noopener noreferrer"&gt;MarlonHenq&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Obrigado por ter lido!&lt;/p&gt;

&lt;p&gt;Flw!&lt;/p&gt;




&lt;p&gt;Este post foi originalmente postando em: &lt;a href="https://blog.marlonhenq.dev/posts/4/git-e-github:-o-que-sao-e-qual-a-diferenca.php" rel="noopener noreferrer"&gt;blog.marlonhenq.dev&lt;/a&gt; - Dia 29-05-2023&lt;/p&gt;

</description>
      <category>git</category>
      <category>github</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Plataformas e Tecnologias Gratuitas para Estudantes</title>
      <dc:creator>Marlon</dc:creator>
      <pubDate>Tue, 22 Aug 2023 15:06:27 +0000</pubDate>
      <link>https://dev.to/marlonhenq/plataformas-e-tecnologias-gratuitas-para-estudantes-489</link>
      <guid>https://dev.to/marlonhenq/plataformas-e-tecnologias-gratuitas-para-estudantes-489</guid>
      <description>&lt;h2&gt;
  
  
  Opa eae!?
&lt;/h2&gt;

&lt;p&gt;Se vocês pensam que nós fomos embora, nós enganamos vocês, fingimos que fomos e voltamos, Ói nós aqui outra vez!&lt;/p&gt;

&lt;p&gt;Eu sei, eu sei… Disse que iria postar aqui todos os meses e o resultado foi mais de um ano em hiato. Porém, estou de volta aqui para falar sobre ferramentas gratuitas que você pode ter sendo um estudante de faculdades de tecnologias (e até outros cursos também).&lt;/p&gt;

&lt;p&gt;Vamos lá!&lt;/p&gt;




&lt;h2&gt;
  
  
  JetBrains
&lt;/h2&gt;

&lt;p&gt;Se você está no mundo de tecnologia há algum tempo já deve ter ouvido o nome da JetBrains, mas caso ainda não saiba ela é a empresa responsável por muitos softwares de desenvolvimento (as famosas IDEs) amplamente utilizados como PHPStorm, PyCharm, DataGrip, IntelliJ IDEA e etc.&lt;/p&gt;

&lt;p&gt;O legal disso tudo é que a maioria dos softwares estão disponíveis gratuitamente pelo pacote de estudantes e você pode fazer o seu cadastro em: &lt;a href="https://www.jetbrains.com/community/education/" rel="noopener noreferrer"&gt;https://www.jetbrains.com/community/education/&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  AutoDesk
&lt;/h2&gt;

&lt;p&gt;Famosa entre os engenheiros principalmente pelo AutoCad a AutoDesk também é uma gigante dos softwares de engenharia e design.&lt;/p&gt;

&lt;p&gt;Mais especificamente para o pessoal de TI eu indico o Eagle e o Fusion 360 (que são os que eu mais usei). Sendo o primeiro um software de criação de circuitos e PCBs e o segundo um software de modelagem 3D para desde simulações de tensão de carga até a criação de peças para impressões 3D.&lt;/p&gt;

&lt;p&gt;O interessante ainda desses dois programas é que ambos possuem integrações, sendo possível a criação de uma PCB no Eagle que é posteriormente exportada para dentro de uma case em 3D no Fusion. Assim pode-se criar um produto final completo apenas com esses dois softwares.&lt;/p&gt;

&lt;p&gt;Da mesma forma que a JetBrains o cadastro de estudante é bem simples e pode ser feito por esse link: &lt;a href="https://www.autodesk.com.br/education/edu-software/overview?sorting=featured&amp;amp;filters=individual" rel="noopener noreferrer"&gt;https://www.autodesk.com.br/education/edu-software/overview?sorting=featured&amp;amp;filters=individual&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  GitHub Pro, GitHub Student Developer Pack e GitHub Copilot
&lt;/h2&gt;

&lt;p&gt;Eu ainda falarei muito mais sobre versionamento, Git e GitHub nesse blog (e provavelmente em outras redes sociais minhas), mas se você está minimamente inserido no mundo de TI já deve ter ouvido falar sobre a plataforma que é o GitHub e sabe que ela é bastante importante para a comunidade de tecnologia.&lt;/p&gt;

&lt;p&gt;Então, saiba que você pode ter a conta Pro, a inteligência artificial ajudante de escrita de códigos (Copilot) e a todo um programa que te dá acesso a outros softwares e plataformas importantes no mundo de tecnologia (Student Developer Pack) de graça sendo um estudante.&lt;/p&gt;

&lt;p&gt;Sobre o Student Developer Pack eu ainda destaco duas plataformas que é a Termius, um software que eu utilizo bastante para acessar servidores remotamente por SSH e a DataDog, uma plataforma de análise e monitoramento de servidores, bancos de dados e serviços muito utilizada no mercado.&lt;/p&gt;

&lt;p&gt;Para realizar sua inscrição basta ir para esse link: &lt;a href="https://education.github.com/pack" rel="noopener noreferrer"&gt;https://education.github.com/pack&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Isso é tudo, pessoal
&lt;/h2&gt;

&lt;p&gt;O objetivo desse post é ser rápido mesmo e apresentar softwares que eu pessoalmente acabo utilizando no meu dia-a-dia graças a eu ser um estudante de faculdade de tecnologia.&lt;br&gt;
Obviamente existem muitas outras plataformas com vantagens para discentes (e até docentes) e quem sabe eu não acabe fazendo uma versão 2 desse post, mas por hoje é isso, em breve devo voltar com mais conteúdos para esse blog.&lt;/p&gt;

&lt;p&gt;Não se esqueçam de me seguir no Twitter para receberem notificações de novas postagens: @&lt;a href="https://twitter.com/MarlonHenq" rel="noopener noreferrer"&gt;marlonhenq&lt;/a&gt;&lt;br&gt;
E para demais redes sociais e contatos mais profissionais chequem o meu site: &lt;a href="https://marlonhenq.dev" rel="noopener noreferrer"&gt;MarlonHenq.dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Flw!&lt;/p&gt;




&lt;p&gt;Este post foi originalmente postado em: &lt;a href="https://blog.marlonhenq.dev/posts/3/plataformas-e-tecnologias-gratuitas-para-estudantes.php" rel="noopener noreferrer"&gt;blog.marlonhenq.dev&lt;/a&gt; - Dia 21-05-2023&lt;/p&gt;

</description>
      <category>beginners</category>
    </item>
    <item>
      <title>Manual de Sobrevivência na Campus Party 14</title>
      <dc:creator>Marlon</dc:creator>
      <pubDate>Tue, 22 Aug 2023 15:01:06 +0000</pubDate>
      <link>https://dev.to/marlonhenq/manual-de-sobrevivencia-na-campus-party-14-36j5</link>
      <guid>https://dev.to/marlonhenq/manual-de-sobrevivencia-na-campus-party-14-36j5</guid>
      <description>&lt;h2&gt;
  
  
  OOOooooOOOOoooOOOo!!!
&lt;/h2&gt;

&lt;p&gt;Eae? Vai para Campus Party? É a sua primeira vez? Então, cola aqui que eu vou te explicar tudo (ou quase tudo) do evento!&lt;/p&gt;




&lt;h2&gt;
  
  
  Cheguei! E agora?
&lt;/h2&gt;

&lt;p&gt;Se você acabou de chegar no Anhembi prepare-se: você vai pegar filas. Sim, no plural!&lt;br&gt;
E se tem uma coisa que o campuseiro gosta é de fila, entramos em filas até sem saber onde elas vão dar, então já pode ir se acostumando…&lt;/p&gt;

&lt;p&gt;Mas a primeira fila que você deve pegar é a do credenciamento, nela você deve apresentar todos os documentos necessários (que estão listados no Guia do Campuseiro) para te identificarem e te darem a sua credencial.&lt;/p&gt;

&lt;p&gt;Pegando a sua credencial coloque logo no pescoço já que o uso dela dentro do evento é obrigatório e ela que será usada para te identificar quando você sai e entra do pavilhão e da área de camping.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1oh3fty7abqi7bfd75tz.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1oh3fty7abqi7bfd75tz.jpg" alt="Crachás das edições passadas" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Próximoooooo!
&lt;/h2&gt;

&lt;p&gt;Agora vamos para mais filas!!!&lt;br&gt;
Caso você vai acampar (o que eu recomendo para ter a experiência mais completa), direcione-se para a fila da primeira entrada do evento. Essa é de fato a mais demorada, pois a Staff estará revistando o que o pessoal anda levando para o local (no geral vão passar suas malas no raio-x e só abrir se acharem algo meio estranho, mas já aconteceu de um dos raio-x queimar nessa hora e terem que revistar boa parte das bagagens).&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Falando em revistas fica aí um aviso: É proibida a entrada com bebidas alcoólicas no evento!!&lt;br&gt;
Porém, vou falar um pouco mais disso futuramente nesse mesmo post…&lt;/code&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Entrei!!
&lt;/h2&gt;

&lt;p&gt;Estando finalmente dentro do Anhembi você possui basicamente duas escolhas e a ordem não muda muito, mas irei dizer na que prefiro.&lt;/p&gt;

&lt;p&gt;Primeiro, bora guardar essas tralhas na barraca?!&lt;br&gt;
Para encontrar a sua barraca basta ver o seu crachá que terá escrito em algum lugar algo como “E11” ou “H21”, esse é o endereço da sua barraca e basta andar um pouco até encontrar ela fisicamente (quase que em uma batalha naval seguindo as letras e números).&lt;/p&gt;

&lt;p&gt;Já que estamos falando da barraca, vamos de umas dicas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Leve um cadeado para unir os zíperes de sua barraca trancando-a e deixando suas coisas em segurança.&lt;/li&gt;
&lt;li&gt;A barraca é sua (isso mesmo) e no final do evento, se quiser, pode desmontar e levar para casa.&lt;/li&gt;
&lt;li&gt;Para ter boas noites lembre-se de levar algo para deitar (saco de dormir, colchão inflável, colchonete e etc), algo para apoiar sua cabeça (travesseiro inflável, almofada ou até um travesseiro mesmo) e, caso tenha espaço e achar necessário, algo para se cobrir (assim como outros itens como um lençol para o seu colchão).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Após ter arrumado a sua barraca já deixando pronta para tirar aquela soneca (se for encher colchão, faça relativamente cedo, você não que acordar o coleguinha do lado com o barulho da bomba de encher, né?), bora para a segunda coisa!&lt;/p&gt;

&lt;p&gt;Vamos de mais filas! Eba!! Porém, essa é a última.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;(Editor do futuro veio para avisar: Essa definitivamente não será a última. Ame as filas!)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Pegue o se PC ou notebook para a fila de Cadastro de Equipamento, nela seu equipamento principal será cadastrado e receberá uma etiqueta para ficar vinculado a você.&lt;br&gt;
Detalhe: Só PCs e Notebooks são cadastrados. Celulares, tablets, consoles e periféricos mesmo muitas vezes sendo mais caros que computadores não são. Cuide bem deles!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frcco6j890dlane7buz9c.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frcco6j890dlane7buz9c.gif" alt=" " width="700" height="350"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Setup!
&lt;/h2&gt;

&lt;p&gt;Tudo pronto para pegar seu computador escolher um lugar nas mesas e montar o seu setup, logo, vamos de mais dicas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Você tem direito a um cabo de rede com acesso à internet e uma tomada na mesa, assim, para ligar mais equipamentos, considere levar um filtro de linha e no caso da rede um switch e cabos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Não há Wi-Fi.&lt;br&gt;
O que a maioria dos campuseiros faz é levar o seu roteador para criar suas redes privadas, o problema é que se acaba tendo um ‘flood’ de sinal e assim todas as conexões wireless acabam ficando lentas. Então, se puder, junte seus amigos em uma mesa só para compartilharem o mesmo sinal.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Não entre em redes que você não sabe de quem são!&lt;br&gt;
Por mais que a Campus seja um ambiente bem seguro, estamos falando de uma galera que manja e ama brincar com tecnologia e de ser o ‘hackerman’, portanto, NÃO entre em qualquer rede aberta (inclusive isso é uma dica para vida).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Falando em ambiente seguro… Sim, nós deixamos os computadores em cima das mesas e saímos, vamos dormir, vemos palestras, vamos comer e etc. E no geral não há casos de furtos no evento (se quiser é só pesquisar), contudo, mesmo assim, é sempre recomendado cuidar bem de suas coisas.&lt;br&gt;
Se o seu notebook (computador e/ou monitores) possuem a “K-Slot” ou “kensington lock” (uma entrada geralmente com um cadeado desenhado ao lado) é possível usar uma tranca de computador (encontra-se facilmente a venda na internet) para prende-lo na mesa ou até em outras coisas.&lt;br&gt;
Caso esteja indo com amigos busquem revezar quem fica na mesa cuidando dos equipamentos.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Palcos!
&lt;/h2&gt;

&lt;p&gt;A Campus Party conta com palcos com temas diferentes e palestras diversas durante todo o dia, então, vale ficar ligado no cronograma de palestras que deve ser liberado em breve no site do evento para marcar as que quer ir.&lt;/p&gt;

&lt;p&gt;Após o horário que se encerram as palestras, os palcos, no geral, ficam livres para as pessoas se reunirem, assim não se espante de ver, por exemplo, às duas da manhã uma roda de violão ou conversas diversas rolando nos palcos, se quiser, não hesite em participar aposto que irão te receber bem.&lt;/p&gt;




&lt;h2&gt;
  
  
  Comida!
&lt;/h2&gt;

&lt;p&gt;Há algumas opções para se alimentar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pacote alimentação (Catering): Irá oferecer as 3 refeições diárias na maioria dos dias de evento (com a exceção do dia de entrada que geralmente não há café, afinal o credenciamento, no geral, começa ao meio-dia e no dia de saída que não terá a janta e talvez o almoço dependendo dos horários), nas edições que já fui optei por ele e a comida era muito boa, além de ser à vontade no almoço e janta.
O café da manhã é um pouco mais limitado, porém mais que o suficiente (na minha opinião) sendo uma sacolinha com pãezinhos recheados com queijo, alguma fruta e um bolinho, o leite e/ou café são à vontade.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A desvantagem é que o preço do catering é um pouco salgado.&lt;/p&gt;

&lt;p&gt;Obs: No momento que estou escrevendo esse post segundo a organização do evento “o Catering está em processo de negociação com os fornecedores”.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Ainda no evento pode-se encontrar alguns quiosques com lanches (Obs: os preços também devem ser um pouco caros).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;O que muitos campuseiros fazem, além de levar snacks, é ir para fora do pavilhão pedir delivery ou encontrar com os vendedores que, sabendo anteriormente do evento, já vão preparados com marmitas, pizzas e lanches para vender na porta.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Campus B
&lt;/h2&gt;

&lt;p&gt;Falando em sair do evento, aos arredores da Campus sobretudo de noite, acontece o que chamamos de Campus B. O que ocorre é que basicamente os campuseiros se juntam para trocar uma conversa mais descontraída e comer uma pizza dos vendedores que citei anteriormente.&lt;/p&gt;

&lt;p&gt;Lembra das bebidas? Sendo proibidas dentro do evento, o pessoal aproveita para comprar e tomar ali fora mesmo (com moderação hein).&lt;/p&gt;




&lt;h2&gt;
  
  
  Open Campus
&lt;/h2&gt;

&lt;p&gt;Além da Campus B, temos a Open Campus, só que essa é oficial do evento e conta com diferentes atrações: Simuladores de voos e corrida, batalha de robôs, corridas de drones e etc.&lt;/p&gt;

&lt;p&gt;Vale lembrar que a Open Campus tem esse nome por ser aberta para todo o público e não só aos Campuseiros. Se você for de São Paulo e quiser dar uma passada lá é só colar!&lt;/p&gt;

&lt;h2&gt;
  
  
  Cultura da Campus!
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;Um campuseiro sem cultura é um campuseiro sem história (ou sem filas)...&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Você acha que juntando um monte de nerds no mesmo lugar não iriam sair memes, piadas e até alguns “rituais tribalistas”?&lt;br&gt;
É isso mesmo que acontece, e bora ficar por dentro de alguns dos clássicos!&lt;/p&gt;

&lt;p&gt;OOooooOOOoooOOOooo!! (Não, eu não esbarrei no teclado ou deixei meu gato pisar nele).&lt;br&gt;
O “OoooOOoooOOO!” é a forma em texto de representar “O grito de guerra dos campuseiros”, acontece mais ou menos assim:&lt;br&gt;
Alguém, de repente grita “oooOOooooOOoo!” em seguida todo o resto do evento faz o mesmo. Não precisa de um motivo ao certo, apenas acontece, esteja preparado e não esqueça de gritar em alto e bom som!&lt;/p&gt;

&lt;p&gt;Próximo!!&lt;br&gt;
Quase como uma derivação do primeiro o “Próximo” passa a ser o nosso grito de guerra durante as filas (e são muitas). Também não há um motivo, basta alguém virar para você gritando “próximo” assim, vire-se para trás e chame o próximo desencadeando um efeito dominó.&lt;/p&gt;

&lt;p&gt;Corrida das Cadeiras&lt;br&gt;
Quando eu disse “rituais tribalistas” eu não estava exagerando. A Corrida das Cadeiras consiste em basicamente alguém (como sempre sem nenhum motivo) pegar uma cadeira, segura-la em cima da cabeça e sair correndo pelo recinto inteiro desencadeando uma onda de outras pessoas pegando suas cadeiras e correndo.&lt;br&gt;
Obs: Muitas vezes fazendo barulhos neandertais tais como “Uga! Uga!” ou apenas gritando “Vem pra cadeira” para convocar mais pessoas para a corrida.&lt;/p&gt;




&lt;h2&gt;
  
  
  Links Extras
&lt;/h2&gt;

&lt;p&gt;A Campus Party é gigante e definitivamente eu poderia escrever mais páginas e páginas sobre o evento e ainda não conseguir passar todos os detalhes.&lt;/p&gt;

&lt;p&gt;Assim, resolvi deixar outros conteúdos aqui para vocês:&lt;/p&gt;

&lt;p&gt;Guia do campuseiro oficial: &lt;a href="https://brasil.campus-party.org/guia-do-campuseiro/" rel="noopener noreferrer"&gt;https://brasil.campus-party.org/guia-do-campuseiro/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pastebin - Dicas para campus - By: @&lt;a href="https://twitter.com/devMozao" rel="noopener noreferrer"&gt;DevMozao&lt;/a&gt;: &lt;a href="https://pastebin.com/j3WJABh1" rel="noopener noreferrer"&gt;https://pastebin.com/j3WJABh1&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vídeo - Como se Preparar Para a Campus Party - By: @&lt;a href="https://twitter.com/devMozao" rel="noopener noreferrer"&gt;DevMozao:&lt;/a&gt; &lt;a href="https://www.youtube.com/watch?v=PMxfkTp1xw4" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=PMxfkTp1xw4&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Fim!
&lt;/h2&gt;

&lt;p&gt;Muito obrigado por ter lido esse post até o final, caso ele tenha te ajudado considere compartilha-lo com outros futuros (ou de longa data) campuseiros.&lt;/p&gt;

&lt;p&gt;Também não esqueça de me seguir no Twitter @&lt;a href="https://twitter.com/MarlonHenq" rel="noopener noreferrer"&gt;MarlonHenq&lt;/a&gt;, onde avisarei de novos posts.&lt;br&gt;
Caso ainda tenha alguma dúvida sobre a Campus pode me perguntar pelo Twitter também (tanto me marcando, tanto pela DM).&lt;/p&gt;

&lt;p&gt;Flw! Nos vemos na Campus Party 14!&lt;/p&gt;




&lt;p&gt;Este artigo foi originalmente postando em: &lt;a href="https://blog.marlonhenq.dev/posts/2/manual-de-sobrevivencia-na-campus-party-14.php" rel="noopener noreferrer"&gt;blog.marlonhenq.dev&lt;/a&gt; - Dia 24-01-2022&lt;/p&gt;

</description>
      <category>event</category>
      <category>campusparty</category>
      <category>network</category>
      <category>career</category>
    </item>
  </channel>
</rss>
