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.