|
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- -- Importiere die notwendigen Bibliotheken
- library IEEE;
- use IEEE.STD_LOGIC_1164.ALL;
- use IEEE.NUMERIC_STD.ALL;
-
- -- Definiere eine ALU-Entity mit zwei Operanden, einem Opcode und einem Ergebnisausgang
- entity SimpleALU is
- Port (
- clk : in STD_LOGIC; -- Takt
- reset : in STD_LOGIC; -- Reset
- operand_a : in STD_LOGIC_VECTOR(3 downto 0); -- Erster Operand
- operand_b : in STD_LOGIC_VECTOR(3 downto 0); -- Zweiter Operand
- opcode : in STD_LOGIC_VECTOR(1 downto 0); -- Opcode, der die Operation bestimmt
- result_out : out STD_LOGIC_VECTOR(3 downto 0); -- Ergebnis der Operation
- flag_zero_out : out STD_LOGIC; -- Flag, das anzeigt, ob das Ergebnis null ist
- flag_or_out : out STD_LOGIC -- Flag, das anzeigt, ob eine Oder Operation bei den Operanden stattgefunden hat
- );
- end SimpleALU;
-
- -- Architekturdefinition der ALU
- architecture Behavioral of SimpleALU is
-
- -- Legen Sie das Signal STD_LOGIC_VECTOR reg_a an, in diesem soll spaeter der Eingang operand_a gespeichert werden
-
- -- Legen Sie das Signal STD_LOGIC_VECTOR reg_b an, in diesem soll spaeter der Eingang operand_b gespeichert werden
-
- -- Legen Sie das Signal STD_LOGIC_VECTOR reg_opcode an, in diesem soll spaeter der Eingang opcode gespeichert werden
-
- -- Legen Sie ein Signal flag_zero als STD_LOGIC an
-
- -- Legen Sie ein Signal result als STD_LOGIC_VECTOR der Laenge 4 an
-
- -- Legen Sie ein Signal reg_flag_zero als STD_LOGIC
-
- -- Legen Sie ein Signal reg_result als STD_LOGIC_VECTOR der Laenge von result an
-
- begin
-
- -- Prozess fuer die Eingangsregister reg_a, reg_b, reg_c
- -- Bei einem Reset sollen die Register den Wert 0 haben
- -- Ansonsten soll bei einer steigenden Flanke von clk der entsprechnde Eingang (entity) gespeichert werden
- input_register : process(reset,clk)
- begin
-
- end process input_register;
-
-
- -- Prozess, der die ALU-Operationen durchfuehrt
- alu_process: process(all)
- begin
- -- Anweisung fuer die Initialisierung fuer flag_zero mit dem Wert 0
-
- -- Entscheide basierend auf dem Opcode, welche Operation durchgefuehrt wird
- -- Wenn reg_opcode:
- -- 00 -> result = reg_a + reg_b
- -- 01 -> result = reg_a - reg_b
- -- 10 -> result = reg_a and reg_b
- -- 11 -> result = reg_a or reg_b
- -- Fuer diese Realisierung soll die case-Anweisung verwendet werden
- -- Anm. Bei Berechnungen Datentypen beachten (std_logic_vector kann nicht direkt verwendet werden sondern es muss erst gecastet werden - signed verwenden)
-
-
- -- ueberpruefe, ob das Ergebnis result null ist, und setze das flag_zero entsprechend (result = 0 dann 1 ansonsten 0)
- -- Fuer diese Realisierung soll die if-Anweisung verwendet werden
-
-
- end process alu_process;
-
- -- Prozess fuer die Ausgangssregister reg_result, reg_flag_zero
- -- Bei einem Reset sollen die Register den Wert 0 haben
- -- Ansonsten soll bei einer steigenden Flanke von clk das entsprechnde Signal aus dem alu_process zugewiesen werden
-
-
- -- Anweisung um das Signal reg_result dem Ausgang result_out zu zuweisen
-
-
- -- Anweisung um das Signal reg_flag_zero dem Ausgang flag_zero_out zu zuweisen
-
-
- -- Bedingte Signalzuweisung fuer 'flag_or_out' außerhalb des Prozesses
- -- Es soll anhand des Entity Eingang opcode mit einer With .. Select Anweisung der Ausgang flag_or_out gesetzt werden
- -- opcode von or Operation dann 1 ansonsten 0
-
-
- end Behavioral;
|