script async='async' crossorigin='anonymous' src='https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-6016566166623052'/> Verilog coding: 3-bit Magnitude Comparator using logic gates

Thursday, 23 February 2023

3-bit Magnitude Comparator using logic gates

3-bit Magnitude Comparator using logic gates

A 3-bit comparator which is designed using logic gates E.g.  XNOR, OR, AND etc. 

The code was tested using  a test-bench code which tested the design for all the 81 combinations of inputs.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity comparator is
port( a,b : in unsigned(2 downto 0);  --3 bit numbers that are to be compared
        a_equal_b   : out std_logic;  --a is equal to b
        a_less_b    : out std_logic;  --a is less than b
        a_greater_b : out std_logic   --a is greater than b
      );    
end comparator;

architecture gate_level of comparator is

signal w1,w2,w3,w4,w5,w6,w7,w8,w: std_logic := '0';

BEGIN

w<= not(a(2) xor b(2));  --XNOR-gate with 2 inputs.
w<= not(a(1) xor b(1));  --XNOR-gate with 2 inputs.
w<= not(a(0) xor b(0));  --XNOR-gate with 2 inputs.
w<= (not a(2)) and b(2);
w<= (not a(1)) and b(1);
w<= (not a(0)) and b(0);
w<= a(2) and (not b(2));
w<= a(1) and (not b(1));
w<= a(0) and (not b(0));

a_equal_b <= wand wand w3;  --  a is equals to b.
a_less_b <= wor (wand w5) or (wand wand w6); -- a is less than b
a_greater_b <= wor (wand w8) or (wand wand w9); -- a is greater than b

end gate_level;

Test-bench code:

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;

ENTITY t_b IS
END t_b;

ARCHITECTURE behavior OF t_b IS
   --Inputs
   signal a : unsigned(2 downto 0) := (others => '0');
   signal b : unsigned(2 downto 0) := (others => '0');
    --Outputs
   signal a_equal_b : std_logic;
   signal a_less_b : std_logic;
   signal a_greater_b : std_logic;

    signal x,y : integer;

BEGIN

   uut: entity work.comparator PORT MAP (
          a => a,
          b => b,
          a_equal_b => a_equal_b,
          a_less_b => a_less_b,
          a_greater_b => a_greater_b
        );

   stim_proc: process
   begin       
        for x in 0 to 8 loop
            for y in 0 to 8 loop
                a <= to_unsigned(x,3);
                b <= to_unsigned(y,3);
                wait for 10 ns;
            end loop;
        end loop;  
   end process;

END;

No comments:

Post a Comment