Ü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.

fft_magnitude_calc.vhd 5.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. ------------------------------------------------------------------------
  2. -- fft_magnitude_calc
  3. --
  4. -- calculation of FFT magnitude sqrt(real_part²+im_part²)
  5. -- Inputs:
  6. -- input_re in: +-1 signed Fixpoint (0.5=0x40000000, -0.5=0xC0000000 (negative numbers in 2K)
  7. -- input_im in: +-1 signed Fixpoint (0.5=0x40000000, -0.5=0xC0000000 (negative numbers in 2K)
  8. -- input_valid: high = inputs are valid for data processing
  9. -- Outputs
  10. -- output_magnitude: Fixpoint 0.5=0x40000000 (always positive)
  11. -- output_valid: high = magnitude data is valid
  12. -----------------------------------------------------------------------
  13. library ieee;
  14. use ieee.std_logic_1164.all;
  15. use ieee.numeric_std.all;
  16. entity fft_magnitude_calc is
  17. port (
  18. clk : in std_logic; -- Takt
  19. reset : in std_logic; -- Reset
  20. input_valid: in std_logic; -- Eingangsdaten gueltig
  21. input_re : in std_logic_vector( 31 downto 0 ); -- Realteil in Fixpoint
  22. input_im : in std_logic_vector( 31 downto 0 ); -- Imaginaerteil in Fixpoint
  23. output_valid : out std_logic; -- Ausgangsdaten gueltig
  24. output_magnitude : out std_logic_vector( 31 downto 0 ) -- Berechnete magnitude
  25. );
  26. end entity fft_magnitude_calc;
  27. architecture rtl of fft_magnitude_calc is
  28. -- Zustaende fuer die Zustandsmaschine fuer die Berechnung
  29. type CalcState is (
  30. CALC_IDLE, -- Zustand Leerlauf
  31. CALC_MULTIPLY, -- Zustand Berechnung real_part² und im_part²
  32. CALC_ADD, -- Zustand Berecnung Addition real_part²+im_part²
  33. CALC_SQRT, -- Zustand Berechnung der sqrt(real_part²+im_part²)
  34. CALC_STORE_RESULT -- Zustand Setzen von output_valid und output_magnitude
  35. );
  36. -- Legen Sie die Signale current_calc_state und next_calc_state fuer die Zustandsmaschine CalcState an
  37. -- Legen Sie die Signale re_multiply_re und im_multiply_im als signed (63 downto 0) an
  38. -- Legen Sie die Signal re2_add_im2 als signed (63 downto 0) an
  39. -- Legen Sie die Signal output_sqrt als std_logic_vector (31 downto 0) an
  40. -- Legen Sie die Signal output_sqrt als std_logic_vector (15 downto 0) an
  41. -- Legen Sie das Signal start_sqrt_calc als std_logic an
  42. -- Legen Sie das Signal sqrt_out_valid_flag als std_logic an
  43. begin
  44. -- uebergangsschaltnetz der Zustandsmaschine fuer die Berechnung (Strukturvariante 2 Process Zustandsmaschine)
  45. -- Beschreiben Sie den Prozess fuer das uebergangsschaltnetz (Case-Anweisung)
  46. -- CALC_IDLE -> CALC_MULTIPLY wenn input_valid = 1
  47. -- CALC_MULTIPLY -> CALC_ADD
  48. -- CALC_ADD -> CALC_SQRT
  49. -- CALC_SQRT -> CALC_STORE_RESULT wenn sqrt_out_valid_flag = 1
  50. -- CALC_STORE_RESULT -> CALC_IDLE
  51. calc_state_transitions : process ( all ) is
  52. begin
  53. end process calc_state_transitions;
  54. -- Zustandsspeicher und Ausgangsschaltnetz zu der Steuerung der Berechnung (Strukturvariante 2 Process Zustandsmaschine)
  55. sync : process ( clk, reset ) is
  56. begin
  57. -- Der Prozess steuert folgende Signale setzen Sie fuer alle passende Resetwerte
  58. -- current_calc_state
  59. -- re_multiply_re
  60. -- im_multiply_im
  61. -- re2_add_im2
  62. -- input_sqrt
  63. -- start_sqrt_calc
  64. -- output_valid
  65. -- output_magnitude
  66. if ( reset = '1' ) then
  67. elsif ( rising_edge( clk ) ) then
  68. -- Machen Sie Anweisungen um start_sqrt_calc und output_valid auf 0 zu setzen
  69. -- Realisieren Sie den Zustandsspeicher current_calc_state
  70. -- Vervollstaendigen Sie das Ausgangsschaltnetz
  71. case next_calc_state is
  72. when CALC_IDLE=> null;
  73. -- calculation of real_part² and im_part²
  74. -- Anweisung fuer die Berechnung von re_multiply_re = input_re² (Datentypen beachten)
  75. -- Anweisung fuer die Berechnung von im_multiply_im = input_im² (Datentypen beachten)
  76. when CALC_MULTIPLY =>
  77. -- calculation of real_part²*+im_part²
  78. -- Anweisung fuer die Berechnung von re2_add_im2 = re_multiply_re + im_multiply_im
  79. when CALC_ADD =>
  80. -- calculation of sqrt(real_part²+im_part²)
  81. -- Anweisung um input_sqrt mit den obersten 32-Bit von re2_add_im2 zu belegen (Datentypen beachten)
  82. -- Anweisung um start_sqrt_calc mit 1 zu setzen
  83. when CALC_SQRT =>
  84. -- Setzen der Entity-Ausgaenge
  85. -- Anweisung um die obersten 16 bit von output_magnitude mit output_sqrt zu setzen und die untern 16 Bit mit 0
  86. -- Anweisung um output_valid mit 1 zu setzen
  87. when CALC_STORE_RESULT =>
  88. when others => NUll;
  89. end case;
  90. end if;
  91. end process sync;
  92. -- Instanziierung des SQRT Moduls fuer die Berechnung der Quardratwurzel
  93. -- Weisen Sie die Signale output_sqrt, reset, input_sqrt und clk richtig zu
  94. sqrt_module : entity work.squareRoot_pipe
  95. generic map (
  96. G_DATA_W => 32
  97. )
  98. port map (
  99. clk => ,
  100. rst => ,
  101. iv_data => ,
  102. ov_res =>
  103. );
  104. -- Dieser Prozess sorgt dafuer, dass 16 Takte nachdem start_sqrt_calc 1 geworden ist sqrt_out_valid_flag zu 1 wird
  105. -- Wird benoetigt um die Berechnungsdauer des sqrt_module anzueigen
  106. -- Hier muss nichts veraendert werden
  107. p_sqrt_out_valid_flag: process ( clk, reset ) is
  108. variable delay_sqrt_out_valid_flag : std_logic_vector(14 downto 0);
  109. begin
  110. if ( reset = '1' ) then
  111. sqrt_out_valid_flag <= '0';
  112. delay_sqrt_out_valid_flag := (others => '0');
  113. elsif ( rising_edge( clk ) ) then
  114. sqrt_out_valid_flag <= delay_sqrt_out_valid_flag(14);
  115. delay_sqrt_out_valid_flag := delay_sqrt_out_valid_flag(13 downto 0) & start_sqrt_calc;
  116. if sqrt_out_valid_flag = '1' then
  117. delay_sqrt_out_valid_flag := (others => '0');
  118. end if;
  119. end if;
  120. end process p_sqrt_out_valid_flag;
  121. end architecture rtl;