Tutorial de Verilog: Conversor de Código Gray para Código Binário

Código Gray para Código Binário
Este post faz parte da série Tutorial de Verilog

No post anterior apresentei um Conversor de Código Binário para Código Gray, expliquei brevemente como funciona o Código Gray e qual foi a sacada de seu criador, Frank Gray, mostrei um circuito digital que pode converter números em código binários em código Gray e apresentei dois códigos em Verilog, para um conversor 4-bits e para um conversor 8-bits. Neste post mostro então a direção contrária. Vou desenvolver nesse texto um Conversor de Código Gray para Código Binário.

Abaixo está disposta uma tabela que mostra um conversor de codificação Gray para binário para 4-bits. É a mesma tabela mostrada no post anterior, mas com ordem inversa.

Representação do Circuito Conversor de Código Gray 4-bits para Binário com portas lógicas digitais

Para representar o circuito conversor de Gray para binário, basta utilizarmos portas XOR, conectando a saída do bit seguinte à entrada da XOR responsável pelo bit anterior, conforme ilustrado no circuito abaixo. Isso é o mesmo que aplicar a porta XOR para os dois bits significativo, uma porta XOR para os três bits mais significativos e assim por diante.

Código Gray para Código Binário
Figura 2: Representação do Circuito Conversor de Código Gray 4-bits para Binário

Representação do Conversor de Código Gray 4-bits para Binário em Verilog

// Embarcados - Use como quiser e de os creditos
// Exemplo de Implementacao de um conversor gray para binario 4 bits
// Thiago Lima - 15/11/2015
module gray_binario( gray, binario );

input       [3:0] gray;
output reg  [3:0] binario;

always@(*)
begin
	binario[3] = gray[3];
	binario[2] = gray[3] ^ gray[2];
	binario[1] = gray[3] ^ gray[2] ^ gray[1];
	binario[0] = gray[3] ^ gray[2] ^ gray[1]  ^ gray[0];
end
endmodule
 

Comentários sobre o código

Nesse código mostro que a implementação com XORs é dependente de todos os bits de entrada para o bit menos significativo do sinal de saída e que o bit mais significativo para o sinal de entrada é igual ao bit mais significativo para o sinal de saída. Veja que todos os bits da saída são independentes dos bits de saída, apenas dependem dos bits de entrada.

Outra forma de escrever o mesmo código

// Embarcados - Use como quiser e de os creditos
// Exemplo de Implementacao de um conversor gray para binario 4 bits
// Thiago Lima - 15/11/2015
module gray_binario( gray, binario );

input 	    [3:0] gray;
output reg  [3:0] binario;

always@(*)
begin

	binario[3] = gray[3];
	binario[2] <= binario[3] ^ gray[2];
	binario[1] <= binario[2] ^ gray[1];
	binario[0] <= binario[1] ^ gray[0];

end
endmodule

Comentários sobre o código

Neste caso represento o circuito exatamente conforme a figura deste post. A entrada do anterior faz parte do XOR do bit menos significativo que vem em seguida. Isso só é possível com o uso do operador <=. Com isso, a sequência de ações é respeitada. A saída é gerada e depois aplicada ao XOR seguinte. 

Testbench para o Conversor de Código Gray 4-bits para Binário

//Verilog Code for Conversor Gray Binario 4 bits
//by Thiago Lima

module gray_binario_tb;

reg [3:0] gray_tb;
wire [3:0] binario_tb;
integer i;

gray_binario dut( gray_tb, binario_tb );

initial
begin
 $display("binario | gray ", binario_tb, gray_tb);
 for (i = 0; i < 16; i = i + 1) 
 begin
 gray_tb = i; #1
 $display("%b %b", binario_tb, gray_tb);
 end
end
endmodule

Forma de Onda resultante do teste

A forma de onda resultante foi de acordo com o esperado, conforme a primeira imagem, que ilustra a conversão entre código Gray para Código Binário.

Código Gray para Código Binário
Figura 3: Conversor de Código Gray 4-bits para Binário – Forma de Onda resultante
Código Gray para Código Binário
Figura 4: Conversor de Código Gray 4-bits para Binário – Forma de Onda resultante

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

O segundo projeto pode ser baixado clicando na imagem abaixo:

download_proteus_arduino_lcd

Representação do Circuito Conversor de Código Gray 8-bits para Binário com portas lógicas digitais

Da mesma forma que fizemos com o circuito anterior, basta acrescentar mais quatro entradas e saídas e continuar a conectar as portas lógicas XOR da mesma forma que antes até que se tenha o circuito abaixo:

Código Gray para Código Binário
Figura 5: Representação do Circuito Conversor de Código Gray 8-bits para Binário

Representação do Conversor de Código Binário 8-bits para Gray em Verilog

// Embarcados - Use como quiser e de os creditos
// Exemplo de Implementacao de um conversor gray para binario 8 bits
// Thiago Lima - 15/11/2015
module gray_binario( gray, binario );

input [7:0] gray;
output reg [7:0] binario;

always@(*)
begin

 binario[7] = gray[7];
 binario[6] <= binario[7] ^ gray[6];
 binario[5] <= binario[6] ^ gray[5];
 binario[4] <= binario[5] ^ gray[4];
 binario[3] <= binario[4] ^ gray[3];
 binario[2] <= binario[3] ^ gray[2];
 binario[1] <= binario[2] ^ gray[1];
 binario[0] <= binario[1] ^ gray[0];

end
endmodule

Comentários sobre o código

Implementei o código com formato comportamental (behavioral), que diz que o código representa as ações que ele deseja tomar. No bloco de always usei o Asterisco, que indica que na mudança de qualquer sinal de entrada, o bloco always executaria. O circuito foi desenvolvido com operações ^, mas poderia ser escrito com portas logicas XOR.

Testbench para o Conversor de Código Binário 8-bits para Gray

//Verilog Code for Conversor Gray Binario 8 bits
//by Thiago Lima

module gray_binario_tb;

reg [7:0] gray_tb;
wire [7:0] binario_tb;
integer i;

gray_binario dut( gray_tb, binario_tb );

initial
begin
 $display("binario | gray ", binario_tb, gray_tb);
 for (i = 0; i < 256; i = i + 1) 
 begin
 gray_tb = i; #1
 $display("%b %b", binario_tb, gray_tb);
 end
end
endmodule

Forma de Onda resultante do teste

A forma de onda resultante foi de acordo com o esperado. A inspeção do resultados foi totalmente visual. Isso é impraticável para grandes projetos. Vou explicar nos próximos posts como utilizar um arquivo com diversos sinais de entrada para que se possa aplicar esse vetor de testes ao circuito e se possa obter uma saída também comparável a um arquivo de entrada que possui esses resultados. Esse arquivo pode ser feito com qualquer software de alto nível e a vida do desenvolvedor muito mais prática.

Código Gray para Código Binário
Figura 6: Conversor de Código Gray 8-bits para Binário – Forma de Onda resultante

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

É isso ai pessoal, deixem seus comentários.

Tutorial de Verilog

Tutorial de Verilog: Conversor de Código Binário para Código Gray Tutorial de Verilog: Somador com Propagação do Carry – Somador Ripple-Carry
Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.
Comentários:
Notificações
Notificar
1 Comentário
recentes
antigos mais votados
Inline Feedbacks
View all comments
elder
elder
02/11/2020 15:28

nas imagens ta o contrario, indica binario para codigo gray.

Home » Hardware » Sistemas Digitais » Tutorial de Verilog: Conversor de Código Gray para Código Binário

EM DESTAQUE

WEBINARS

VEJA TAMBÉM

JUNTE-SE HOJE À COMUNIDADE EMBARCADOS

Talvez você goste: