Aula 5.3 - Comparador de 2 números de 4 bits usando comparador de 1 bit.
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 o projeto de um comparador de 2 números de 4 bits e responder se um é maior (ma), menor (me) ou igual (ig) ao outro.
Por exemplo: A é maior, menor ou igual a B?
A = 1011
B = 1001
Para este projeto vamos utilizar a descrição de fluxo de dados (visto na aula 5.2). Para facilita vamos primeiramente criar um comparador de 2 números de 1 bit, pois para o de 4 bits temos 8 entradas e 2^8 são 256 combinações para se comparar, enquanto que o de 1 bit são 2 entradas ou seja 2^2 são 4 combinações para se comparar.
Simplificando as expressões obtemos:
IGUAL = A xnor B
MAIOR = A and (not B)
MENOR = (not A) and B
Com essa informação podemos montar nosso código para o comparador de 1 bit.
module comparador_1bit (ig, ma, me, A, B, HAB);
input A, B, HAB;
output ig, ma, me;
assign ig = HAB & (A~^B); // A xnor B
assign ma = HAB & (A&(~B));
assign me = HAB & (~(A)&B);
endmodule
A variável "HAB"(abreviação de habilita) será útil para o comparador de 4 bits, portanto caso queira apenas um comparador de 1 bit ela pode assumir o valor 1 pois 1 and qualquer coisa é qualquer coisa.
Com nosso comparador de 1 bit pronto, agora podemos implementar um comparador de 4 bits.
module comparador_4bit(igual, maior, menor, A, B);
input [3:0] A, B; //vetor de 4 bits com o menos significativo à direita
output igual, maior, menor;
wire [3:0] aux_ig, aux_ma, aux_me; //conexão de 4 bits, variáveis auxiliares
comparador_1bit BL3(aux_ig[3], aux_ma[3], aux_me[3], A[3], B[3],1);
comparador_1bit BL2(aux_ig[2], aux_ma[2], aux_me[2], A[2], B[2],aux_ig[3]);
comparador_1bit BL1(aux_ig[1], aux_ma[1], aux_me[1], A[1], B[1],aux_ig[2]);
comparador_1bit BL0(aux_ig[0], aux_ma[0], aux_me[0], A[0], B[0],aux_ig[1]);
assign maior = | aux_ma; //realiza OR em todos bits do vetor aux_ma
assign menor = | aux_me; //realiza OR em todos bits do vetor aux_me
assign igual = aux_ig[0];
endmodule
A estrutura de um vetor de 4 bits é [3:0], sendo:
[3:0] com o bit menos significativo a direita.
[0:3] com o bit mais significativo a direita.
No comparador de 4 bits acima é feita a chamada ao modulo do comparador de 1 bit, utilizando conexão por lista ou seja as ligações são feitas na ordem. Assim dados de entradas são enviadas para o comparador_1bit que retorna nas saídas o resultado das operações lógicas.
No modulo comparador_1bit temos a seguinte ordem: (ig, ma, me, A, B, HAB) . Assim ao chamá-lo no comparador_4bit a ordem foi mantida em cada "BL" (bloco): (aux_ig[3], aux_ma[3], aux_me[3], A[3], B[3],1) .
Então será que nosso código funciona para o exemplo abaixo?
A é maior, menor ou igual a B?
A = 1011
B = 1001
Vamos conferir por partes!
Confira como ficou os dados nos "BL" blocos para o exemplo acima, em vermelho ilustra os dados de entrada e em verde os dados de saída do comparador_1bit:
BL3(1, 0, 0, 1, 1, 1);
BL2(1, 0, 0, 0, 0, 1);
BL1(0, 1, 0, 1, 0, 1);
BL0(0, 0, 0, 1, 1, 0);
Fazendo um OR em todos os bits de aux_ma (0 or 0 or 1 or 0) = 1.
Fazendo um OR em todos os bits de aux_me (0 or 0 or 0 or 0) = 0.
Pegando o valor de aux_ig na posição 0 temos que aux_ig[0] = 0.
COMENTÁRIOS