domingo, 25 de octubre de 2015

Convertidor de Código Binario a Gray en VHDL

Hola nuevamente! :) eh estado un poco desaparecida por estos lares, el día de hoy les dejo un programa de un Convertidor de Código Binario a Gray que realice en VHDL. 
Espero que sea de gran utilidad para ustedes, es un código muy sencillo y fácil de entender ;) cualquier duda o comentario es bienvenido. 

El código binario reflejado o código Gray, nombrado así en honor del investigador Frank Gray, es un sistema de numeración binario en el que dos valores sucesivos difieren solamente en uno de sus dígitos. El código Gray fue diseñado originalmente para prevenir señales ilegales (señales falsas o viciadas en la representación) de los switches electromecánicos, y actualmente es usado para facilitar la corrección de errores en los sistemas de comunicaciones, tales como algunos sistemas de televisión por cable y la televisión digital terrestre.
El Código Gray es un caso particular del sistema binario. Consiste en una ordenación de 2n números binarios de tal forma que cada número sólo tenga un dígito binario distinto a su predecesor. Esta técnica de codificación se originó cuando los circuitos lógicos digitales se realizaban con válvulas de vacío y dispositivos electromecánicos. Los contadores necesitaban potencias muy elevadas a la entrada y generaban picos de ruido cuando varios bits cambiaban simultáneamente. El uso de código Gray garantizó que en cualquier transición variaría tan sólo un bit. En la actualidad, el código Gray se sigue empleando para el diseño de cualquier circuito electrónico combinatorio, ya que el principio de diseño de buscar transiciones más simples y rápidas entre estados sigue vigente, a pesar de que los problemas de ruido y potencia se hayan reducido.
Es posible realizar esta conversión mediante una operación lógica XOR entre el número binario a convertir y el mismo número con un desplazamiento lógico a la derecha.

Objetivo

Realizar la descripción en VHDL del convertidor de código Binario a Gray mediante el algoritmo de conversión mencionado.

Tabla de Conversión

Código en VHDL

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity convertidor is
  Port (b : in bit_vector (7 downto 0);
           g : out bit_vector (7 downto 0));
end convertidor;
architecture Behavioral of convertidor is
begin
g <= b xor (b srl 1);
end Behavioral;


Código de Simulación 

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.all;
USE ieee.numeric_std.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
  
ENTITY sim IS
END sim;

ARCHITECTURE behavior OF sim IS
 -- Component Declaration for the Unit Under Test (UUT)
 COMPONENT convertidor
 PORT(  b : in bit_vector (7 downto 0);
       g : out  bit_vector (7 downto 0));
    END COMPONENT;
   
--Inputs
signal b :bit_vector(7 downto 0) := (others => '0');

--BiDirs
   signal g :  bit_vector (7 downto 0);
   -- No clocks detected in port list. Replace <clock> below with
   -- appropriate port name

BEGIN
 -- Instantiate the Unit Under Test (UUT)
   uut: convertidor

PORT MAP (
          b => b,
          g => g    );

  -- Stimulus process
   stim_proc: process
   begin         
      -- hold reset state for 100 ns.
     wait for 100 ns;    

--  wait for <clock>_period*10;

      -- insert stimulus here
                  
          b <= "00000000"; wait for 100 ns;
              b <= "00000001"; wait for 100 ns;
              b <= "00000010"; wait for 100 ns;
              b <= "00000011"; wait for 100 ns;
              b <= "00000100"; wait for 100 ns;
              b <= "00000101"; wait for 100 ns;               
              b <= "00000110"; wait for 100 ns;              
              b <= "00000111"; wait for 100 ns;               
              b <= "00001000"; wait for 100 ns;          
              b <= "00001001"; wait for 100 ns;         
              b <= "00001010"; wait for 100 ns;
              b <= "00001011"; wait for 100 ns;
              b <= "00001100"; wait for 100 ns;
              b <= "00001101"; wait for 100 ns;
              b <= "00001110"; wait for 100 ns;
              b <= "00001111"; wait for 100 ns;


           wait;
   end process; 
END;

Implementación del código en la tarjeta Spartan 3E

Con las siguientes imágenes se demuestra que el código funciona, podemos observar que el encendido de los leds corresponde al numero Gray correspondiente al Decimal. 

Implementación del convertidor para el número 3.

Convertidor binario a gray para el número 4.


En verdad espero que sea de gran utilidad este código, si necesitan ayuda pueden escribirme. Gracias por leerme y que tengan un gran día :).

Saludos a todos!!





3 comentarios:

  1. quisiera que me ayudaras en que programa desarrollastes el codigo, nose si me epxlico, se que es en vhdl peor en que software

    ResponderBorrar