Einfacher 2-bit-Comparator

Der 2-bit-Comparator vergleicht zwei Bitpaare auf Äquivalenz und liefert logisch 1, wenn jeweils beide bits der Paare übereinstimmen, logisch 0 anderenfalls.

Top-Level-Modul eq2.vhd

Es hat zwei alternative Architekturen, da aber keine Konfiguration vorhanden ist, wird die letztere verwendet, welche den 2-bit-Comparator aus zwei 1-bit-Comparatoren aufbaut, der in einem anderen Modul implementiert ist.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
 
entity eq2 is
    Port ( a : in  STD_LOGIC_VECTOR (1 downto 0);
           b : in  STD_LOGIC_VECTOR (1 downto 0);
           aeqb : out  STD_LOGIC);
end eq2;
 
architecture sop_arch of eq2 is
  signal p0, p1, p2, p3: std_logic;
begin
  aeqb <= p0 or p1 or p2 or p3;
 
  p0 <= ((not a(1)) and (not b(1))) and ((not a(0)) and (not b(0)));
  p1 <= ((not a(1)) and (not b(1))) and (a(0) and b(0));
  p2 <= (a(1) and b(1)) and ((not a(0)) and (not b(0)));
  p3 <= (a(1) and b(1)) and (a(0) and b(0));
end sop_arch;
 
architecture struc_arch of eq2 is
  signal e0, e1: std_logic;
begin
  eq_bit0_unit: entity work.eq1(sop_arch) port map (i0 => a(0), i1 => b(0), eq => e0);
  eq_bit1_unit: entity work.eq1(sop_arch) port map (i0 => a(1), i1 => b(1), eq => e1);
 
  aeqb <= e0 and e1;
end struc_arch;
2009/05/22 10:13 · Niels Böhm

User-Constraints-File eq2.ucf für Nexys 2

Die Eingänge sind an die Schiebeschaltern SW0, SW1 bzw. SW4 und SW5 gelegt und der Ausgang steuert die LED LD0 an.

NET "a[0]" LOC = G18;
NET "a[1]" LOC = H18;
NET "aeqb" LOC = J14;
NET "b[0]" LOC = L14;
NET "b[1]" LOC = L13;
2009/05/22 10:18 · Niels Böhm

Modul eq1.vhd

Hier wird der 1-bit-Comparator implementiert, der in der hierarchischen Struktur von eq2 instantiiert wird.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
 
entity eq1 is
    Port ( i0 : in  STD_LOGIC;
           i1 : in  STD_LOGIC;
           eq : out  STD_LOGIC);
end eq1;
 
architecture sop_arch of eq1 is
  signal p0, p1: std_logic;
begin
  eq <= p0 or p1;
 
  p0 <= (not i0) and (not i1);
  p1 <= i0 and i1;
end sop_arch;
2009/05/22 10:38 · Niels Böhm

Testbench eq2_testbench.vhd

Testumgebung für die Simulation, die sieben verschiedene Eingabestimuli erzeugt.

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
 
ENTITY eq2_testbench IS
END eq2_testbench;
 
ARCHITECTURE behavior OF eq2_testbench IS 
 
    -- Component Declaration for the Unit Under Test (UUT)
 
    COMPONENT eq2
    PORT(
         a : IN  std_logic_vector(1 downto 0);
         b : IN  std_logic_vector(1 downto 0);
         aeqb : OUT  std_logic
        );
    END COMPONENT;
 
 
   --Inputs
   signal test_in0 : std_logic_vector(1 downto 0) := (others => '0');
   signal test_in1 : std_logic_vector(1 downto 0) := (others => '0');
 
 	--Outputs
   signal test_out : std_logic;
 
  for uut: eq2 use entity work.eq2(struc_arch);
BEGIN
 
	-- Instantiate the Unit Under Test (UUT)
   uut: eq2 PORT MAP (
          a => test_in0,
          b => test_in1,
          aeqb => test_out
        );
 
 
   -- Stimulus process
   stim_proc: process
   begin		
      test_in0 <= "00";
      test_in1 <= "00";
      wait for 200 ns;
 
      test_in0 <= "01";
      test_in1 <= "00";
      wait for 200 ns;
 
      test_in0 <= "01";
      test_in1 <= "11";
      wait for 200 ns;
 
      test_in0 <= "10";
      test_in1 <= "10";
      wait for 200 ns;
 
      test_in0 <= "10";
      test_in1 <= "00";
      wait for 200 ns;
 
      test_in0 <= "11";
      test_in1 <= "11";
      wait for 200 ns;
 
      test_in0 <= "11";
      test_in1 <= "01";
      wait for 200 ns;
 
      wait;
   end process;
 
END;
2009/05/22 10:40 · Niels Böhm

Diskussion

scruffy, 2009/05/22 11:50

Warum gibt es überhaupt zwei architekturen? schließlich ist doch bereits bekannt auf welcher „hardware“ die schaltung implementiert wird.

Niels Böhm, 2009/05/22 11:57

Naja, das muss nicht sein. HDLs sind nicht so portabel wie es im Idealfall sein sollte. Es kann schon sinnvoll sein, für mehrere target devices unterschiedliche architectures zu implementieren.

Das ist allerdings nicht unbedingt der Hauptanwendungsfall von mehreren architectures. Der Punkt ist, dass HDLs für verschiedene Sachen im Entwurfsprozess eingesetzt werden können, und die erfordern teilweise stark abweichende Implementationen. Z.B. Synthese (also z.B. die Beschreibung zum Programmieren eines FPGA platzieren und routen lassen) im Gegensatz zu Simulation. Und da gibt es noch viel mehr Anwendungsfälle.

Außerdem kann es sein, dass man vielleicht mehrere verschiedene Implementationen ausprobieren möchte, und wann man dafür mehrere Architekturen schreibt, kann man die später einfach durch Konfiguration auswählen.

scruffy, 2009/05/22 11:59

1) d.h. dass die simulation ledeglich eine architektur tester und eine andere architektur dann zum einsatz kommt? 2) wie erfolgt eine „konfiguration“

Niels Böhm, 2009/05/22 12:06

1) Du kannst sowohl für die Simulation als auch für die Synthese festlegen, welche der implementierten Architekturen verwendet werden.

2) Es gibt direkt configuration blöcke, die man in ein Source-file packt, und die das festlegen. Wahrscheinlich gibt es noch andere Möglichkeiten, solche Konfigurationen festzulegen, das hat mich aber noch nicht weiter interessiert, deswegen hab ich mich damit nicht beschäftigt.

scruffy, 2009/05/22 11:57

kann es sein, das eq2 zwei mal implementiert ist und eq1 garnicht. unter geschickter belegung von eq2 lässt sich sicher ein eq1 simulieren, aber das dürfte sicher nicht im sinne de erfinder sein? mfg scruffy

Niels Böhm, 2009/05/22 12:07

das ist ein copy&paste-fehler von mir

Geben Sie Ihren Kommentar ein (Wiki-Syntax ist zugelassen):
 
fpga/comparator/start.txt · Zuletzt geändert: 2010/01/14 23:32 (Externe Bearbeitung)
 
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki