Der 2-bit-Comparator vergleicht zwei Bitpaare auf Äquivalenz und liefert logisch 1, wenn jeweils beide bits der Paare übereinstimmen, logisch 0 anderenfalls.
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;
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;
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;
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;
Diskussion
Warum gibt es überhaupt zwei architekturen? schließlich ist doch bereits bekannt auf welcher „hardware“ die schaltung implementiert wird.
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.
1) d.h. dass die simulation ledeglich eine architektur tester und eine andere architektur dann zum einsatz kommt? 2) wie erfolgt eine „konfiguration“
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.
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
das ist ein copy&paste-fehler von mir