UPDATE : A GENERIC VERSION OF THE CODE IS AVAILABLE HERE!
Gray codes are non-weighted codes, where two successive values differ only on one bit. Through this post, I want to share two simple gate level VHDL codes for converting binary number to Gray and vice versa.
Do you notice a pattern in how the output bits are calculated. What do you think of of an n-bit converter? For learning purposes, try implementing an n-bit version of the above designs.
Logic circuit for 4 bit Binary to Gray code converter:
Logic circuit for 4 bit Gray code to Binary converter:
VHDL Code for Binary to Gray code conversion:
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
entity bin2gray is
port( bin : in std_logic_vector(3 downto 0); --binary input
G : out std_logic_vector(3 downto 0) --gray code output
);
end bin2gray;
architecture gate_level of bin2gray is
begin
--xor gates.
G(3) <= bin(3);
G(2) <= bin(3) xor bin(2);
G(1) <= bin(2) xor bin(1);
G(0) <= bin(1) xor bin(0);
end;
USE ieee.std_logic_1164.ALL;
entity bin2gray is
port( bin : in std_logic_vector(3 downto 0); --binary input
G : out std_logic_vector(3 downto 0) --gray code output
);
end bin2gray;
architecture gate_level of bin2gray is
begin
--xor gates.
G(3) <= bin(3);
G(2) <= bin(3) xor bin(2);
G(1) <= bin(2) xor bin(1);
G(0) <= bin(1) xor bin(0);
end;
VHDL Code for Gray code to Binary conversion:
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
entity gray2bin is
port( G : in std_logic_vector(3 downto 0); --gray code input
bin : out std_logic_vector(3 downto 0) --binary output
);
end gray2bin;
architecture gate_level of gray2bin is
begin
--xor gates.
bin(3) <= G(3);
bin(2) <= G(3) xor G(2);
bin(1) <= G(3) xor G(2) xor G(1);
bin(0) <= G(3) xor G(2) xor G(1) xor G(0);
end;
USE ieee.std_logic_1164.ALL;
entity gray2bin is
port( G : in std_logic_vector(3 downto 0); --gray code input
bin : out std_logic_vector(3 downto 0) --binary output
);
end gray2bin;
architecture gate_level of gray2bin is
begin
--xor gates.
bin(3) <= G(3);
bin(2) <= G(3) xor G(2);
bin(1) <= G(3) xor G(2) xor G(1);
bin(0) <= G(3) xor G(2) xor G(1) xor G(0);
end;
Single Testbench for both the designs:
library ieee;
use ieee.std_logic_1164.all;
entity tb is
end tb;
architecture behavior of tb is
-- component declaration for the unit under test's (uut)
component bin2gray is
port( bin : in std_logic_vector(3 downto 0);
g : out std_logic_vector(3 downto 0)
);
end component;
component gray2bin is
port( g : in std_logic_vector(3 downto 0);
bin : out std_logic_vector(3 downto 0)
);
end component;
signal bin,g,bin_out : std_logic_vector(3 downto 0) := (others => '0');
begin
-- instantiate the unit under test's (uut)
uut1: bin2gray port map (
bin => bin,
g => g
);
uut2: gray2bin port map (
g => g,
bin => bin_out
);
-- stimulus process
stim_proc: process
begin
bin <= "0000"; wait for 10 ns;
bin <= "0001"; wait for 10 ns;
bin <= "0010"; wait for 10 ns;
bin <= "0011"; wait for 10 ns;
bin <= "0100"; wait for 10 ns;
bin <= "0101"; wait for 10 ns;
bin <= "0110"; wait for 10 ns;
bin <= "0111"; wait for 10 ns;
bin <= "1000"; wait for 10 ns;
bin <= "1001"; wait for 10 ns;
bin <= "1010"; wait for 10 ns;
bin <= "1011"; wait for 10 ns;
bin <= "1100"; wait for 10 ns;
bin <= "1101"; wait for 10 ns;
bin <= "1110"; wait for 10 ns;
bin <= "1111"; wait for 10 ns;
wait;
end process;
end;
use ieee.std_logic_1164.all;
entity tb is
end tb;
architecture behavior of tb is
-- component declaration for the unit under test's (uut)
component bin2gray is
port( bin : in std_logic_vector(3 downto 0);
g : out std_logic_vector(3 downto 0)
);
end component;
component gray2bin is
port( g : in std_logic_vector(3 downto 0);
bin : out std_logic_vector(3 downto 0)
);
end component;
signal bin,g,bin_out : std_logic_vector(3 downto 0) := (others => '0');
begin
-- instantiate the unit under test's (uut)
uut1: bin2gray port map (
bin => bin,
g => g
);
uut2: gray2bin port map (
g => g,
bin => bin_out
);
-- stimulus process
stim_proc: process
begin
bin <= "0000"; wait for 10 ns;
bin <= "0001"; wait for 10 ns;
bin <= "0010"; wait for 10 ns;
bin <= "0011"; wait for 10 ns;
bin <= "0100"; wait for 10 ns;
bin <= "0101"; wait for 10 ns;
bin <= "0110"; wait for 10 ns;
bin <= "0111"; wait for 10 ns;
bin <= "1000"; wait for 10 ns;
bin <= "1001"; wait for 10 ns;
bin <= "1010"; wait for 10 ns;
bin <= "1011"; wait for 10 ns;
bin <= "1100"; wait for 10 ns;
bin <= "1101"; wait for 10 ns;
bin <= "1110"; wait for 10 ns;
bin <= "1111"; wait for 10 ns;
wait;
end process;
end;
Simulation Waveform:
The code was simulated using Xilinx ISE 14.6 tool. The following waveform verifies the correctness of both the designs. The output of binary to gray entity is connected as input of gray to binary converter. As you can see the bin and bin_out signals are the same. This verifies that the codes are working well.
Do you notice a pattern in how the output bits are calculated. What do you think of of an n-bit converter? For learning purposes, try implementing an n-bit version of the above designs.
No comments:
Post a Comment