<?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>Checksum FPGA - MCU &amp; FPGA</title>
	<atom:link href="https://mcu.tec.br/tags/checksum-fpga/feed/" rel="self" type="application/rss+xml" />
	<link>https://mcu.tec.br</link>
	<description>Microcontroladores &#38; FPGA</description>
	<lastBuildDate>Fri, 04 Apr 2025 20:19:15 +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>Checksum FPGA - MCU &amp; FPGA</title>
	<link>https://mcu.tec.br</link>
	<width>32</width>
	<height>32</height>
</image> 
	<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>
	</channel>
</rss>
