<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>FPGA - MCU &amp; FPGA</title>
	<atom:link href="https://mcu.tec.br/categorias/fpga/feed/" rel="self" type="application/rss+xml" />
	<link>https://mcu.tec.br</link>
	<description>Microcontroladores &#38; FPGA</description>
	<lastBuildDate>Wed, 21 Jan 2026 17:03:50 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://mcu.tec.br/wp-content/uploads/2025/02/Robo-para-o-site-MCU.tec_.br-512x512-1-150x150.png</url>
	<title>FPGA - MCU &amp; FPGA</title>
	<link>https://mcu.tec.br</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Um Guia Prático para Conectar MCU a FPGA e Expandir Funcionalidades em Sistemas Embarcados</title>
		<link>https://mcu.tec.br/fpga/um-guia-pratico-para-conectar-mcu-a-fpga-e-expandir-funcionalidades-em-sistemas-embarcados/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=um-guia-pratico-para-conectar-mcu-a-fpga-e-expandir-funcionalidades-em-sistemas-embarcados</link>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Wed, 21 Jan 2026 16:52:44 +0000</pubDate>
				<category><![CDATA[FPGA]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=1227</guid>

					<description><![CDATA[<p>Microcontroladores dominam os sistemas embarcados modernos, mas enfrentam limites quando os requisitos de temporização e determinismo se tornam críticos. Este artigo apresenta, de forma técnica e detalhada, quando um MCU deixa de ser suficiente, o que diferencia um FPGA de um microcontrolador, quais são os sinais de alerta em um projeto e como arquiteturas híbridas MCU + FPGA ou SoC FPGA permitem escalar desempenho, reduzir jitter e garantir determinismo temporal. Baseado integralmente em um estudo técnico da InTechHouse, o conteúdo discute critérios de decisão, riscos, custos de desenvolvimento e boas práticas para projetar sistemas de alta frequência com lógica programável.</p>
<p>The post <a href="https://mcu.tec.br/fpga/um-guia-pratico-para-conectar-mcu-a-fpga-e-expandir-funcionalidades-em-sistemas-embarcados/">Um Guia Prático para Conectar MCU a FPGA e Expandir Funcionalidades em Sistemas Embarcados</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></description>
										<content:encoded><![CDATA[<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>Observação metodológica importante</strong><br>O texto abaixo é uma <strong>tradução técnica integral e fiel</strong> do artigo <em>“A Practical Guide to Connecting MCU to FPGA for Enhanced Functionality”</em>, mantendo a estrutura lógica, argumentos, exemplos e conclusões do autor original, sem qualquer adição conceitual.</p>
</blockquote>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h1 class="wp-block-heading">Um Guia Prático para Conectar MCU a FPGA para Funcionalidade Avançada</h1>



<p class="wp-block-paragraph">Microcontroladores têm sido a base dos processadores embarcados por muitos anos. De acordo com a Grand View Research, em 2024, a receita global de MCUs foi estimada em aproximadamente 36,2 bilhões de dólares, com projeções indicando crescimento para mais de 105 bilhões de dólares até 2033, a uma taxa composta de crescimento anual (CAGR) de cerca de 12,8%. De baixo custo, eficientes em termos energéticos e relativamente fáceis de usar, eles possibilitaram uma vasta gama de aplicações.</p>



<p class="wp-block-paragraph">O problema surge quando os requisitos de temporização começam a ultrapassar as capacidades da execução sequencial de código. Nessas situações, uma pergunta natural emerge: este é o momento de recorrer a um FPGA?</p>



<p class="wp-block-paragraph">O texto a seguir mostra onde estão os limites práticos dos MCUs, quando o escalonamento arquitetural se torna uma necessidade e como reconhecer o ponto em que a lógica de software deve ceder lugar à lógica de hardware. Este não é um artigo sobre abandonar MCUs, mas sobre expandir deliberadamente o conjunto de ferramentas quando os requisitos do sistema começam a ditar novas regras do jogo em uma aplicação específica.</p>



<p class="wp-block-paragraph">Segundo o <em>Embedded Market Study</em>, mais de 70% dos projetos embarcados ainda dependem exclusivamente de MCUs, mesmo em aplicações com requisitos de temporização cada vez mais exigentes.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Quando um Microcontrolador Deixa de Ser Suficiente</h2>



<p class="wp-block-paragraph">Um microcontrolador funciona bem enquanto o sistema pode tolerar um certo grau de imprevisibilidade temporal. O problema surge quando a frequência de processamento aumenta e os requisitos de temporização deixam de ser “suaves”. Mesmo MCUs de alto desempenho, como dispositivos Cortex-M7 operando entre 300 e 600 MHz, continuam sendo arquiteturas fundamentalmente sequenciais, nas quais cada operação compete por tempo de CPU com o tratamento de interrupções, acesso a periféricos e sobrecarga do sistema.</p>



<p class="wp-block-paragraph">Como observou Donald Knuth, vencedor do Prêmio Turing da ACM: “o tempo é o recurso mais precioso em um sistema computacional, e gerenciá-lo explicitamente é muitas vezes mais difícil do que gerenciar espaço”.</p>



<p class="wp-block-paragraph">Como resultado, a latência deixa de ser constante e o <em>jitter</em> torna-se uma propriedade inerente da plataforma, e não um defeito de implementação. Nesse estágio, o projeto geralmente ainda “funciona”, mas torna-se cada vez mais difícil raciocinar sobre ele em termos de tempos de resposta garantidos. O código passa a depender de suposições implícitas de temporização que não são formalmente verificáveis. Uma pequena mudança de configuração, uma ordem diferente de interrupções ou uma tarefa adicional em segundo plano consumindo apenas 5–10% do tempo de CPU pode perturbar o comportamento do sistema de maneiras difíceis de prever e ainda mais difíceis de depurar.</p>



<p class="wp-block-paragraph">A reação natural é otimizar ainda mais: desenrolamento manual de loops, abandono de abstrações, empurrar lógica para interrupções. Eventualmente, porém, torna-se claro que a limitação não está no código em si, mas no modelo de execução. Quando o sistema se torna sensível a ciclos individuais de clock, as margens de temporização se estreitam significativamente. Por exemplo, se um dispositivo externo exige um sinal de <em>chip-select</em> com tempos de <em>setup</em> e <em>hold</em> abaixo de 10 ns e <em>jitter</em> inferior a 2 ns, um MCU deixa de ser uma plataforma escalável, independentemente do esforço investido em otimização.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">O Que Realmente Diferencia um FPGA de um MCU</h2>



<p class="wp-block-paragraph">A diferença entre um MCU e um FPGA torna-se evidente no nível do que significa uma operação ser executada “no tempo certo”. Em um microcontrolador, toda função — independentemente de sua importância para o sistema — deve ser agendada dentro de um único fluxo de instruções do chip. Mesmo quando um RTOS é utilizado, a concorrência se reduz à troca de contexto, e o tempo de resposta depende do pior caso de tratamento de interrupções e de seções críticas. O determinismo, portanto, possui um caráter estatístico: ele pode ser estimado, mas não garantido para todos os caminhos de execução.</p>



<p class="wp-block-paragraph">Em um FPGA, o processamento é definido como um conjunto de blocos lógicos paralelos operando simultaneamente e sincronizados por um ou mais clocks. Cada bloco possui uma latência fixa expressa em ciclos de clock, independente da atividade de outros blocos. Não existe mecanismo capaz de “roubar tempo” de outra parte da lógica, pois não há um recurso de execução compartilhado equivalente a um núcleo de CPU.</p>



<p class="wp-block-paragraph">Essa abordagem permite que o tempo seja tratado como uma propriedade da própria estrutura, e não como um subproduto da execução de um programa. Se uma operação possui latência de três ciclos de clock, ela sempre terá exatamente três ciclos, sem exceções ou casos extremos. Nesse sentido, a lógica em FPGA é genuinamente um “algoritmo em silício”. O algoritmo é mapeado em registradores, lógica combinacional e interconexões, e seu comportamento temporal pode ser verificado em tempo de síntese por meio de análise de temporização.</p>



<p class="wp-block-paragraph">Testes comparativos conduzidos pela Intel mostram que, enquanto sistemas baseados em MCU alcançam determinismo em aproximadamente 95–99% dos casos, FPGAs fornecem 100% de determinismo para todos os caminhos compatíveis com a temporização. Essa característica, mais do que a velocidade bruta, é o que confere vantagem aos FPGAs em sistemas de processamento de alta frequência.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Quando um FPGA Não É uma Boa Ideia</h2>



<p class="wp-block-paragraph">Um FPGA não é uma solução universal e, em muitos projetos, seu uso não apenas deixa de trazer benefícios, como pode degradar a qualidade geral do sistema. Se o processamento não é de tempo real rígido (<em>hard real-time</em>) e os requisitos de latência e <em>jitter</em> se mantêm dentro dos limites previsíveis de um MCU ou DSP, a migração para FPGA geralmente não se justifica tecnicamente. Isso é particularmente verdadeiro para algoritmos orientados a controle e decisão, bem como para projetos dominados por lógica condicional complexa.</p>



<p class="wp-block-paragraph">Também é importante fazer uma pergunta simples, porém crítica: estamos resolvendo um problema real de temporização ou compensando uma decisão arquitetural que nunca foi a escolha correta? Em muitos cenários, um DSP especializado ou um MCU moderno com aceleradores de hardware é a escolha mais simples e apropriada.</p>



<p class="wp-block-paragraph">David Patterson, um dos fundadores da arquitetura moderna de computadores como disciplina acadêmica, adverte que “complexidade arquitetural só deve ser introduzida quando elimina diretamente um gargalo fundamental”.</p>



<p class="wp-block-paragraph">Outro fator importante é o custo cognitivo e técnico do desenvolvimento em FPGA. Projetar lógica de hardware exige um conjunto de habilidades diferente, ciclos de desenvolvimento mais longos e verificação rigorosa de temporização. Erros são mais difíceis de detectar e frequentemente só emergem durante a integração em hardware. Análises do IEEE indicam que projetos com FPGA alcançam seu primeiro protótipo funcional, em média, de duas a três vezes mais tarde do que projetos baseados em MCU, e que aproximadamente 40% dos erros lógicos são descobertos apenas na fase de integração de hardware.</p>



<p class="wp-block-paragraph">O uso excessivo de FPGA também pode levar a uma complexidade arquitetural desnecessária. O sistema torna-se mais difícil de manter, menos adaptável a requisitos em mudança e mais propenso a problemas de integração. Se paralelismo real e determinismo rígido não forem críticos, uma plataforma mais simples geralmente resultará em uma solução final mais robusta e eficiente.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Sinais de Alerta: O Ponto de Transição em um Projeto</h2>



<p class="wp-block-paragraph">Os primeiros sinais claros surgem quando a arquitetura do sistema passa a ser moldada por problemas de temporização, e não pela lógica funcional. Interrupções adicionais são introduzidas, prioridades são ajustadas, atrasos manuais são inseridos e surgem trechos de código cuja única função é “manter o tempo correto”. O sistema ainda funciona, mas passa a depender de suposições frágeis.</p>



<p class="wp-block-paragraph">Outro sinal ocorre quando requisitos de tempo real rígido deixam de poder ser garantidos de forma confiável. A análise de pior caso de execução torna-se cada vez mais teórica, e um único atraso pode quebrar garantias de temporização.</p>



<p class="wp-block-paragraph">O sintoma mais custoso aparece quando a depuração se transforma em uma corrida contra o tempo. Erros desaparecem quando um depurador é conectado, mudam com diferentes níveis de otimização do compilador ou ocorrem apenas em condições reais de implantação.</p>



<p class="wp-block-paragraph">Há também o momento em que o comportamento correto passa a depender de detalhes que não deveriam ser arquiteturalmente relevantes, como versões de compilador, pequenas mudanças em módulos não relacionados ou atualizações de bibliotecas.</p>



<p class="wp-block-paragraph">O sinal final é a incapacidade de escalar sem uma mudança arquitetural. Cada novo requisito funcional se transforma automaticamente em um problema de temporização, e o projeto deixa de ser escalável.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Arquiteturas Híbridas: MCU + FPGA</h2>



<p class="wp-block-paragraph">Uma arquitetura híbrida combinando microcontrolador e FPGA permite explorar os pontos fortes de ambas as abordagens sem exigir um redesenho radical de todo o sistema. Não é coincidência que o mercado esteja cada vez mais adotando arquiteturas híbridas. Segundo a Omdia, mais de 60% dos novos sistemas embarcados de alto desempenho utilizam hoje uma combinação de MCU e FPGA.</p>



<p class="wp-block-paragraph">O princípio fundamental é a separação clara de responsabilidades. O microcontrolador atua como camada de controle, configuração e comunicação, enquanto o FPGA lida com processamento crítico em tempo, fluxo contínuo de dados ou operações de alta frequência. O MCU gerencia estados do sistema, protocolos, lógica de decisão e interface com o usuário, enquanto o FPGA assume tarefas em que o determinismo ciclo-a-ciclo é essencial.</p>



<p class="wp-block-paragraph">Na prática, vários padrões arquiteturais bem estabelecidos são utilizados, como o modelo <em>control-plane / data-plane</em>, a descarga parcial de algoritmos para lógica em FPGA e o uso de buffers no FPGA consumidos periodicamente pelo MCU. Um aspecto crítico é a comunicação e sincronização entre domínios de tempo diferentes, normalmente realizada por FIFOs, <em>double buffering</em>, sinais de <em>handshake</em> e limites temporais bem definidos.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">SoC FPGA: A Ponte entre MCU e FPGA Clássico</h2>



<p class="wp-block-paragraph">Um passo natural após exceder os limites de um microcontrolador, mas antes de migrar totalmente para um FPGA puro, é o SoC FPGA. Essa arquitetura combina um processador, geralmente ARM, com lógica programável em um único dispositivo, conectados por barramentos e memória compartilhados.</p>



<p class="wp-block-paragraph">Ela faz sentido quando um MCU não consegue mais atender aos requisitos de temporização, mas uma implementação totalmente em HDL seria arriscada ou complexa demais. Casos típicos incluem aquisição de dados de alta taxa, processamento digital de sinais, protocolos com temporização estrita e aceleradores de hardware personalizados.</p>



<p class="wp-block-paragraph">Segundo publicações da <em>Embedded World Conference</em>, um SoC FPGA pode proporcionar um aumento de 5 a 20 vezes na capacidade de processamento sem exigir um redesenho completo da camada de aplicação.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Projetando Lógica para Operação em Alta Frequência</h2>



<p class="wp-block-paragraph">Projetar lógica em FPGA para alta frequência exige abandonar intuições derivadas da programação sequencial e adotar uma perspectiva orientada a hardware. <em>Pipelining</em> e paralelismo desempenham papel central, permitindo maior vazão sem encurtar caminhos críticos individuais.</p>



<p class="wp-block-paragraph">O tempo, em um FPGA, não é uma abstração, mas uma propriedade concreta do projeto. Cada registrador adicional, cada decisão sobre largura de barramento e cada ordenação de operações afeta diretamente a latência e a capacidade de atender às restrições de temporização.</p>



<p class="wp-block-paragraph">Equipes com mentalidade “software-first” frequentemente cometem erros previsíveis, como portar algoritmos diretamente, abusar de lógica condicional ou tratar o FPGA como um processador mais rápido. Somente ao aceitar que se está projetando uma estrutura de hardware, e não um programa, é possível explorar todo o potencial dos FPGAs.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Escalonamento Arquitetural Consciente</h2>



<p class="wp-block-paragraph">O escalonamento arquitetural consciente é um sinal de maturidade em engenharia. Migrar de um MCU para um FPGA não é um fracasso da arquitetura existente, nem um indicativo de superengenharia. É uma consequência natural do crescimento de requisitos.</p>



<p class="wp-block-paragraph">Um FPGA não substitui o MCU; ele muda a forma como pensamos sobre tempo e paralelismo. Para alguns projetos, otimizar melhor o software será suficiente. Para outros, a decisão correta será adotar uma arquitetura híbrida ou migrar caminhos críticos para lógica personalizada.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p class="wp-block-paragraph"><strong>Fonte original:</strong><br><a href="https://intechhouse.com/blog/a-practical-guide-to-connecting-mcu-to-fpga-for-enhanced-functionality/" title=""><em>A Practical Guide to Connecting MCU to FPGA for Enhanced Functionality</em> – InTechHouse, 2026.</a></p><p>The post <a href="https://mcu.tec.br/fpga/um-guia-pratico-para-conectar-mcu-a-fpga-e-expandir-funcionalidades-em-sistemas-embarcados/">Um Guia Prático para Conectar MCU a FPGA e Expandir Funcionalidades em Sistemas Embarcados</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1227</post-id>	</item>
		<item>
		<title>Como Implementar Checksum e CRC em Verilog para FPGAs com Eficiência e Confiabilidade</title>
		<link>https://mcu.tec.br/fpga/como-implementar-checksum-e-crc-em-verilog-para-fpgas-com-eficiencia-e-confiabilidade/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=como-implementar-checksum-e-crc-em-verilog-para-fpgas-com-eficiencia-e-confiabilidade</link>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Fri, 04 Apr 2025 20:09:11 +0000</pubDate>
				<category><![CDATA[FPGA]]></category>
		<category><![CDATA[Checksum FPGA]]></category>
		<category><![CDATA[código de erro Verilog]]></category>
		<category><![CDATA[comunicação confiável FPGA]]></category>
		<category><![CDATA[CRC FPGA]]></category>
		<category><![CDATA[CRC SPI]]></category>
		<category><![CDATA[CRC UART]]></category>
		<category><![CDATA[CRC-16 Verilog]]></category>
		<category><![CDATA[CRC-8 Verilog]]></category>
		<category><![CDATA[FSM com verificação]]></category>
		<category><![CDATA[implementação de CRC em hardware]]></category>
		<category><![CDATA[LFSR Verilog]]></category>
		<category><![CDATA[simulação Verilog GTKWave]]></category>
		<category><![CDATA[verificação de integridade FPGA]]></category>
		<category><![CDATA[Verilog Checksum]]></category>
		<category><![CDATA[Verilog CRC]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=311</guid>

					<description><![CDATA[<p>Aprenda a implementar Checksum e CRC em Verilog para projetos com FPGAs. Descubra como projetar circuitos de verificação de integridade, integrar com UART e SPI, simular com ModelSim e otimizar para desempenho e área lógica.</p>
<p>The post <a href="https://mcu.tec.br/fpga/como-implementar-checksum-e-crc-em-verilog-para-fpgas-com-eficiencia-e-confiabilidade/">Como Implementar Checksum e CRC em Verilog para FPGAs com Eficiência e Confiabilidade</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">Em projetos com <strong>FPGAs (Field Programmable Gate Arrays)</strong>, a verificação da integridade de dados é tão essencial quanto em sistemas baseados em microcontroladores. Isso é especialmente verdadeiro quando os dados trafegam por <strong>interfaces seriais</strong>, <strong>barramentos internos</strong>, ou entre <strong>blocos lógicos sincronizados por clock</strong>. A possibilidade de erros de sincronismo, glitches ou ruídos pode corromper bits e comprometer o funcionamento do sistema — e detectar esses erros de forma eficiente é parte crucial do design digital.</p>



<p class="wp-block-paragraph">Diferentemente dos sistemas baseados em software, os FPGAs trabalham com lógica <strong>combinacional e sequencial</strong> implementada diretamente no hardware. Isso permite uma abordagem altamente paralela e de baixa latência para o cálculo de verificações como <strong>checksums</strong> e <strong>CRCs (Cyclic Redundancy Check)</strong>. Entretanto, essa abordagem exige que o engenheiro de hardware compreenda como traduzir operações matemáticas binárias em estruturas digitais, como <strong>LFSRs (Registradores de Deslocamento com Realimentação)</strong>, <strong>somadores</strong>, <strong>muxes</strong>, e <strong>máquinas de estado</strong>.</p>



<p class="wp-block-paragraph">Neste tutorial, vamos abordar duas técnicas clássicas de verificação de integridade em hardware:</p>



<ul class="wp-block-list">
<li>O <strong>checksum</strong>, simples de implementar, ideal para sistemas de baixa complexidade ou onde o erro mais comum é a perda de bits.</li>



<li>O <strong>CRC</strong>, robusto, capaz de detectar múltiplos erros de bits e alterações sistemáticas, usado em protocolos como <strong>Ethernet, SPI, USB, CAN e PCIe</strong>.</li>
</ul>



<p class="wp-block-paragraph">Ambas as técnicas serão implementadas em <strong>Verilog</strong>, com foco em projetos para FPGA. A implementação incluirá exemplos práticos, módulos parametrizáveis, simulações com testbenches, e dicas para integração com interfaces seriais como <strong>UART e SPI</strong>. Também discutiremos estratégias de otimização em hardware e como garantir que o sistema reaja corretamente à detecção de erros.</p>



<p class="wp-block-paragraph">Este guia é voltado tanto para iniciantes quanto para desenvolvedores experientes que desejam <strong>refinar seus módulos de transmissão e recepção de dados</strong>, garantindo robustez e confiabilidade em projetos FPGA profissionais.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4d8.png" alt="📘" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Capítulo 2 – Conceitos Fundamentais</h2>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Bits, Registradores e Sinais em Verilog</h3>



<p class="wp-block-paragraph">Em Verilog, os dados são representados por <strong>vetores de bits</strong>, que podem ser armazenados em registradores (<code>reg</code>) ou manipulados como fios (<code>wire</code>). Esses dados trafegam entre módulos e são processados de forma síncrona (com clock) ou assíncrona (combinacional).</p>



<p class="wp-block-paragraph">Por exemplo, um vetor de 8 bits que representa um byte pode ser declarado assim:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="reg [7:0] dado;  // um byte armazenado em registrador
wire [15:0] resultado; // 2 bytes como fio combinacional
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">reg</span><span style="color: #D8DEE9FF"> [7:0] dado</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">//</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">um</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">byte</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">armazenado</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">em</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">registrador</span></span>
<span class="line"><span style="color: #88C0D0">wire</span><span style="color: #D8DEE9FF"> [15:0] resultado</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">//</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">2</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">bytes</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">como</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">fio</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">combinacional</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Em um sistema de comunicação serial, a verificação de integridade ocorre normalmente <strong>após o recebimento completo de um pacote de dados</strong>, seja por meio de shift registers, buffers ou blocos de controle (FSMs).</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Redundância e Detecção de Erros</h3>



<p class="wp-block-paragraph">A <strong>redundância controlada</strong> é a chave para validar a integridade dos dados transmitidos. A ideia é gerar um valor de verificação (checksum ou CRC) que <strong>sintetize</strong> o conteúdo do pacote. Esse valor é transmitido junto aos dados, e no receptor é <strong>recalculado e comparado</strong> com o valor recebido.</p>



<p class="wp-block-paragraph">Essa lógica se traduz em hardware por:</p>



<ul class="wp-block-list">
<li>Somadores para checksum</li>



<li>LFSRs (Linear Feedback Shift Registers) para CRC</li>



<li>Comparadores de igualdade para validação</li>
</ul>



<p class="wp-block-paragraph">Tudo isso precisa ser projetado considerando <strong>timing</strong>, <strong>largura de dados</strong>, <strong>clock domain crossing</strong> e <strong>latência</strong>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Checksum e CRC como Operadores Lógicos</h3>



<p class="wp-block-paragraph">Em software, o cálculo de checksum ou CRC é sequencial, byte por byte. Em hardware, podemos projetar blocos que executam essas operações <strong>em paralelo</strong>, reduzindo drasticamente a latência de verificação.</p>



<p class="wp-block-paragraph">Por exemplo:</p>



<ul class="wp-block-list">
<li>Um checksum pode ser a soma direta de todos os bytes armazenados em um <strong>array de registradores</strong>.</li>



<li>Um CRC pode ser gerado a cada novo bit recebido, com o registrador CRC sendo atualizado <strong>bit a bit</strong> ou <strong>byte a byte</strong>, dependendo do projeto.</li>
</ul>



<p class="wp-block-paragraph">Além disso, o Verilog permite o uso de <strong>operações bitwise (<code>^</code>, <code>&amp;</code>, <code>|</code>)</strong> e <strong>deslocamentos (<code>&lt;&lt;</code>, <code>&gt;&gt;</code>)</strong>, que casam perfeitamente com a lógica de CRC.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Reflexão e Ordem de Bits</h3>



<p class="wp-block-paragraph">Alguns protocolos exigem que os bits sejam <strong>refletidos</strong> (bit reversal) antes de entrar no cálculo do CRC. Esse processo pode ser implementado com lógica combinacional simples ou com um laço de deslocamento:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="function [7:0] refletir;
  input [7:0] dado;
  integer i;
  begin
    for (i = 0; i < 8; i = i + 1)
      refletir[i] = dado[7 - i];
  end
endfunction
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">function</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">[7:0]</span><span style="color: #D8DEE9FF"> refletir;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  input [7:0] dado;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  integer i;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  begin</span></span>
<span class="line"><span style="color: #D8DEE9FF">    for </span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">i</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">i</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">8</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">i</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">i</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">+</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">refletir[i]</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">dado[</span><span style="color: #B48EAD">7</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">i]</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">end</span></span>
<span class="line"><span style="color: #88C0D0">endfunction</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Reflexão de bits, ordem dos bytes (little vs. big endian), e valores iniciais do CRC devem ser <strong>claramente definidos</strong> em projetos digitais, pois pequenas diferenças levam a grandes incompatibilidades na verificação.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4d8.png" alt="📘" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Capítulo 3 – Checksum em Verilog</h2>



<p class="wp-block-paragraph">O <strong>checksum</strong> é um método direto para verificar a integridade de dados. Ele consiste em somar todos os bytes transmitidos e, opcionalmente, aplicar uma operação complementar (como o complemento de 1 ou 2). Em hardware, essa operação é simples de implementar com <strong>somadores e registradores acumuladores</strong>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Estrutura do Módulo Checksum</h3>



<p class="wp-block-paragraph">Nosso exemplo usará:</p>



<ul class="wp-block-list">
<li>Entrada paralela de dados de 8 bits (<code>data_in</code>)</li>



<li>Sinal de habilitação (<code>enable</code>)</li>



<li>Reset síncrono (<code>rst</code>)</li>



<li>Um sinal de validação (<code>done</code>) indicando o fim do pacote</li>



<li>Saída do checksum (<code>checksum_out</code>)</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f9ea.png" alt="🧪" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Exemplo: Checksum acumulativo de 8 bits</h3>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="module checksum8 (
    input clk,
    input rst,
    input enable,
    input done,
    input [7:0] data_in,
    output reg [7:0] checksum_out
);
    reg [7:0] soma;

    always @(posedge clk) begin
        if (rst) begin
            soma <= 8'b0;
            checksum_out <= 8'b0;
        end else if (enable) begin
            soma <= soma + data_in;
        end else if (done) begin
            checksum_out <= soma; // ou ~soma para complemento de 1
        end
    end
endmodule
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">module</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">checksum8</span><span style="color: #D8DEE9FF"> (</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">input</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">clk,</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">input</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">rst,</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">input</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">enable,</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">input</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">done,</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">input</span><span style="color: #D8DEE9FF"> [7:0] data_in,</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">output</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">reg</span><span style="color: #D8DEE9FF"> [7:0] checksum_out</span></span>
<span class="line"><span style="color: #D8DEE9FF">);</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">reg</span><span style="color: #D8DEE9FF"> [7:0] soma</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">always</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">@</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">posedge</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">clk</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">begin</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">rst</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> begin</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #88C0D0">soma</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">8</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">b0;</span></span>
<span class="line"><span style="color: #A3BE8C">            checksum_out &lt;= 8</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">b0</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">end</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">else</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">enable</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> begin</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #88C0D0">soma</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">soma</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">+</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">data_in</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">end</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">else</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">done</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> begin</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #88C0D0">checksum_out</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">soma</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">//</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">ou</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">~soma</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">para</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">complemento</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">de</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">end</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">end</span></span>
<span class="line"><span style="color: #88C0D0">endmodule</span></span>
<span class="line"></span></code></pre></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f9ea.png" alt="🧪" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Testbench para Simulação</h3>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="module tb_checksum8;
    reg clk = 0, rst = 0, enable = 0, done = 0;
    reg [7:0] data_in;
    wire [7:0] checksum_out;

    checksum8 uut (.clk(clk), .rst(rst), .enable(enable), .done(done), .data_in(data_in), .checksum_out(checksum_out));

    always #5 clk = ~clk; // Clock de 10ns

    initial begin
        rst = 1; #10;
        rst = 0;

        // Enviar sequência de dados: 0x12, 0x34, 0x56
        data_in = 8'h12; enable = 1; #10;
        data_in = 8'h34; #10;
        data_in = 8'h56; #10;
        enable = 0; done = 1; #10;
        done = 0;

        // Esperado: 0x12 + 0x34 + 0x56 = 0x9C
        $display(&quot;Checksum calculado: %h&quot;, checksum_out);

        $stop;
    end
endmodule
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">module</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">tb_checksum8</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">reg</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">clk</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #A3BE8C">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">rst</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #A3BE8C">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">enable</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #A3BE8C">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">done</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">reg</span><span style="color: #D8DEE9FF"> [7:0] data_in</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">wire</span><span style="color: #D8DEE9FF"> [7:0] checksum_out</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">checksum8</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">uut</span><span style="color: #D8DEE9FF"> (.clk(clk), .rst</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">rst</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF">, .enable</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">enable</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF">, .done</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">done</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF">, .data_in</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">data_in</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF">, .checksum_out</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">checksum_out</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">always</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88">#5 clk = ~clk; // Clock de 10ns</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">initial</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">begin</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">rst</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88">#10;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">rst</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">//</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">Enviar</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">sequência</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">de</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">dados:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0x12</span><span style="color: #A3BE8C">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0x34</span><span style="color: #A3BE8C">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0x56</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">data_in</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">8</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">h12; enable = 1; #10;</span></span>
<span class="line"><span style="color: #A3BE8C">        data_in = 8</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">h34</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88">#10;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">data_in</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">8</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">h56; #10;</span></span>
<span class="line"><span style="color: #A3BE8C">        enable = 0; done = 1; #10;</span></span>
<span class="line"><span style="color: #A3BE8C">        done = 0;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #A3BE8C">        // Esperado: 0x12 + 0x34 + 0x56 = 0x9C</span></span>
<span class="line"><span style="color: #A3BE8C">        $display(&quot;Checksum calculado: %h&quot;, checksum_out);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #A3BE8C">        $stop;</span></span>
<span class="line"><span style="color: #A3BE8C">    end</span></span>
<span class="line"><span style="color: #A3BE8C">endmodule</span></span>
<span class="line"></span></code></pre></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Considerações</h3>



<ul class="wp-block-list">
<li>Esse módulo é sequencial: a soma ocorre a cada <code>enable</code> positivo.</li>



<li>É simples de estender para 16 bits (<code>reg [15:0] soma</code>) ou usar complemento de 1 com <code>~soma</code>.</li>



<li>Pode ser integrado diretamente em uma <strong>máquina de estados (FSM)</strong> responsável por controlar a recepção dos dados.</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4d8.png" alt="📘" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Capítulo 4 – Fundamentos de CRC em Hardware</h2>



<p class="wp-block-paragraph">Enquanto o checksum soma os dados para gerar um valor de verificação, o <strong>CRC (Cyclic Redundancy Check)</strong> realiza uma divisão polinomial binária no campo GF(2). Em hardware, isso é modelado como um <strong>registrador de deslocamento com realimentação</strong>, conhecido como <strong>LFSR (Linear Feedback Shift Register)</strong>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Representação Polinomial</h3>



<p class="wp-block-paragraph">Cada valor de dado é interpretado como um polinômio, onde cada bit representa um coeficiente. Por exemplo:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="Byte: 11010010 (0xD2) → x⁷ + x⁶ + x⁴ + x¹
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">Byte:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">11010010</span><span style="color: #D8DEE9FF"> (0xD2) → x⁷ + x⁶ + x⁴ + x¹</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">O cálculo do CRC equivale a <strong>dividir o polinômio formado pelos dados</strong> por um <strong>polinômio gerador</strong> padrão, como:</p>



<ul class="wp-block-list">
<li><strong>CRC-4-ITU</strong>: x⁴ + x + 1 → <code>0b10011</code></li>



<li><strong>CRC-8</strong>: x⁸ + x² + x + 1 → <code>0x07</code></li>



<li><strong>CRC-16-IBM</strong>: x¹⁶ + x¹⁵ + x² + 1 → <code>0x8005</code></li>



<li><strong>CRC-32 (IEEE 802.3)</strong>: x³² + x²⁶ + x²³ + &#8230; + x + 1 → <code>0x04C11DB7</code></li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> LFSR: Implementação em Hardware</h3>



<p class="wp-block-paragraph">O <strong>LFSR</strong> realiza essa divisão bit a bit. Ele contém:</p>



<ul class="wp-block-list">
<li>Um <strong>registrador de estado</strong> com o tamanho do CRC (8, 16 ou 32 bits)</li>



<li>Um conjunto de <strong>XORs</strong> conectados nas posições definidas pelo polinômio gerador</li>



<li>Entrada de dados serial ou paralela</li>
</ul>



<h4 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f9f1.png" alt="🧱" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Estrutura básica de um LFSR com entrada serial:</h4>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="Entrada --&gt; XOR --&gt; [bit7] --&gt; [bit6] --&gt; ... --&gt; [bit0] --&gt; Saída CRC
                 &#x2198;__________/           (feedback baseado no polinômio)
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">Entrada</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">--</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">XOR</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">--</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> [bit7] --</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">[</span><span style="color: #D8DEE9FF">bit6</span><span style="color: #ECEFF4">]</span><span style="color: #D8DEE9FF"> --</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> ... --</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">[</span><span style="color: #D8DEE9FF">bit0</span><span style="color: #ECEFF4">]</span><span style="color: #D8DEE9FF"> --</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> Saída CRC</span></span>
<span class="line"><span style="color: #D8DEE9FF">                 </span><span style="color: #88C0D0">&#x2198;__________/</span><span style="color: #D8DEE9FF">           (feedback </span><span style="color: #A3BE8C">baseado</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">no</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">polinômio</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Cada bit de entrada afeta o estado do registrador, com base nas conexões de realimentação definidas pelo polinômio.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Reflexão e XOR Final</h3>



<p class="wp-block-paragraph">Na prática, muitas implementações de CRC utilizam:</p>



<ul class="wp-block-list">
<li><strong>Reflexão dos bits de entrada</strong> (bit reversal)</li>



<li><strong>Reflexão dos bits do resultado (output)</strong></li>



<li><strong>XOR com um valor final constante</strong></li>
</ul>



<p class="wp-block-paragraph">Esses ajustes são usados para compatibilidade com protocolos de comunicação e devem ser documentados com clareza.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Exemplo: CRC-8 com polinômio 0x07</h3>



<p class="wp-block-paragraph">Esse polinômio é muito usado em sensores e protocolos simples:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="Polinômio: x⁸ + x² + x + 1 → 0x07 → taps em bits 8, 2 e 1
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">Polinômio:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">x⁸</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">+</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">x²</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">+</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">x</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">+</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">→</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0x07</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">→</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">taps</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">em</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">bits</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">8</span><span style="color: #A3BE8C">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">2</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">e</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Representado como LFSR:</p>



<ul class="wp-block-list">
<li>Feedback do bit mais significativo (MSB) é aplicado nos bits 2 e 1 através de XOR</li>



<li>A entrada serial é XORada com o MSB antes de entrar no LFSR</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Interpretação Visual</h3>



<p class="wp-block-paragraph">Para CRC-8, temos 8 flip-flops (<code>reg [7:0] crc_reg</code>) e uma lógica de feedback do bit mais à esquerda (bit 7), aplicado sobre bits específicos. Cada novo bit de entrada <strong>avança</strong> o registrador e modifica seu valor.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4d8.png" alt="📘" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Capítulo 5 – Implementando CRC em Verilog</h2>



<p class="wp-block-paragraph">A implementação de CRC em Verilog é baseada em <strong>circuitos sequenciais</strong> com realimentação condicional via XOR. Essa estrutura pode ser ajustada para entrada <strong>serial</strong> (um bit por ciclo) ou <strong>paralela</strong> (um byte por ciclo), dependendo da complexidade e da taxa de dados exigida.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> CRC Serial com LFSR – CRC-8 (Polinômio 0x07)</h3>



<p class="wp-block-paragraph">Essa versão processa <strong>1 bit por ciclo de clock</strong>. Ideal para interfaces como UART ou SPI com buffer serial.</p>



<h4 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f9ea.png" alt="🧪" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Módulo CRC-8 serial:</h4>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="module crc8_serial (
    input clk,
    input rst,
    input enable,
    input bit_in,
    output reg [7:0] crc_out
);
    wire feedback;

    assign feedback = crc_out[7] ^ bit_in;

    always @(posedge clk) begin
        if (rst)
            crc_out <= 8'h00; // valor inicial do CRC
        else if (enable) begin
            crc_out[7] <= crc_out[6];
            crc_out[6] <= crc_out[5];
            crc_out[5] <= crc_out[4];
            crc_out[4] <= crc_out[3] ^ feedback;
            crc_out[3] <= crc_out[2];
            crc_out[2] <= crc_out[1] ^ feedback;
            crc_out[1] <= crc_out[0] ^ feedback;
            crc_out[0] <= feedback;
        end
    end
endmodule
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">module</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">crc8_serial</span><span style="color: #D8DEE9FF"> (</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">input</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">clk,</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">input</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">rst,</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">input</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">enable,</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">input</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">bit_in,</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">output</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">reg</span><span style="color: #D8DEE9FF"> [7:0] crc_out</span></span>
<span class="line"><span style="color: #D8DEE9FF">);</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">wire</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">feedback</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">assign</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">feedback</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">crc_out[</span><span style="color: #B48EAD">7</span><span style="color: #A3BE8C">]</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">^</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">bit_in</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">always</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">@</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">posedge</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">clk</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">begin</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">rst</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #88C0D0">crc_out</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">8</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">h00; // valor inicial do CRC</span></span>
<span class="line"><span style="color: #A3BE8C">        else if (enable) begin</span></span>
<span class="line"><span style="color: #A3BE8C">            crc_out[7] &lt;= crc_out[6];</span></span>
<span class="line"><span style="color: #A3BE8C">            crc_out[6] &lt;= crc_out[5];</span></span>
<span class="line"><span style="color: #A3BE8C">            crc_out[5] &lt;= crc_out[4];</span></span>
<span class="line"><span style="color: #A3BE8C">            crc_out[4] &lt;= crc_out[3] ^ feedback;</span></span>
<span class="line"><span style="color: #A3BE8C">            crc_out[3] &lt;= crc_out[2];</span></span>
<span class="line"><span style="color: #A3BE8C">            crc_out[2] &lt;= crc_out[1] ^ feedback;</span></span>
<span class="line"><span style="color: #A3BE8C">            crc_out[1] &lt;= crc_out[0] ^ feedback;</span></span>
<span class="line"><span style="color: #A3BE8C">            crc_out[0] &lt;= feedback;</span></span>
<span class="line"><span style="color: #A3BE8C">        end</span></span>
<span class="line"><span style="color: #A3BE8C">    end</span></span>
<span class="line"><span style="color: #A3BE8C">endmodule</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Essa estrutura reproduz exatamente o efeito do polinômio <code>x⁸ + x² + x + 1</code> (0x07).</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> CRC Paralelo – Processando um Byte por Ciclo</h3>



<p class="wp-block-paragraph">Em aplicações que exigem mais velocidade, é comum processar dados <strong>8 bits por vez</strong> usando uma lógica combinacional que aplica o efeito completo do polinômio sobre um byte inteiro.</p>



<h4 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f9ea.png" alt="🧪" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Módulo CRC-8 paralelo (combinacional):</h4>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="module crc8_parallel (
    input clk,
    input rst,
    input enable,
    input [7:0] data_in,
    output reg [7:0] crc_out
);

    function [7:0] next_crc;
        input [7:0] data;
        input [7:0] crc;
        integer i;
        reg [7:0] temp;
        begin
            temp = crc ^ data;
            for (i = 0; i < 8; i = i + 1) begin
                if (temp[7])
                    temp = (temp << 1) ^ 8'h07;
                else
                    temp = (temp << 1);
            end
            next_crc = temp;
        end
    endfunction

    always @(posedge clk) begin
        if (rst)
            crc_out <= 8'h00;
        else if (enable)
            crc_out <= next_crc(data_in, crc_out);
    end
endmodule
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">module</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">crc8_parallel</span><span style="color: #D8DEE9FF"> (</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">input</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">clk,</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">input</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">rst,</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">input</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">enable,</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">input</span><span style="color: #D8DEE9FF"> [7:0] data_in,</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">output</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">reg</span><span style="color: #D8DEE9FF"> [7:0] crc_out</span></span>
<span class="line"><span style="color: #D8DEE9FF">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">function</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">[7:0]</span><span style="color: #D8DEE9FF"> next_crc;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        input [7:0] data;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        input [7:0] crc;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        integer i;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        reg [7:0] temp;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        begin</span></span>
<span class="line"><span style="color: #D8DEE9FF">            temp = crc ^ data;</span></span>
<span class="line"><span style="color: #D8DEE9FF">            for </span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">i</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">i</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">8</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">i</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">i</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">+</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">begin</span></span>
<span class="line"><span style="color: #D8DEE9FF">                </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">temp[7]</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">                    </span><span style="color: #88C0D0">temp</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> (temp &lt;&lt; </span><span style="color: #B48EAD">1</span><span style="color: #D8DEE9FF">) ^ 8</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">h07;</span></span>
<span class="line"><span style="color: #A3BE8C">                else</span></span>
<span class="line"><span style="color: #A3BE8C">                    temp = (temp &lt;&lt; 1);</span></span>
<span class="line"><span style="color: #A3BE8C">            end</span></span>
<span class="line"><span style="color: #A3BE8C">            next_crc = temp;</span></span>
<span class="line"><span style="color: #A3BE8C">        end</span></span>
<span class="line"><span style="color: #A3BE8C">    endfunction</span></span>
<span class="line"></span>
<span class="line"><span style="color: #A3BE8C">    always @(posedge clk) begin</span></span>
<span class="line"><span style="color: #A3BE8C">        if (rst)</span></span>
<span class="line"><span style="color: #A3BE8C">            crc_out &lt;= 8</span><span style="color: #ECEFF4">&#39;</span><span style="color: #D8DEE9FF">h00</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">else</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">enable</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #88C0D0">crc_out</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">next_crc</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">data_in,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">crc_out</span><span style="color: #ECEFF4">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">end</span></span>
<span class="line"><span style="color: #88C0D0">endmodule</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4a1.png" alt="💡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Essa versão simula uma <strong>lookup table</strong> embutida, executando o efeito cumulativo de 8 entradas em uma única operação.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Considerações para CRC-16 e CRC-32</h3>



<ul class="wp-block-list">
<li>A estrutura é análoga: o registrador tem 16 ou 32 bits e os taps (feedbacks) são ajustados conforme o polinômio.</li>



<li>CRC-16 (0x8005) e CRC-32 (0x04C11DB7) são amplamente usados em redes e armazenamento.</li>



<li>Em CRCs maiores, é comum gerar os módulos automaticamente a partir de scripts Python ou ferramentas como <a href="https://github.com/michaelengel/crcgen">crcgen</a>.</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Verificação com Vetores de Teste</h3>



<p class="wp-block-paragraph">Recomenda-se sempre testar sua implementação com <strong>vetores conhecidos</strong>. Você pode usar sites como:</p>



<ul class="wp-block-list">
<li><a href="https://crccalc.com/">https://crccalc.com/</a></li>



<li>Ferramentas de referência como RevEng ou pycrc</li>
</ul>



<p class="wp-block-paragraph">Simule a entrada do valor byte a byte e verifique se o valor do <code>crc_out</code> final corresponde.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4d8.png" alt="📘" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Capítulo 6 – Otimizações para FPGA</h2>



<p class="wp-block-paragraph">A implementação de checksum ou CRC em FPGAs pode ser ajustada para obter <strong>melhor desempenho, menor uso de área lógica</strong>, ou <strong>menor consumo de energia</strong>, dependendo da aplicação. Otimizar bem significa balancear esses fatores para obter o melhor custo-benefício no projeto final.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Pipeline e Paralelismo</h3>



<p class="wp-block-paragraph">FPGAs permitem inserir <strong>pipeline registers</strong> entre as etapas de processamento, o que aumenta a frequência máxima da lógica. Para CRC, isso pode ser aplicado entre cada estágio do LFSR, ou entre operações de XOR em módulos paralelos.</p>



<h4 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f9f1.png" alt="🧱" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Exemplo:</h4>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="always @(posedge clk) begin
    feedback_stage <= crc_out[7] ^ bit_in;
    stage1 <= crc_out[6];
    stage2 <= crc_out[5];
    ...
end
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">always</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">@</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">posedge</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">clk</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">begin</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">feedback_stage</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">crc_out[</span><span style="color: #B48EAD">7</span><span style="color: #A3BE8C">]</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">^</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">bit_in</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">stage1</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">crc_out[</span><span style="color: #B48EAD">6</span><span style="color: #A3BE8C">]</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">stage2</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">crc_out[</span><span style="color: #B48EAD">5</span><span style="color: #A3BE8C">]</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">...</span></span>
<span class="line"><span style="color: #81A1C1">end</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">O uso de <strong>pipeline</strong> reduz o tempo crítico de propagação entre sinais, permitindo que o circuito opere em frequências mais altas, o que é essencial em links seriais de alta velocidade como SPI rápido ou Ethernet softcore.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> CRC Paralelo com LUTs (ROM)</h3>



<p class="wp-block-paragraph">Para acelerar ainda mais o processamento, você pode substituir a lógica de XOR por <strong>lookup tables (LUTs)</strong>, geradas previamente em ROM ou combinacionalmente.</p>



<h4 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f9ea.png" alt="🧪" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Exemplo: ROM com valores CRC-8 para cada byte possível</h4>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="reg [7:0] crc_table [0:255];

initial begin
    $readmemh(&quot;crc8_table.mem&quot;, crc_table);
end

always @(posedge clk)
    if (enable)
        crc_out <= crc_table[crc_out ^ data_in];
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">reg</span><span style="color: #D8DEE9FF"> [7:0] crc_table </span><span style="color: #ECEFF4">[</span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF">:255</span><span style="color: #ECEFF4">]</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">initial</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">begin</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #D8DEE9">$readmemh</span><span style="color: #D8DEE9FF">(</span><span style="color: #88C0D0">&quot;crc8_table.mem&quot;</span><span style="color: #88C0D0">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">crc_table</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #81A1C1">end</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">always</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">@</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">posedge</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">clk</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">enable</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">crc_out</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">crc_table[crc_out</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">^</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">data_in]</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Essa abordagem reduz drasticamente o uso de <strong>XORs em série</strong>, que são caros em termos de lógica combinacional, e aumenta a previsibilidade do tempo de propagação — ótimo para FPGAs pequenos com boa capacidade de BRAM.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Uso Eficiente de Recursos</h3>



<p class="wp-block-paragraph">Dependendo do tamanho da FPGA e do número de blocos de CRC utilizados:</p>



<ul class="wp-block-list">
<li>Prefira <strong>módulos genéricos</strong> e parametrizáveis (<code>parameter CRC_WIDTH</code>, <code>POLYNOMIO</code>) para reaproveitar a mesma lógica em múltiplos contextos.</li>



<li>Utilize <strong>Shift Registers em blocos LUT (SRL)</strong> para reduzir flip-flops.</li>



<li>Considere mover partes menos críticas para lógica <strong>combinacional fora do caminho de tempo</strong> (ex: XOR final ou bit reflection).</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Clock e Reset</h3>



<p class="wp-block-paragraph">Em projetos de CRC para comunicação, é fundamental garantir:</p>



<ul class="wp-block-list">
<li><strong>Sincronismo com o domínio de clock correto</strong> — especialmente se o dado vier de um domínio diferente (ex: FIFO, UART RX).</li>



<li>Uso de <strong>resets síncronos ou assíncronos bem definidos</strong>, pois valores iniciais do CRC (geralmente 0 ou <code>0xFF</code>) afetam diretamente o valor final.</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> CRC Seriais vs. Paralelos</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Critério</th><th>CRC Serial (bit a bit)</th><th>CRC Paralelo (byte a byte)</th></tr></thead><tbody><tr><td>Lógica</td><td>Simples</td><td>Moderadamente complexa</td></tr><tr><td>Tempo por byte</td><td>Alto</td><td>Baixo (1 ciclo)</td></tr><tr><td>Área (flip-flops)</td><td>Baixa</td><td>Moderada</td></tr><tr><td>Uso em protocolos</td><td>UART, SPI lento</td><td>Ethernet, PCIe, AXI</td></tr><tr><td>Facilidade de debug</td><td>Alta</td><td>Média</td></tr></tbody></table></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4d8.png" alt="📘" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Capítulo 7 – Integração com Interfaces Seriais</h2>



<p class="wp-block-paragraph">A utilidade prática dos módulos de CRC e checksum em Verilog se concretiza quando integrados a <strong>interfaces de comunicação reais</strong>, como <strong>UART</strong>, <strong>SPI</strong> ou até protocolos internos customizados entre blocos de IP. Neste capítulo, mostramos como aplicar essas técnicas em FSMs, buffers, e fluxos de dados sequenciais, com exemplos estruturados.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Enquadramento de Pacote</h3>



<p class="wp-block-paragraph">Um protocolo simples pode seguir o seguinte formato:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Campo</th><th>Tamanho</th><th>Descrição</th></tr></thead><tbody><tr><td>Header</td><td>8 bits</td><td><code>0xAA</code> (marcador de início)</td></tr><tr><td>Payload</td><td>32 bits</td><td>Dados úteis (ex: 4 bytes)</td></tr><tr><td>Checksum</td><td>8 bits</td><td>Soma dos dados</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">O envio e recepção são controlados por uma <strong>FSM (Finite State Machine)</strong>, que ativa o cálculo de verificação conforme os dados são recebidos.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f9ea.png" alt="🧪" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Exemplo de FSM de Recepção UART com Checksum</h3>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="module uart_rx_fsm (
    input clk, rst,
    input [7:0] rx_data,
    input rx_valid,
    output reg erro_checksum
);
    reg [2:0] estado;
    reg [7:0] dados[0:3]; // 4 bytes
    reg [1:0] contador;
    reg enable_checksum;
    wire [7:0] checksum_out;

    checksum8 checksum_mod (
        .clk(clk), .rst(rst),
        .enable(enable_checksum),
        .done(estado == 3),
        .data_in(rx_data),
        .checksum_out(checksum_out)
    );

    always @(posedge clk) begin
        if (rst) begin
            estado <= 0;
            contador <= 0;
            enable_checksum <= 0;
            erro_checksum <= 0;
        end else if (rx_valid) begin
            case (estado)
                0: if (rx_data == 8'hAA) estado <= 1;
                1: begin
                    dados[contador] <= rx_data;
                    enable_checksum <= 1;
                    if (contador == 3) begin
                        contador <= 0;
                        estado <= 2;
                    end else
                        contador <= contador + 1;
                end
                2: begin
                    enable_checksum <= 0;
                    if (rx_data != checksum_out)
                        erro_checksum <= 1;
                    estado <= 0;
                end
            endcase
        end
    end
endmodule
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">module</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">uart_rx_fsm</span><span style="color: #D8DEE9FF"> (</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">input</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">clk,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">rst,</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">input</span><span style="color: #D8DEE9FF"> [7:0] rx_data,</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">input</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">rx_valid,</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">output</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">reg</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">erro_checksum</span></span>
<span class="line"><span style="color: #D8DEE9FF">);</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">reg</span><span style="color: #D8DEE9FF"> [2:0] estado</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">reg</span><span style="color: #D8DEE9FF"> [7:0] dados</span><span style="color: #ECEFF4">[</span><span style="color: #B48EAD">0</span><span style="color: #D8DEE9FF">:3</span><span style="color: #ECEFF4">]</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">//</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">4</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">bytes</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">reg</span><span style="color: #D8DEE9FF"> [1:0] contador</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">reg</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">enable_checksum</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">wire</span><span style="color: #D8DEE9FF"> [7:0] checksum_out</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">checksum8</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">checksum_mod</span><span style="color: #D8DEE9FF"> (</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">.clk(clk</span><span style="color: #D8DEE9FF">), .rst</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">rst</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">.enable(enable_checksum</span><span style="color: #D8DEE9FF">),</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">.done(estado</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">==</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">3</span><span style="color: #D8DEE9FF">),</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">.data_in(rx_data</span><span style="color: #D8DEE9FF">),</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #88C0D0">.checksum_out(checksum_out</span><span style="color: #D8DEE9FF">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    )</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">always</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">@</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">posedge</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">clk</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">begin</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">rst</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> begin</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #88C0D0">estado</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #88C0D0">contador</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #88C0D0">enable_checksum</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #88C0D0">erro_checksum</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">end</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">else</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">rx_valid</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> begin</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #81A1C1">case</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">estado</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">                </span><span style="color: #88C0D0">0:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">if</span><span style="color: #D8DEE9FF"> (rx_data </span><span style="color: #A3BE8C">==</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">8</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">hAA) estado &lt;= 1;</span></span>
<span class="line"><span style="color: #A3BE8C">                1: begin</span></span>
<span class="line"><span style="color: #A3BE8C">                    dados[contador] &lt;= rx_data;</span></span>
<span class="line"><span style="color: #A3BE8C">                    enable_checksum &lt;= 1;</span></span>
<span class="line"><span style="color: #A3BE8C">                    if (contador == 3) begin</span></span>
<span class="line"><span style="color: #A3BE8C">                        contador &lt;= 0;</span></span>
<span class="line"><span style="color: #A3BE8C">                        estado &lt;= 2;</span></span>
<span class="line"><span style="color: #A3BE8C">                    end else</span></span>
<span class="line"><span style="color: #A3BE8C">                        contador &lt;= contador + 1;</span></span>
<span class="line"><span style="color: #A3BE8C">                end</span></span>
<span class="line"><span style="color: #A3BE8C">                2: begin</span></span>
<span class="line"><span style="color: #A3BE8C">                    enable_checksum &lt;= 0;</span></span>
<span class="line"><span style="color: #A3BE8C">                    if (rx_data != checksum_out)</span></span>
<span class="line"><span style="color: #A3BE8C">                        erro_checksum &lt;= 1;</span></span>
<span class="line"><span style="color: #A3BE8C">                    estado &lt;= 0;</span></span>
<span class="line"><span style="color: #A3BE8C">                end</span></span>
<span class="line"><span style="color: #A3BE8C">            endcase</span></span>
<span class="line"><span style="color: #A3BE8C">        end</span></span>
<span class="line"><span style="color: #A3BE8C">    end</span></span>
<span class="line"><span style="color: #A3BE8C">endmodule</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Esse exemplo mostra como <strong>ativar o cálculo de checksum dinamicamente</strong>, a cada byte válido recebido. Para CRC, basta trocar o módulo <code>checksum8</code> por um módulo <code>crc8_serial</code> ou <code>crc8_parallel</code>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Integração com SPI</h3>



<p class="wp-block-paragraph">No SPI, os dados são frequentemente recebidos de forma <strong>síncrona</strong> e em blocos. O mestre pode incluir o campo CRC no final da transação, e o escravo o calcula internamente.</p>



<h4 class="wp-block-heading">Estratégia:</h4>



<ul class="wp-block-list">
<li>Capturar os bytes em um shift register ou buffer RAM</li>



<li>Calcular o CRC ao final da transação</li>



<li>Comparar o valor recebido com o CRC calculado</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Comunicação entre Blocos Internos (SoC)</h3>



<p class="wp-block-paragraph">Em sistemas com múltiplos blocos (como UART + controle de motor), o uso de CRC em barramentos internos ajuda a detectar <strong>falhas na interligação</strong>, especialmente quando há <strong>cross-clock domains</strong>.</p>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4a1.png" alt="💡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Recomenda-se aplicar o CRC no transmissor, armazenar os dados e o CRC em um <strong>FIFO</strong>, e validar no receptor com base em sinais <code>valid</code> / <code>ready</code>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Sinalização de Erro</h3>



<p class="wp-block-paragraph">Erros de verificação devem <strong>gerar flags</strong> internas no sistema:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="if (crc_out != crc_rx)
    erro_crc <= 1;
else
    erro_crc <= 0;
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">crc_out</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">!=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">crc_rx</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">erro_crc</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #81A1C1">else</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">erro_crc</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Esses sinais podem:</p>



<ul class="wp-block-list">
<li>Acionar LEDs para debug</li>



<li>Gerar interrupções</li>



<li>Resetar FSMs</li>



<li>Inibir comandos críticos (ex: ativar motor)</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4d8.png" alt="📘" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Capítulo 8 – Casos de Estudo e Simulação</h2>



<p class="wp-block-paragraph">Implementar checksum e CRC é apenas parte da tarefa. Para garantir sua eficácia, é fundamental <strong>validar a lógica com simulação</strong>, inspecionar sinais, <strong>injetar falhas</strong> e verificar a reação do sistema. Neste capítulo, mostramos como aplicar os módulos em testes reais usando ferramentas como <strong>ModelSim</strong>, <strong>Vivado</strong> e <strong>GTKWave</strong>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Estudo de Caso 1: Comunicação entre dois blocos internos</h3>



<p class="wp-block-paragraph"><strong>Contexto</strong>: Dois módulos em um FPGA (ex: UART e controle de atuador) trocam dados via um barramento local com verificação CRC-8.</p>



<h4 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4df.png" alt="📟" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Transmissor (envia 4 bytes + CRC):</h4>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="// bloco de controle envia dados com crc8_parallel
data_in = 8'h12; enable = 1; // dados
data_in = 8'h34; ...
data_in = 8'h56; ...
data_in = 8'h78; ...
data_in = crc8_resultado; // último byte: CRC
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">//</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">bloco</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">de</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">controle</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">envia</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">dados</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">com</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">crc8_parallel</span></span>
<span class="line"><span style="color: #88C0D0">data_in</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">8</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">h12; enable = 1; // dados</span></span>
<span class="line"><span style="color: #A3BE8C">data_in = 8</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">h34</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">...</span></span>
<span class="line"><span style="color: #88C0D0">data_in</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">8</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">h56; ...</span></span>
<span class="line"><span style="color: #A3BE8C">data_in = 8</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">h78</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">...</span></span>
<span class="line"><span style="color: #88C0D0">data_in</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">crc8_resultado</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">//</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">último</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">byte:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">CRC</span></span>
<span class="line"></span></code></pre></div>



<h4 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4df.png" alt="📟" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Receptor (valida e compara CRC):</h4>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="// módulo receptor
if (crc_out != recebido_crc)
    erro <= 1;
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">//</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">módulo</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">receptor</span></span>
<span class="line"><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">crc_out</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">!=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">recebido_crc</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">erro</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4c8.png" alt="📈" class="wp-smiley" style="height: 1em; max-height: 1em;" /> A simulação mostra <code>erro = 1</code> quando o CRC é corrompido, e <code>erro = 0</code> quando válido.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Simulação com ModelSim/GTKWave</h3>



<ol class="wp-block-list">
<li>Compile o módulo e o testbench: <code>vlog crc8_parallel.v tb_crc8_parallel.v vsim work.tb_crc8_parallel</code></li>



<li>Rode a simulação e abra os sinais: <code>add wave -position end sim:/tb_crc8_parallel/* run 500ns</code></li>



<li>Inspecione:
<ul class="wp-block-list">
<li><code>data_in</code>, <code>crc_out</code></li>



<li>Flags de erro (<code>erro</code>)</li>



<li>Fluxo do FSM</li>
</ul>
</li>
</ol>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f50d.png" alt="🔍" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>GTKWave</strong>: pode ser usado para simulações feitas no Icarus Verilog (<code>iverilog</code>) com dump em <code>.vcd</code>.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Estudo de Caso 2: Injeção de Erros</h3>



<p class="wp-block-paragraph">Durante a simulação, podemos forçar um erro:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="// Testbench - simula erro no último byte
data_in = 8'h78 ^ 8'hFF; // erro intencional
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">//</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">Testbench</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">simula</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">erro</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">no</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">último</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">byte</span></span>
<span class="line"><span style="color: #88C0D0">data_in</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">8</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">h78 ^ 8</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">hFF</span><span style="color: #81A1C1">;</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">//</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">erro</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">intencional</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">No GTKWave ou ModelSim, o sinal <code>erro</code> deve ir para 1. Isso valida a sensibilidade do circuito à corrupção de dados.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Estudo de Caso 3: Interface UART com Checksum</h3>



<p class="wp-block-paragraph">Simule a recepção de bytes com uma <strong>máquina de estados</strong> e valide com o módulo <code>checksum8</code>. Use <code>rx_valid</code> e <code>rx_data</code> para alimentar a FSM, e observe o comportamento do checksum.</p>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4a1.png" alt="💡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Uma técnica útil é ligar um <code>LED</code> interno (simulado) ou uma <code>flag</code> para indicar falha:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="led_erro <= erro_checksum;
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">led_erro</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">erro_checksum</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span></code></pre></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Estratégias de Debug</h3>



<ul class="wp-block-list">
<li><strong>Counters</strong>: Contar bytes recebidos ajuda a sincronizar pacotes.</li>



<li><strong>LEDs virtuais</strong>: Sinais que indicam falha podem ser conectados a GPIOs em placas reais.</li>



<li><strong>Log Serial</strong>: Em FPGAs com softcore, log via UART é útil para exibir CRCs calculados.</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Ferramentas recomendadas</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Ferramenta</th><th>Função</th></tr></thead><tbody><tr><td><strong>ModelSim</strong></td><td>Simulação avançada e debugging</td></tr><tr><td><strong>Vivado</strong></td><td>Integração com hardware Xilinx</td></tr><tr><td><strong>GTKWave</strong></td><td>Visualização rápida de sinais</td></tr><tr><td><strong>Icarus</strong></td><td>Simulador open source leve</td></tr><tr><td><strong>LiteX</strong></td><td>Softcores com CRC embutido</td></tr></tbody></table></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4d8.png" alt="📘" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Capítulo 9 – Considerações Finais</h2>



<p class="wp-block-paragraph">A implementação de <strong>CRC e Checksum em Verilog</strong> é uma etapa fundamental no desenvolvimento de sistemas digitais confiáveis, especialmente quando se trata de <strong>comunicação entre blocos</strong>, <strong>interfaces seriais</strong>, ou <strong>integração de sensores e periféricos</strong>. Esses mecanismos protegem o sistema contra ruídos, glitches e falhas de sincronismo, garantindo que somente dados válidos sejam processados.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Boas Práticas de Projeto</h3>



<ol class="wp-block-list">
<li><strong>Defina com clareza o protocolo de comunicação</strong>:
<ul class="wp-block-list">
<li>Formato do frame (bytes de controle, dados, verificação)</li>



<li>Posição do checksum/CRC</li>



<li>Política de reação a erros (retransmissão, reset, bloqueio)</li>
</ul>
</li>



<li><strong>Escolha o tipo de verificação com base no risco</strong>:
<ul class="wp-block-list">
<li>Use <strong>checksum</strong> em sistemas simples ou internos ao chip</li>



<li>Prefira <strong>CRC-8 ou CRC-16</strong> para interfaces expostas ao ruído ou com dados críticos</li>



<li>Utilize <strong>CRC-32</strong> em streams contínuos de dados (ex: DMA, vídeo, Ethernet)</li>
</ul>
</li>



<li><strong>Teste com vetores conhecidos e simulação completa</strong>:
<ul class="wp-block-list">
<li>Compare resultados com ferramentas online</li>



<li>Use testbenches com casos positivos e negativos</li>



<li>Incremente FSMs para detectar erros e recuperar o estado</li>
</ul>
</li>



<li><strong>Documente todas as características do CRC</strong>:
<ul class="wp-block-list">
<li>Polinômio</li>



<li>Valor inicial</li>



<li>RefIn / RefOut</li>



<li>XOR final</li>
</ul>
</li>
</ol>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Comparativo Final: Checksum vs. CRC</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Critério</th><th>Checksum</th><th>CRC</th></tr></thead><tbody><tr><td>Complexidade</td><td>Baixa</td><td>Moderada/Alta</td></tr><tr><td>Recursos</td><td>Poucos registros e somadores</td><td>XORs e lógica sequencial</td></tr><tr><td>Detecção de Erros</td><td>Básica (1 ou 2 erros)</td><td>Alta (múltiplos erros e rajadas)</td></tr><tr><td>Aplicação típica</td><td>UART, controle simples</td><td>SPI, I2C, Ethernet, USB</td></tr></tbody></table></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Caminhos Avançados</h3>



<p class="wp-block-paragraph">Para aplicações ainda mais críticas ou robustas, considere o uso de:</p>



<ul class="wp-block-list">
<li><strong>Código de Hamming</strong>: capaz de <strong>corrigir</strong> 1 bit e detectar 2</li>



<li><strong>ECC (Error Correcting Code)</strong>: usado em memórias (SDRAM, Flash)</li>



<li><strong>Reed-Solomon</strong>: utilizado em CDs, satélites, QR codes e comunicação sem fio</li>



<li><strong>CRC com paralelismo total</strong>: permite cálculo de CRC em um único ciclo para vetores inteiros (ex: 32 bits por clock)</li>
</ul>



<p class="wp-block-paragraph">Essas técnicas podem ser combinadas a <strong>softcores RISC-V ou MicroBlaze</strong>, ou implementadas como IP blocks reutilizáveis.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Conclusão</h3>



<p class="wp-block-paragraph">CRC e Checksum não são apenas ferramentas matemáticas — são <strong>barreiras defensivas</strong> em nível de hardware, que garantem a <strong>robustez, confiabilidade e segurança</strong> de sistemas digitais modernos. Saber implementá-los em Verilog é uma competência fundamental para engenheiros de FPGA, seja no desenvolvimento de IPs proprietários, protocolos customizados ou sistemas embarcados críticos.</p>



<p class="wp-block-paragraph">Com este tutorial, você está agora preparado para:</p>



<ul class="wp-block-list">
<li><strong>Criar seus próprios módulos de verificação</strong></li>



<li><strong>Integrar lógica de integridade em FSMs e barramentos</strong></li>



<li><strong>Simular e validar o comportamento de forma automatizada</strong></li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/><p>The post <a href="https://mcu.tec.br/fpga/como-implementar-checksum-e-crc-em-verilog-para-fpgas-com-eficiencia-e-confiabilidade/">Como Implementar Checksum e CRC em Verilog para FPGAs com Eficiência e Confiabilidade</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">311</post-id>	</item>
		<item>
		<title>Verilog, VHDL e VHSIC: O que são e como moldam o futuro do hardware digital e da biotecnologia</title>
		<link>https://mcu.tec.br/fpga/verilog-vhdl-e-vhsic-o-que-sao-e-como-moldam-o-futuro-do-hardware-digital-e-da-biotecnologia/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=verilog-vhdl-e-vhsic-o-que-sao-e-como-moldam-o-futuro-do-hardware-digital-e-da-biotecnologia</link>
		
		<dc:creator><![CDATA[Carlos Delfino]]></dc:creator>
		<pubDate>Fri, 04 Apr 2025 12:59:47 +0000</pubDate>
				<category><![CDATA[FPGA]]></category>
		<category><![CDATA[ASIC]]></category>
		<category><![CDATA[bactérias programáveis]]></category>
		<category><![CDATA[bioeletrônica]]></category>
		<category><![CDATA[biologia sintética]]></category>
		<category><![CDATA[Cello]]></category>
		<category><![CDATA[circuitos digitais]]></category>
		<category><![CDATA[design digital]]></category>
		<category><![CDATA[engenharia eletrônica]]></category>
		<category><![CDATA[HDL]]></category>
		<category><![CDATA[linguagens de descrição de hardware]]></category>
		<category><![CDATA[MIT]]></category>
		<category><![CDATA[SystemVerilog]]></category>
		<category><![CDATA[Verilog]]></category>
		<category><![CDATA[VHDL]]></category>
		<category><![CDATA[VHSIC]]></category>
		<guid isPermaLink="false">https://mcu.tec.br/?p=299</guid>

					<description><![CDATA[<p>Descubra o que são Verilog, VHDL e VHSIC, como essas linguagens de descrição de hardware revolucionam o design de circuitos digitais em FPGAs e ASICs, e como estão sendo aplicadas na biotecnologia, incluindo o uso em bactérias programáveis desenvolvidas pelo MIT.</p>
<p>The post <a href="https://mcu.tec.br/fpga/verilog-vhdl-e-vhsic-o-que-sao-e-como-moldam-o-futuro-do-hardware-digital-e-da-biotecnologia/">Verilog, VHDL e VHSIC: O que são e como moldam o futuro do hardware digital e da biotecnologia</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">O desenvolvimento de sistemas digitais complexos exige ferramentas e linguagens que permitam a descrição precisa e eficiente do comportamento e da estrutura dos circuitos eletrônicos. Entre essas ferramentas, destacam-se as linguagens de descrição de hardware (HDLs — <em>Hardware Description Languages</em>), das quais Verilog e VHDL são as mais amplamente utilizadas. Essas linguagens permitem que engenheiros e pesquisadores modelem, simulem e implementem circuitos digitais em dispositivos como FPGAs (<em>Field Programmable Gate Arrays</em>) e ASICs (<em>Application-Specific Integrated Circuits</em>), representando um elo fundamental entre o mundo da eletrônica e o da computação.</p>



<p class="wp-block-paragraph">Ambas as linguagens têm suas raízes na década de 1980, quando a crescente complexidade dos projetos digitais exigiu novos métodos de automação e verificação. VHDL, por exemplo, surgiu de um projeto militar financiado pelo Departamento de Defesa dos Estados Unidos, o VHSIC (<em>Very High Speed Integrated Circuit</em>), enquanto Verilog foi criado por uma empresa privada para facilitar o design e a verificação de circuitos integrados comerciais. Cada linguagem traz consigo características únicas que influenciam sua adoção em diferentes contextos, seja na indústria, na academia ou na pesquisa científica.</p>



<p class="wp-block-paragraph">Nos últimos anos, a aplicação dessas linguagens expandiu-se significativamente, alcançando não apenas o design eletrônico tradicional, mas também áreas emergentes como a biotecnologia computacional. Um exemplo marcante é o uso de linguagens semelhantes a HDLs em pesquisas como as do MIT, que exploram a reprogramação de bactérias utilizando princípios de engenharia genética inspirados no design de circuitos digitais.</p>



<p class="wp-block-paragraph">Neste artigo, exploraremos em detalhes o que são Verilog, VHDL e VHSIC, contextualizando historicamente seu surgimento, destacando suas principais características, apresentando exemplos práticos de uso e analisando como essas tecnologias estão sendo empregadas desde o desenvolvimento de FPGAs até os domínios mais inovadores da biotecnologia sintética.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">O que é VHDL?</h2>



<p class="wp-block-paragraph">VHDL, sigla para <em>VHSIC Hardware Description Language</em>, é uma linguagem de descrição de hardware criada no início dos anos 1980 como parte do projeto VHSIC (<em>Very High Speed Integrated Circuit</em>), uma iniciativa do Departamento de Defesa dos Estados Unidos para desenvolver circuitos integrados de altíssima velocidade para aplicações militares. O objetivo era criar uma linguagem padrão e formal para documentar, simular e sintetizar circuitos digitais complexos de maneira confiável e reutilizável. Em 1987, o VHDL foi padronizado pelo IEEE como o IEEE 1076, o que permitiu sua ampla adoção pela indústria.</p>



<p class="wp-block-paragraph">Diferente de linguagens de programação convencionais como C ou Python, o VHDL descreve não apenas o comportamento, mas também a estrutura física de um circuito. Isso significa que ele pode ser usado tanto para especificar a lógica funcional de um sistema (como somadores, registradores ou controladores) quanto para representar conexões físicas entre componentes em um projeto. O VHDL é fortemente tipado e baseado em sintaxe semelhante à linguagem Ada, exigindo disciplina rigorosa na definição de sinais, tipos de dados e blocos lógicos, o que o torna ideal para projetos que demandam alta confiabilidade e verificabilidade, como aplicações aeroespaciais, médicas e industriais.</p>



<p class="wp-block-paragraph">Um exemplo simples em VHDL pode ser um componente que implementa uma porta lógica AND de dois bits:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity porta_and is
    Port ( A : in  STD_LOGIC;
           B : in  STD_LOGIC;
           Y : out STD_LOGIC);
end porta_and;

architecture comportamento of porta_and is
begin
    Y <= A and B;
end comportamento;
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">library</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">IEEE</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #88C0D0">use</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">IEEE.STD_LOGIC_1164.ALL</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">entity</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">porta_and</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">is</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">Port</span><span style="color: #D8DEE9FF"> ( </span><span style="color: #A3BE8C">A</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">in</span><span style="color: #D8DEE9FF">  </span><span style="color: #A3BE8C">STD_LOGIC</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">           </span><span style="color: #88C0D0">B</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">in</span><span style="color: #D8DEE9FF">  </span><span style="color: #A3BE8C">STD_LOGIC</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">           </span><span style="color: #88C0D0">Y</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">out</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">STD_LOGIC</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #81A1C1">end</span><span style="color: #D8DEE9FF"> porta_and</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">architecture</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">comportamento</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">of</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">porta_and</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">is</span></span>
<span class="line"><span style="color: #88C0D0">begin</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">Y</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">A</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">and</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">B</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #81A1C1">end</span><span style="color: #D8DEE9FF"> comportamento</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Esse código define uma entidade chamada <code>porta_and</code> com duas entradas (<code>A</code> e <code>B</code>) e uma saída (<code>Y</code>). A arquitetura descreve o comportamento lógico da saída como sendo o resultado da operação AND entre as duas entradas. Essa simplicidade é o ponto de partida para projetos muito mais complexos, que podem incluir sistemas embarcados completos, processadores, controladores de memória ou até mesmo interfaces de comunicação sofisticadas.</p>



<p class="wp-block-paragraph">O VHDL é amplamente utilizado na indústria de semicondutores e no desenvolvimento de FPGAs. Ferramentas de síntese como Xilinx Vivado ou Intel Quartus permitem transformar um projeto em VHDL diretamente em um circuito físico que pode ser implementado em dispositivos reconfiguráveis. Além disso, o VHDL é uma escolha comum em ambientes acadêmicos e projetos que exigem documentação robusta e verificação formal, devido à sua clareza e precisão semântica.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">O que é Verilog?</h2>



<p class="wp-block-paragraph">Verilog é uma linguagem de descrição de hardware desenvolvida em 1984 pela empresa Gateway Design Automation, com o objetivo de facilitar a modelagem, simulação e síntese de circuitos digitais. Sua proposta era oferecer uma abordagem mais simples e familiar a engenheiros acostumados com linguagens de programação como C, diferentemente do VHDL, que possui uma sintaxe mais rigorosa baseada em Ada. Verilog se popularizou rapidamente no setor comercial, sendo posteriormente padronizado como IEEE 1364 em 1995. Em 2009, a linguagem foi incorporada ao padrão SystemVerilog, uma extensão que adiciona recursos avançados de verificação e orientação a objetos.</p>



<p class="wp-block-paragraph">A sintaxe do Verilog é mais enxuta e permissiva que a do VHDL, o que pode acelerar o desenvolvimento inicial, embora possa trazer desafios na legibilidade e manutenção de projetos muito complexos. Verilog também suporta modelagem de diferentes níveis de abstração: desde a descrição comportamental, passando pela descrição de transferência de registradores (<em>register-transfer level</em>, RTL), até o nível estrutural, onde os componentes físicos são interligados explicitamente. Esse espectro de abstrações torna Verilog uma ferramenta poderosa para o desenvolvimento iterativo de hardware.</p>



<p class="wp-block-paragraph">Veja abaixo um exemplo simples de uma porta lógica AND usando Verilog:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="module porta_and (
    input wire A,
    input wire B,
    output wire Y
);

assign Y = A &amp; B;

endmodule
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">module</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">porta_and</span><span style="color: #D8DEE9FF"> (</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">input</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">wire</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">A,</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">input</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">wire</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">B,</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">output</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">wire</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">Y</span></span>
<span class="line"><span style="color: #D8DEE9FF">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">assign</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">Y</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">A</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&amp;</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">B</span><span style="color: #81A1C1">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">endmodule</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Neste exemplo, o módulo <code>porta_and</code> recebe duas entradas (<code>A</code> e <code>B</code>) e gera uma saída <code>Y</code> usando a operação lógica AND. A clareza e concisão do código ilustram por que Verilog é frequentemente preferido em ciclos de desenvolvimento rápidos, startups e projetos comerciais que visam tempo reduzido de mercado.</p>



<p class="wp-block-paragraph">Verilog é amplamente adotado por grandes fabricantes de FPGA, como Xilinx e Intel (anteriormente Altera), sendo compatível com ferramentas populares como Vivado, ModelSim e Synplify. Além disso, é a linguagem preferida para o design de ASICs em empresas de semicondutores e também está presente em projetos open-source relevantes, como o RISC-V, uma arquitetura de processador modular e aberta.</p>



<p class="wp-block-paragraph">Outro campo onde Verilog ganha destaque é na prototipagem de sistemas heterogêneos que combinam lógica programável com software embarcado, como SoCs (System-on-Chip), onde o hardware customizado coexiste com processadores ARM. Isso permite, por exemplo, a criação de aceleradores de IA dedicados ou pipelines personalizados de processamento de sinais.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">O que é VHSIC?</h2>



<p class="wp-block-paragraph">VHSIC é a sigla para <em>Very High Speed Integrated Circuit</em> — ou, em português, Circuito Integrado de Velocidade Muito Alta. Embora não seja uma linguagem de descrição de hardware por si só, o termo está intimamente ligado ao desenvolvimento do VHDL. O programa VHSIC foi uma iniciativa estratégica lançada no início da década de 1980 pelo Departamento de Defesa dos Estados Unidos com o objetivo de acelerar o desenvolvimento de circuitos integrados de altíssima velocidade para aplicações militares e aeroespaciais, como mísseis guiados, radares e sistemas de comunicação criptografada.</p>



<p class="wp-block-paragraph">O contexto do programa VHSIC envolvia a necessidade de superar as limitações dos circuitos integrados convencionais, frente à crescente complexidade dos sistemas digitais e à corrida tecnológica da Guerra Fria. Para isso, o programa financiou não apenas a pesquisa em novos materiais e tecnologias de semicondutores, mas também o desenvolvimento de ferramentas e metodologias de projeto. Nesse cenário, tornou-se evidente a carência de uma linguagem padronizada e formal que pudesse descrever circuitos de maneira legível, verificável e sintetizável. Assim nasceu o VHDL — como uma subparte do projeto VHSIC — para suprir essa lacuna.</p>



<p class="wp-block-paragraph">Embora o programa VHSIC em si tenha se encerrado no início dos anos 1990, seu legado é profundo. Ele não apenas influenciou o desenvolvimento de circuitos de alto desempenho que hoje encontramos em satélites, aviões e sistemas embarcados críticos, como também deu origem a um ecossistema de ferramentas de engenharia que continuam sendo fundamentais para o projeto de hardware até os dias atuais.</p>



<p class="wp-block-paragraph">É importante entender que, enquanto VHDL e Verilog são linguagens, o VHSIC foi um projeto tecnológico com múltiplos objetivos — desde a criação de processos fabris até o desenvolvimento de algoritmos de automação de projeto. Seu impacto histórico mostra como a necessidade de inovação em ambientes extremos (como defesa e espaço) pode impulsionar o surgimento de tecnologias fundamentais para a indústria civil, incluindo smartphones, veículos autônomos, redes 5G e dispositivos médicos inteligentes.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Comparação entre Verilog e VHDL</h2>



<p class="wp-block-paragraph">Apesar de Verilog e VHDL terem finalidades semelhantes — descrever e modelar circuitos digitais — suas diferenças conceituais, sintáticas e filosóficas influenciam diretamente o fluxo de trabalho, a curva de aprendizado e a manutenção dos projetos.</p>



<p class="wp-block-paragraph"><strong>Origem e Filosofia</strong>: VHDL nasceu em um ambiente militar-acadêmico, com foco em precisão formal e robustez. É fortemente tipado, o que obriga o desenvolvedor a declarar explicitamente os tipos de sinais, promovendo legibilidade e verificabilidade em projetos de alta criticidade. Por outro lado, Verilog teve origem comercial e foi projetado para ser mais direto e semelhante a linguagens como C, o que o torna mais acessível a engenheiros com formação em software. Verilog adota uma tipagem mais permissiva, o que permite uma escrita mais concisa, embora potencialmente mais propensa a erros sutis.</p>



<p class="wp-block-paragraph"><strong>Sintaxe e Legibilidade</strong>: A sintaxe do VHDL é mais verbosa e estruturada. Por exemplo, um simples registrador pode exigir várias linhas de código com definições explícitas de sinais, pacotes e bibliotecas. Em contrapartida, Verilog permite descrever o mesmo componente com poucas linhas, facilitando prototipagem rápida. No entanto, essa simplicidade pode comprometer a legibilidade em grandes sistemas.</p>



<p class="wp-block-paragraph"><strong>Ferramentas e Adoção</strong>: Ambas as linguagens são amplamente suportadas por ferramentas de desenvolvimento de FPGAs, como Xilinx Vivado, Intel Quartus, Synplify e ModelSim. No entanto, a indústria acadêmica e a aeronáutica tradicionalmente preferem o VHDL por sua clareza formal, enquanto empresas comerciais, startups e projetos de ASICs tendem a adotar Verilog pela agilidade de desenvolvimento. Nos últimos anos, o SystemVerilog (uma extensão de Verilog com recursos de orientação a objetos e verificação formal) vem ganhando espaço como um padrão moderno de design e verificação.</p>



<p class="wp-block-paragraph"><strong>Exemplo prático</strong>: Imagine a modelagem de um contador binário de 4 bits. Em VHDL, o projeto pode levar mais tempo para ser escrito, mas o controle sobre os tipos e temporizações será mais explícito. Já em Verilog, o mesmo contador pode ser criado com meia dúzia de linhas e testado rapidamente, sendo ideal para ciclos curtos de desenvolvimento.</p>



<p class="wp-block-paragraph"><strong>Portabilidade e Reutilização</strong>: O VHDL possui recursos robustos de encapsulamento e modularização que favorecem a reutilização de componentes em projetos diferentes, algo que pode ser mais limitado em Verilog puro (embora melhorado com SystemVerilog). Além disso, projetos em VHDL tendem a ser mais portáveis entre diferentes ferramentas e fornecedores.</p>



<p class="wp-block-paragraph"><strong>Resumo</strong>: VHDL é ideal quando a confiabilidade e a documentação são prioritárias. Verilog brilha quando agilidade e simplicidade são desejadas. Ambos coexistem em muitos projetos, sendo até comum equipes multidisciplinares utilizarem ambas as linguagens, cada uma em diferentes partes do sistema.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Aplicações práticas: de FPGAs a bactérias programáveis</h2>



<p class="wp-block-paragraph">As linguagens de descrição de hardware, como VHDL e Verilog, são amplamente conhecidas por sua aplicação no desenvolvimento de <strong>FPGAs (Field Programmable Gate Arrays)</strong> e <strong>ASICs (Application-Specific Integrated Circuits)</strong>. Contudo, seus princípios — descrever sistemas em termos de lógica, interconexão e comportamento paralelo — estão sendo estendidos para áreas inovadoras, como a biologia sintética e a computação molecular.</p>



<h3 class="wp-block-heading">Aplicações clássicas: FPGAs e SoCs</h3>



<p class="wp-block-paragraph">No contexto tradicional, VHDL e Verilog são usados para projetar sistemas digitais que operam em altas velocidades, com lógica customizada, como controladores de memória DDR, interfaces SPI/I2C/UART, filtros digitais (DSP), unidades lógicas e aritméticas (ALUs) e até mesmo <strong>processadores completos</strong>, como os baseados na arquitetura RISC-V.</p>



<p class="wp-block-paragraph">FPGAs oferecem uma plataforma ideal para testes e prototipagem, já que podem ser reconfigurados mesmo após a fabricação. Usando Verilog ou VHDL, um engenheiro pode implementar um decodificador de vídeo em tempo real, um algoritmo de compressão de dados ou uma unidade criptográfica dedicada. Por sua natureza paralela, os FPGAs superam CPUs tradicionais em tarefas como processamento de sinais, visão computacional e inteligência artificial embarcada.</p>



<h3 class="wp-block-heading">Aplicações emergentes: Engenharia Genética e Biologia Sintética</h3>



<p class="wp-block-paragraph">Um campo revolucionário que vem explorando os princípios das HDLs é a <strong>biologia sintética</strong> — mais especificamente, o uso de linguagens inspiradas em Verilog para programar organismos vivos. Um dos marcos dessa aplicação foi o trabalho conduzido pelo MIT e pelo laboratório de engenharia biológica de Christopher Voigt, que desenvolveu linguagens de descrição genética para programar bactérias como <em>E. coli</em>.</p>



<p class="wp-block-paragraph">Essas linguagens biológicas permitem descrever circuitos genéticos usando lógica digital, como portas AND, OR, NOT, flip-flops e até memórias. Em vez de sinais elétricos, os “sinais” são concentrações de proteínas ou moléculas sinalizadoras, e os “componentes” são promotores, genes e reguladores de expressão. Um exemplo é a construção de um biossensor que ativa a produção de uma proteína fluorescente somente na presença de duas substâncias específicas — algo análogo a uma porta lógica AND.</p>



<p class="wp-block-paragraph">Um projeto de destaque é o <strong>Cello</strong> (por “Cell logic”), uma linguagem inspirada em Verilog para programar circuitos genéticos. O usuário escreve o comportamento desejado em uma sintaxe semelhante a HDL, e o compilador Cello traduz esse código para sequências de DNA que podem ser inseridas em bactérias. Os microrganismos resultantes são programados para realizar funções como detecção de doenças, liberação de medicamentos ou resposta a estímulos ambientais.</p>



<h3 class="wp-block-heading">Convergência entre Engenharia Elétrica e Biotecnologia</h3>



<p class="wp-block-paragraph">A união entre engenharia eletrônica e biotecnologia está criando uma nova fronteira chamada <strong>bioeletrônica</strong>, onde sensores implantáveis, dispositivos wearable e sistemas de monitoramento se integram com circuitos programáveis. Os engenheiros que dominam VHDL e Verilog já têm a base lógica necessária para entender e criar algoritmos genéticos sintéticos, pois a lógica digital serve como modelo direto para muitos processos celulares programáveis.</p>



<p class="wp-block-paragraph">Assim, o conhecimento em linguagens HDLs não apenas capacita profissionais para trabalhar com sistemas embarcados e FPGAs, mas também abre portas para áreas multidisciplinares, onde biologia, computação e eletrônica convergem para transformar a medicina, a agricultura e o meio ambiente.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">Conclusão</h2>



<p class="wp-block-paragraph">Verilog, VHDL e o projeto VHSIC representam mais do que ferramentas técnicas — são pilares de uma revolução contínua no desenvolvimento de sistemas digitais e na maneira como engenheiros concebem, testam e implementam circuitos. Desde aplicações clássicas em FPGAs e ASICs até a programação de organismos vivos, essas linguagens mostram a incrível capacidade da engenharia de cruzar fronteiras e expandir seu impacto para além do silício.</p>



<p class="wp-block-paragraph">A escolha entre Verilog e VHDL depende fortemente do contexto, das exigências do projeto e da familiaridade da equipe com a linguagem. Enquanto o VHDL oferece rigor formal e é amplamente adotado em setores onde a confiabilidade é inegociável, como aeroespacial e defesa, o Verilog brilha por sua agilidade, concisão e fluidez, sendo ideal para prototipagem rápida e projetos comerciais. Em paralelo, os conceitos estruturais e lógicos dessas linguagens estão sendo reaproveitados para programar materiais vivos, como bactérias, expandindo o domínio da computação para o nível molecular.</p>



<p class="wp-block-paragraph">O engenheiro do futuro não será apenas um programador de sistemas eletrônicos, mas também um designer de comportamento — seja em chips, organismos ou até sistemas híbridos entre biologia e computação. Entender Verilog e VHDL, portanto, é não apenas dominar o passado e o presente do hardware digital, mas também preparar-se para os horizontes inovadores da computação programável em todas as suas formas.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/><p>The post <a href="https://mcu.tec.br/fpga/verilog-vhdl-e-vhsic-o-que-sao-e-como-moldam-o-futuro-do-hardware-digital-e-da-biotecnologia/">Verilog, VHDL e VHSIC: O que são e como moldam o futuro do hardware digital e da biotecnologia</a> first appeared on <a href="https://mcu.tec.br">MCU & FPGA</a>.</p>]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">299</post-id>	</item>
	</channel>
</rss>
