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.
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.
Caso queira reproduzir o teste feito acima, faça Download do Projeto para o Quartus da Altera e aperte o play:
O segundo projeto pode ser baixado clicando na imagem abaixo:
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:
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.
Caso queira reproduzir o teste feito acima, faça Download do Projeto para o Quartus da Altera e aperte o play:
É isso ai pessoal, deixem seus comentários.










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