Übungen der VHDL-Einführung
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

alu.vhd 3.6KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. -- Importiere die notwendigen Bibliotheken
  2. library IEEE;
  3. use IEEE.STD_LOGIC_1164.ALL;
  4. use IEEE.NUMERIC_STD.ALL;
  5. -- Definiere eine ALU-Entity mit zwei Operanden, einem Opcode und einem Ergebnisausgang
  6. entity SimpleALU is
  7. Port (
  8. clk : in STD_LOGIC; -- Takt
  9. reset : in STD_LOGIC; -- Reset
  10. operand_a : in STD_LOGIC_VECTOR(3 downto 0); -- Erster Operand
  11. operand_b : in STD_LOGIC_VECTOR(3 downto 0); -- Zweiter Operand
  12. opcode : in STD_LOGIC_VECTOR(1 downto 0); -- Opcode, der die Operation bestimmt
  13. result_out : out STD_LOGIC_VECTOR(3 downto 0); -- Ergebnis der Operation
  14. flag_zero_out : out STD_LOGIC; -- Flag, das anzeigt, ob das Ergebnis null ist
  15. flag_or_out : out STD_LOGIC -- Flag, das anzeigt, ob eine Oder Operation bei den Operanden stattgefunden hat
  16. );
  17. end SimpleALU;
  18. -- Architekturdefinition der ALU
  19. architecture Behavioral of SimpleALU is
  20. -- Legen Sie das Signal STD_LOGIC_VECTOR reg_a an, in diesem soll spaeter der Eingang operand_a gespeichert werden
  21. -- Legen Sie das Signal STD_LOGIC_VECTOR reg_b an, in diesem soll spaeter der Eingang operand_b gespeichert werden
  22. -- Legen Sie das Signal STD_LOGIC_VECTOR reg_opcode an, in diesem soll spaeter der Eingang opcode gespeichert werden
  23. -- Legen Sie ein Signal flag_zero als STD_LOGIC an
  24. -- Legen Sie ein Signal result als STD_LOGIC_VECTOR der Laenge 4 an
  25. -- Legen Sie ein Signal reg_flag_zero als STD_LOGIC
  26. -- Legen Sie ein Signal reg_result als STD_LOGIC_VECTOR der Laenge von result an
  27. begin
  28. -- Prozess fuer die Eingangsregister reg_a, reg_b, reg_c
  29. -- Bei einem Reset sollen die Register den Wert 0 haben
  30. -- Ansonsten soll bei einer steigenden Flanke von clk der entsprechnde Eingang (entity) gespeichert werden
  31. input_register : process(reset,clk)
  32. begin
  33. end process input_register;
  34. -- Prozess, der die ALU-Operationen durchfuehrt
  35. alu_process: process(all)
  36. begin
  37. -- Anweisung fuer die Initialisierung fuer flag_zero mit dem Wert 0
  38. -- Entscheide basierend auf dem Opcode, welche Operation durchgefuehrt wird
  39. -- Wenn reg_opcode:
  40. -- 00 -> result = reg_a + reg_b
  41. -- 01 -> result = reg_a - reg_b
  42. -- 10 -> result = reg_a and reg_b
  43. -- 11 -> result = reg_a or reg_b
  44. -- Fuer diese Realisierung soll die case-Anweisung verwendet werden
  45. -- Anm. Bei Berechnungen Datentypen beachten (std_logic_vector kann nicht direkt verwendet werden sondern es muss erst gecastet werden - signed verwenden)
  46. -- ueberpruefe, ob das Ergebnis result null ist, und setze das flag_zero entsprechend (result = 0 dann 1 ansonsten 0)
  47. -- Fuer diese Realisierung soll die if-Anweisung verwendet werden
  48. end process alu_process;
  49. -- Prozess fuer die Ausgangssregister reg_result, reg_flag_zero
  50. -- Bei einem Reset sollen die Register den Wert 0 haben
  51. -- Ansonsten soll bei einer steigenden Flanke von clk das entsprechnde Signal aus dem alu_process zugewiesen werden
  52. -- Anweisung um das Signal reg_result dem Ausgang result_out zu zuweisen
  53. -- Anweisung um das Signal reg_flag_zero dem Ausgang flag_zero_out zu zuweisen
  54. -- Bedingte Signalzuweisung fuer 'flag_or_out' außerhalb des Prozesses
  55. -- Es soll anhand des Entity Eingang opcode mit einer With .. Select Anweisung der Ausgang flag_or_out gesetzt werden
  56. -- opcode von or Operation dann 1 ansonsten 0
  57. end Behavioral;