Tutorial de Verilog: Somador com Propagação do Carry – Somador Ripple-Carry

Somador Ripple-Carry

Vamos ver a partir deste post como funcionam os somadores. Um somador de N-bits consiste em um circuito que consegue somar duas entradas, cada uma delas com N-bits, e mais um sinal Carry de entrada e produz um resultado também com o mesmo tamanho, N-bits e um sinal Carry de Saída. Esse circuito somador é conhecido na literatura como Somador com Propagação do Carry, porque o sinal de Carry se propaga por todo o circuito do primeiro ao último bloco de hardware.

O símbolo de um somador pode ser representado como na figura abaixo.

Somador Ripple-Carry
Figura 1: Somador com Propagação do Carry

Existem três implementações comuns de Somador com Propagação do Carry. São elas:

  • Somador Ripple-Carry (Ripple-Carry Adder);
  • Somador Carry Adder (Carry Lookahead Adder);
  • Somador Prefixado (Prefix Adder).

Vamos abordar todos os somadores aqui no Embarcados. Neste post em específico estudaremos como funciona o Somador Ripple-Carry (Ripple-Carry Adder).

Somador Ripple-Carry

A forma mais simples, comum e intuitiva de criar um Somador é conectar vários somadores de 1-bit um após o outro, conectando o Carry de saída do anterior no Carry de entrada do atual e conectar o Carry de saída do atual no próximo bloco, totalizando uma cadeia de N blocos para um somador de N bits. Este então é o circuito do Ripple-Carry Adder. Ele é o somador mais modular que existe, já que podemos utilizar cada um dos somadores de 1-bit como módulos e escalarmos esse somador infinitamente. O problema dessa abordagem é que esse circuito é muito lento se compararmos com os demais somadores, conforme veremos quando forem apresentados os demais somadores. Abaixo está representado um somador de 4-bits. 

Representação do Circuito Somador Ripple-Carry de 4-bits em termos de Somadores Completos de 1-bit

Represento nas imagens abaixo o mesmo circuito de Somador Ripple-Carry de 4-bits. Essa representação utiliza quatro blocos Somadores Completos de 1-bit. Os dois desenhos significam a mesma coisa, mas desenhei das duas maneiras porque pode-se encontrar as duas formas de representação.

Somador Ripple-Carry
Figura 2: Representação do Circuito Somador Ripple-Carry de 4-bits em termos de Somadores Completos de 1-bit
Somador Ripple-Carry: Representação do Circuito Somador Ripple-Carry de 4-bits em termos de Somadores Completos de 1-bit
Figura 3: Representação do Circuito Somador Ripple-Carry de 4-bits em termos de Somadores Completos de 1-bit

Representação do Circuito Somador Ripple-Carry de 4-bits em Verilog

Para representar o circuito acima, escolhi a abordagem estrutural, onde codifico como se estivesse montando o esquemático do circuito. Criei um projeto em branco no Quartus (para ver como criar um projeto, veja este link) e utilizei o arquivo do meio somador e do somador completo de 1-bit mostrado no post anterior.

Arquivo meio_somador.v

Arquivo SOMADOR.v

Então criei a estrutura do código em Verilog para o Somador Ripple-Carry. Como estou considerando um somador de 4-bits, considerei os sinais A, B e Soma como [3:0]. No primeiro bloco, eu apliquei o Carry de entrada Cin e assim por diante. Nos outros blocos somadores de 1-bit coloquei os sinais um a um até o quarto bloco.

Arquivo ripple_carry_adder.v

Testbench para o Circuito Somador Ripple-Carry de 4-bits em Verilog

Para injetar valore e 0 a 15 em A e de zero a 15 em B, criei dois contadores, i e j. Os valores de i, injetei em A, os valores de j, injetei em B. Fiz dois testes que mostrariam uma mensagem de erro quando executasse o Testbench, uma testando o Carry e outra testando a soma. O testbench está abaixo.

Arquivo ripple_carry_adder_tb.v

Forma de Onda resultante do teste

A forma de onda resultante foi de acordo com o esperado. O resultado no terminal também não apresentou nenhuma mensagem de erro. 

Somador Ripple-Carry: Forma de Onda resultante do teste

Caso queira reproduzir o teste feito acima, faça Download do Projeto para o Quartus da Altera e aperte o play:

download_proteus_arduino_lcd

 

Representação do Circuito Somador Ripple-Carry de 32-bits em termos de Somadores Completos de 1-bit

Reproduzi o exemplo anterior para um somador de 32-bits na topologia Ripple-Carry. Ele funciona da mesma forma. Repare na figura abaixo para entender como funciona a expansão desse circuito. 

Somador Ripple-Carry
Somador Ripple-Carry

 

Representação do Circuito Somador Ripple-Carry de 32-bits em Verilog

Arquivo meio_somador.v (igual ao exemplo anterior)

Arquivo SOMADOR.v (igual ao exemplo anterior)

Foi codificado da mesma maneira que para 4-bits, mas dessa vez para um somador de 32 bits. Veja abaixo.

Arquivo ripple_carry_adder.v

Testbench para o Circuito Somador Ripple-Carry de 32-bits em Verilog

Testei o código Verilog do Somador 32-bits utilizando o testbench altero do exemplo anterior e mostrado abaixo.

Arquivo ripple_carry_adder_tb.v

Resultado do teste

Testei o circuito apenas parcialmente. Não rodei todo o teste por ele ser muito grande e ir além do escopo deste texto. Deixo no entanto disponível o projeto completo do Quartus. Caso queira reproduzir o teste completo ou mesmo só estudar o código, faça Download do Projeto para o Quartus da Altera e aperte o play:

download_proteus_arduino_lcd

É isso ai pessoal, espero que tenham gostado. Deixem seus comentários. É importante para guiar meus próximos passos.

Outros artigos da série

<< Tutorial de Verilog: Conversor de Código Gray para Código BinárioTutorial de Verilog: Conversor BCD para 7 Segmentos >>
Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Comentários:
Notificações
Notificar
guest
0 Comentários
Inline Feedbacks
View all comments
Talvez você goste:

Séries



Outros da Série

Menu

EVENTO ONLINE

Simplificando seus projetos de Internet das coisas com o iMCP HT32SX Sigfox

DATA: 18/05 às 15:00h