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.
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.
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.
Caso queira reproduzir o teste feito acima, faça Download do Projeto para o Quartus da Altera e aperte o play:
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:
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.
Caso queira reproduzir o teste feito acima, faça Download do Projeto para o Quartus da Altera e aperte o play:
Baixe também a tabela com os resultados dessa conversão. Ela está disponível na planilha abaixo.








