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

Código Gray
Este post faz parte da série Tutorial de Verilog

Neste post dou sequência à série de artigos sobre sistemas digitais implementados em HDL, em especial Verilog. Vou abordar neste post o Código Gray, uma codificação inventada há muito tempo pelo físico americano Frank Gray, que trabalhou no Bell Labs, empresa famosa na história da Eletrônica, conforme pode conferir no post sobre a história do transistor por Francesco Sacco. Frank Gray inventou o código Gray em 1953, e o equipamento que fazia uso desse tipo de codificação que foi patenteada no mesmo ano. Podemos acessar o documento da patente nesse link e também conhecer mais sobre o código Gray e como a máquina foi desenvolvida. 

Abaixo está explicada a ideia de Frank, em uma imagem retirada de sua patente. Para que se possa entender a ideia de Frank é necessário lembrar que ele patenteou um sistema mecânico e que o custo mecânico de uso de uma máquina com o código binário acabava sendo mais custoso para transições pequenas de sinais digitais transmitidos e recebidos por esses sistemas mecânicos. A ideia então com o Código Gray era fazer com que transições entre números adjacentes apenas impactassem apenas um bit.

Código Gray em Verilog: Patente de Frank Gray que representa a conversão de Código Binário para Código Gray.
Figura 1: Patente de Frank Gray que representa a conversão de Código Binário para Código Gray.

Abaixo está disposta uma tabela que mostra um conversor de codificação binária para Código Gray, para 4-bits. Veja que nas transições entre números adjacentes, apenas uma modificação é feita. Por exemplo, o número 2, decimal, é representado como 11 e não como 10 no código Gray. Isso tem um porque. Se o número 2 fosse 10, ele modificaria dois bits, pois o número anterior era 01, mudando de 1 para zero no bit 1 e de zero para 1 no bit 0.

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

Para representar o circuito conversor de binário para Gray, basta utilizarmos portas XOR em bits adjacentes. Abaixo está disposto o circuito que é capaz de converter de binário para Gray.

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

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

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

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

always@(*)
begin

	gray[3] = binario[3];
	gray[2] = binario[3] ^ binario[2];
	gray[1] = binario[2] ^ binario[1];
	gray[0] = binario[1] ^ binario[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 4-bits para Código Gray:

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

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

binario_gray dut( binario_tb, gray_tb );

initial
begin
	$display("binario  |  gray ", binario_tb, gray_tb);
	for (i = 0; i < 16; i = i + 1) 
	begin
		binario_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 Binário para Código Gray.

Código Gray em Verilog: Conversor de Código Binário 4-bits para Gray - Forma de Onda resultante
Figura 3: Conversor de Código Binário 4-bits para Gray – Forma de Onda resultante
Código Gray em Verilog: Conversor de Código Binário 4-bits para Gray - Forma de Onda resultante
Figura 4: Conversor de Código Binário 4-bits para Gray – 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

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

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

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

 

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

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

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

always@(*)
begin

   gray[7] = binario[7];
   gray[6] = binario[7] ^ binario[6];
   gray[5] = binario[6] ^ binario[5];
   gray[4] = binario[5] ^ binario[4];
   gray[3] = binario[4] ^ binario[3];
   gray[2] = binario[3] ^ binario[2];
   gray[1] = binario[2] ^ binario[1];
   gray[0] = binario[1] ^ binario[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 Código Gray:

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

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

binario_gray dut( binario_tb, gray_tb );

initial
begin
	$display("binario  |  gray ", binario_tb, gray_tb);
	for (i = 0; i < 256; i = i + 1) 
	begin
		binario_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 em Verilog
Figura 6: Conversor de Código Binário 8-bits para Gray – 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

Baixe também a tabela com os resultados dessa conversão. Ela está disponível na planilha abaixo.

download_proteus_arduino_lcd

Tutorial de Verilog

Tutorial de Verilog: Somador Completo (full adder) Tutorial de Verilog: Conversor de Código Gray para Código Binário
Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.
Comentários:
Inscrever-se
Notificar de
0 Comentários
mais recentes
mais antigos Mais votado
Home » Hardware » Sistemas Digitais » Tutorial de Verilog: Conversor de Código Binário para Código Gray

EM DESTAQUE

WEBINARS

VEJA TAMBÉM

JUNTE-SE HOJE À COMUNIDADE EMBARCADOS

Talvez você goste: