Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Industrial programming >> Verilog

Adicionador Completo Verilog


Um somador é um componente digital que realiza a adição de dois números. É o principal componente dentro de uma ALU de um processador e é usado para incrementar endereços, índices de tabela, ponteiros de buffer e em muitos outros lugares onde a adição é necessária.

Um somador completo adiciona uma entrada de transporte junto com outros números binários de entrada para produzir uma soma e uma saída de transporte.

Tabela Verdade

A B Cin Cout Soma
0 0 0 0 0
0 0 1 0 1
0 1 0 0 1
0 1 1 1 0
1 0 0 0 1
1 0 1 1 0
1 1 0 1 0
1 1 1 1 1

Projeto


Um exemplo de um somador de 4 bits é mostrado abaixo, que aceita dois números binários através dos sinais a e b, ambos com 4 bits de largura. Como um somador é um circuito combinacional, ele pode ser modelado em Verilog usando uma atribuição contínua com assign ou um always bloco com uma lista de sensibilidade que compreende todas as entradas. O código mostrado abaixo é o da abordagem anterior.
  
  
module fulladd (  input [3:0] a,
                  input [3:0] b,
                  input c_in,
                  output c_out,
                  output [3:0] sum);

   assign {c_out, sum} = a + b + c_in;
endmodule

  

O código mostrado abaixo usa um always bloco que é executado sempre que qualquer uma de suas entradas muda de valor.
  
  
module fulladd (  input [3:0] a,
                  input [3:0] b,
                  input c_in,
                  output reg c_out,
                  output reg [3:0] sum);

	always @ (a or b or c_in) begin
  	{c_out, sum} = a + b + c_in; 	
  end
endmodule

  

Esquema de hardware

Banco de teste

  
  
module tb_fulladd;
	// 1. Declare testbench variables
   reg [3:0] a;
   reg [3:0] b;
   reg c_in;
   wire [3:0] sum;
   integer i;

	// 2. Instantiate the design and connect to testbench variables
   fulladd  fa0 ( .a (a),
                  .b (b),
                  .c_in (c_in),
                  .c_out (c_out),
                  .sum (sum));

	// 3. Provide stimulus to test the design
   initial begin
      a <= 0;
      b <= 0;
      c_in <= 0;
      
      $monitor ("a=0x%0h b=0x%0h c_in=0x%0h c_out=0x%0h sum=0x%0h", a, b, c_in, c_out, sum);

		// Use a for loop to apply random values to the input
      for (i = 0; i < 5; i = i+1) begin
         #10 a <= $random;
             b <= $random;
         		 c_in <= $random;
      end
   end
endmodule

  

Observe que quando a e b somam para dar um número com mais de 4 bits de largura, a soma rola para zero e c_out se torna 1. Por exemplo, a linha destacada em amarelo soma para dar 0x11 e os 4 bits inferiores são atribuídos a soma e bit#4 para c_out.
Registro de simulação
ncsim> run
a=0x0 b=0x0 c_in=0x0 c_out=0x0 sum=0x0
a=0x4 b=0x1 c_in=0x1 c_out=0x0 sum=0x6
a=0x3 b=0xd c_in=0x1 c_out=0x1 sum=0x1
a=0x5 b=0x2 c_in=0x1 c_out=0x0 sum=0x8
a=0xd b=0x6 c_in=0x1 c_out=0x1 sum=0x4
a=0xd b=0xc c_in=0x1 c_out=0x1 sum=0xa
ncsim: *W,RNQUIE: Simulation is complete.


Verilog

  1. Tutorial Verilog
  2. Concatenação Verilog
  3. Atribuições Verilog
  4. Verilog Blocking &Non-Blocking
  5. Funções Verilog
  6. Tarefa Verilog
  7. Gerador de Relógio Verilog
  8. Funções matemáticas Verilog
  9. Formato de hora Verilog
  10. Escopo da escala de tempo da Verilog