Aula 5.6 - Somador de 1 bit e 4 bit em Verilog HDL
Na primeira aula dessa série de aulas você aprendeu toda a base para compreender códigos em Verilog HDL e rodar os códigos, se ainda não leu clique aqui e confira.
Vamos criar primeiramente um somador de 1 bit abaixo. A ideia é simples, somar três números de 1 bit. Exemplo:
X = 1 (equivale a 1 em decimal).
Y = 0 (equivale a 0 em decimal).
TE = 0 (equivale a 0 em decimal).
X+Y+TE é igual a 1 (equivale a 1 em decimal).
Mas note este outro exemplo:
X = 1 (equivale a 1 em decimal).
Y = 1 (equivale a 1 em decimal).
TE = 0 (equivale a 0 em decimal).
X+Y+TE é igual a 10 (equivale a 2 em decimal), pois '1 bit + 1 bit + 0 bit' é 0 e vai 1.
Portanto devemos considerar o ato de "vai 1" em nossa tabela verdade.
Chamaremos este "vai 1" de "TS" (transporte de saída ou carry out) e montaremos a tabela verdade a seguir:
Agora tirando as expressões para S e TS obtemos:
S = X xor Y xor TE
TS = (X and TE) or (Y and TE) or (X and Y)
Assim, podemos montar nosso código para um somador de 1 bit:
module somador1bit (X,Y,TE,HEX7);
input X,Y,TE; //entradas
output reg [0:6]HEX7; //vetor para led display
wire S,TS; //fios intermediários
wire [3:0]auxEntrada = {2'b00,TS,S}; //concatena na forma 00TSS
assign S = X ^ Y ^ TE;
assign TS = (X&Y) | (X&TE) | (Y&TE);
decodificador b0(auxEntrada,HEX7); //chama nosso decodificador para display
endmodule
O decodificador que chamamos no código acima está abaixo. Note que vetor 'E' do decodificador abaixo recebe o valor presente em 'auxEntrada' acima.
module decodificador (E,S);
input [3:0]E; //vetor de 4 bits
output reg [0:6]S;//bit mais significativo a direita, se não o display fica invertido
always @(*) //o asterisco basicamente cria a lista de sensibilidade para você
begin
case(E)
4'b0000 : S=7'b0000001; // 0 em binário, não acende led 'g'
4'b0001 : S=7'b1001111;
4'b0010 : S=7'b0010010;
4'b0011 : S=7'b0000110;
4'b0100 : S=7'b1001100;
4'b0101 : S=7'b0100100;
4'b0110 : S=7'b0100000;
4'b0111 : S=7'b0001101;
4'b1000 : S=7'b0000000;
4'b1001 : S=7'b0000100;
default : S=7'b1111111; //padrão, todos leds apagados
endcase;
end
endmodule
Rodando os códigos, você perceberá que a soma dos 3 números será exibida em decimal no display de 7-segmentos.
Agora vamos criar um somador de 4 bits, conhecido como full adder. A lógica continua sendo a mesma do somador de 1 bit, você deve ter notado que utilizamos o termo TE como variável no somador acima, este termo se refere a 'transporte de entrada' ou 'carry in', ou seja, ao somamos dois números de 4 bits, o TS (vai um) do primeiro bit vai ser o TE do segundo bit. A imagem abaixo ilustra melhor essa lógica:
Com isso em mente, confira como fica o código:
module somador4bit (A,B,TE,HEX0,HEX1);
input [3:0]A,B; //vetores de 4 bits
input TE;
output [0:6] HEX0, HEX1; //saida em 2 display
wire [3:0] S, TS;
somador1bit B0(A[0],B[0],TE,S[0],TS[0]);
somador1bit B1(A[1],B[1],TS[0],S[1],TS[1]);
somador1bit B2(A[2],B[2],TS[1],S[2],TS[2]);
somador1bit B3(A[3],B[3],TS[2],S[3],TS[3]);
wire [4:0] resultado; //vetor de 5 bits
assign resultado = {TS[3],S[3],S[2],S[1],S[0]}; //concatena em 5 bits
wire [3:0] dez, unid;
assign dez = resultado/10; //divisão será nosso display da dezena
assign unid = resultado%10; //resto da divisão será o display da unidade
//abaixo chamamos nosso decodificador
decodificador BCD_0(unid,HEX0); //decodificador para display da unidade
decodificador BCD_1(dez,HEX1); //decodificador para display da dezena
endmodule
Você deve estar achando estranho a variável "dez" receber o resultado da divisão de um binário de 4 bits pelo decimal 10. Sim, a linguagem consegue dividir binário por decimal e armazenar a resposta correta em binário, o mesmo acontece para pegar o resto da divisão. O decodificador usado para o somador de 4 bits é o mesmo do somador de 1 bit. Já o somador1bit utilizado foi modificado para atender o somador de 4 bits:
module somador1bit (X,Y,TE,S,TS);
input X,Y,TE;
output S, TS;
assign S= X^Y^TE;
assign TS=(X&Y) | (X&TE) | (Y&TE);
endmodule
Próxima aula, clique aqui.
COMENTÁRIOS