Hallo, die Simulation zu meinem Quellcode, der einen FIR Filter implementieren soll, stoppt weit vor Ablauf der angegebenen Simulationszeit. Ich habe bereits in anderen Beiträgen gelesen, dass wahrscheinlich mein Quellcode verantwortlich ist, jedoch finde ich den Fehler nicht. Ich weiß, dass mein Code noch weit davon entfernt ist, perfekt zu sein, allerdings wollte ich in der Simulation nachvollziehen, ob meine Statemachine so hinhaut, wie sie soll. Vivado zeigt auch eine Warnung an, diese lautet: "[filemgmt 56-199] Attempt to get parsing info during refresh. "On-the-fly" syntax checking information may be incorrect. ["D:/Programme/Xilinx/Vivado/projects/FIR_eigen/FIR_eigen.srcs/sources_1 /new/fir_tiefpass.vhd":]" Damit kann ich allerdings nicht wirklich was anfangen. Zusätzlich hänge ich noch die Simulation an. Mein Ansatz wäre jetzt natürlich dort nachzusehen, wo die Simulation abbricht. In meinem Fall ist das im state "filter". Hier werden die Verschiebe- und Multiplikationsoperationen durchgeführt und eine Counter Variable wird hochgezählt. Ich verstehe allerdings nicht, wo hier der Fehler liegt. Zunächst der Code des Moduls:
1 | -- |
2 | --Implementierung der Direktform eines FIR - Tiefpasses |
3 | --Kennwerte: Abtastrate: 50 kHz |
4 | --f_Durchlass = 0,8kHz |
5 | --f_stopp: 5kHz bei delta_s = 20dB Absenkung |
6 | --passband Ripple = 0,1db |
7 | |
8 | library IEEE; |
9 | use IEEE.Std_logic_1164.all; |
10 | use IEEE.Numeric_Std.all; |
11 | use IEEE.math_real.all; |
12 | |
13 | |
14 | entity FIR_Test is |
15 | generic(N : integer := 10); --(Anzahl der Koeffizienten - 1) |
16 | port |
17 | ( |
18 | x_in : in std_logic_vector(11 downto 0); --Input 12 Bit vom AD Wandler |
19 | clk : in std_logic; --Input Clk mit hoher Frequenz |
20 | rst : in std_logic; --Reset Active Low |
21 | enable_data : in std_logic; --next Sample von ADC |
22 | data_acknowledged : in std_logic; --DA hat Daten erhalten |
23 | |
24 | filter_rdy : out std_logic; --Signalisiere dem DA ready. |
25 | y : out std_logic_vector(11 downto 0) --Output 12 Bit an den DA - Wandler |
26 | ); |
27 | end FIR_Test; |
28 | |
29 | architecture FIR_Test_arch of FIR_Test is |
30 | |
31 | type tap_line is array(0 to (N - 1)) of std_logic_vector(12 downto 0); --Typenerklärung: Array zum Verschieben |
32 | -- =(Zeitverzögern) des Inputs |
33 | |
34 | type table is array(0 to N) of signed(12 downto 0); --Typenerklärung: Array aus Filterkoeffizienten, |
35 | |
36 | |
37 | --States |
38 | type states is ( |
39 | waitForADC, |
40 | readData, |
41 | filter, |
42 | shiftToDA |
43 | ); |
44 | |
45 | signal x : tap_line; |
46 | constant coeff : table:= ( |
47 | "0" & X"085", |
48 | "0" & X"07F", |
49 | "0" & X"0A9", |
50 | "0" & X"0CD", |
51 | "0" & X"0E6", |
52 | "0" & X"0EE", |
53 | "0" & X"0E6", |
54 | "0" & X"0CD", |
55 | "0" & X"0A9", |
56 | "0" & X"07F", |
57 | "0" & X"085" |
58 | ); --Koeffiziententabelle, von a_10 bis a_0 |
59 | --Darstellung: signed 1.12 |
60 | |
61 | signal current_state : states := waitForADC; --Enthält den aktuellen Status, initialisiert mit "waitForADC" |
62 | signal filter_rdy_intern : std_logic := '0'; --Internes Signal für die fertige Filteroperation |
63 | signal data_read_ready : std_logic := '0'; --Daten einlesen fertig |
64 | signal DA_acknowledged : std_logic := '0'; --DA hat Daten erhalten |
65 | -- signal counter_filter : integer range 0 to 50; |
66 | |
67 | begin |
68 | |
69 | --Schreiben der Statemachine |
70 | write_statemachine : process(clk, rst) |
71 | begin |
72 | --Reset aktiv low |
73 | if (rst = '0') then |
74 | current_state <= waitForADC; |
75 | --Signaländerung bei steigender Flanke des 125MHz Clocks |
76 | elsif (rising_edge(clk)) then |
77 | if (enable_data = '1' and data_read_ready = '0' ) then --Nur 1x lesen |
78 | current_state <= readData; |
79 | elsif (data_read_ready = '1') then |
80 | current_state <= filter; |
81 | elsif (filter_rdy_intern = '1') then |
82 | current_state <= shiftToDA; |
83 | elsif (data_acknowledged = '1') then |
84 | current_state <= waitForADC; |
85 | else |
86 | NULL; |
87 | end if; |
88 | end if; |
89 | end process write_statemachine; |
90 | |
91 | --Durchführen der Operationen abhängig vom State |
92 | statemachine : process(clk) |
93 | variable sop : signed(25 downto 0); --Variable für Zwischenergebnis der Multiplikation, Darstellung 2.22 |
94 | variable counter_filter : integer range 0 to 20; |
95 | begin |
96 | if (rising_edge(clk)) then |
97 | case (current_state) is |
98 | when waitForADC => |
99 | filter_rdy_intern <= '0'; |
100 | data_read_ready <= '0'; |
101 | sop := (others => '0'); |
102 | counter_filter := 0; |
103 | when readData => |
104 | x(0) <= "0" & x_in; --Neues Datum einlesen |
105 | data_read_ready <= '1'; |
106 | when filter => |
107 | if (counter_filter < 12) then |
108 | sop := sop + coeff(counter_filter - 1) * signed(x(counter_filter - 1)); --Durchführung einer Multiplikation und einer Addition |
109 | x(counter_filter) <= x(counter_filter - 1); --Zeitverschiebung |
110 | else |
111 | filter_rdy_intern <= '1'; |
112 | end if; |
113 | counter_filter := counter_filter + 1; |
114 | when shiftToDA => |
115 | y <= std_logic_vector(sop(22 downto 11)); |
116 | filter_rdy <= '1'; |
117 | end case; |
118 | else |
119 | NULL; |
120 | end if; |
121 | |
122 | end process statemachine; |
123 | |
124 | end FIR_Test_arch; |
Hier der Code des Simulationsfiles
1 | ---------------------------------------------------------------------------------- |
2 | -- Company: |
3 | -- Engineer: |
4 | -- |
5 | -- Create Date: 06.08.2019 14:33:09 |
6 | -- Design Name: |
7 | -- Module Name: sim_fir - sim_fir_arch |
8 | -- Project Name: |
9 | -- Target Devices: |
10 | -- Tool Versions: |
11 | -- Description: |
12 | -- |
13 | -- Dependencies: |
14 | -- |
15 | -- Revision: |
16 | -- Revision 0.01 - File Created |
17 | -- Additional Comments: |
18 | -- |
19 | ---------------------------------------------------------------------------------- |
20 | |
21 | |
22 | library IEEE; |
23 | use IEEE.Std_logic_1164.all; |
24 | use IEEE.Numeric_Std.all; |
25 | |
26 | -- Uncomment the following library declaration if using |
27 | -- arithmetic functions with Signed or Unsigned values |
28 | --use IEEE.NUMERIC_STD.ALL; |
29 | |
30 | -- Uncomment the following library declaration if instantiating |
31 | -- any Xilinx leaf cells in this code. |
32 | --library UNISIM; |
33 | --use UNISIM.VComponents.all; |
34 | |
35 | entity sim_fir is |
36 | -- Port ( ); |
37 | end sim_fir; |
38 | |
39 | architecture sim_fir_arch of sim_fir is |
40 | |
41 | component FIR_Test is |
42 | generic(N : integer := 10); --(Anzahl der Koeffizienten - 1) |
43 | port |
44 | ( |
45 | x_in : in std_logic_vector(11 downto 0); --Input 12 Bit vom AD Wandler |
46 | clk : in std_logic; --Input Clk mit hoher Frequenz |
47 | rst : in std_logic; --Reset Active Low |
48 | enable_data : in std_logic; --next Sample von ADC |
49 | data_acknowledged : in std_logic; --DA hat Daten erhalten |
50 | |
51 | filter_rdy : out std_logic; --Signalisiere dem DA ready. |
52 | y : out std_logic_vector(11 downto 0) --Output 12 Bit an den DA - Wandler |
53 | ); |
54 | end component FIR_Test; |
55 | |
56 | signal sign_x_in : std_logic_vector(11 downto 0) := "100010001000"; --Input 12 Bit vom AD Wandler |
57 | signal sign_clk : std_logic := '0'; --Input Clk mit hoher Frequenz |
58 | signal sign_rst : std_logic := '1'; --Reset Active Low |
59 | signal sign_enable_data : std_logic := '1'; --next Sample von ADC |
60 | signal sign_data_acknowledged : std_logic := '1'; --DA hat Daten erhalten |
61 | |
62 | signal sign_filter_rdy : std_logic; --Signalisiere dem DA ready. |
63 | signal sign_y : std_logic_vector(11 downto 0); --Output 12 Bit an den DA - Wandler |
64 | begin |
65 | dut : FIR_Test |
66 | |
67 | port map |
68 | ( |
69 | x_in => sign_x_in, |
70 | clk => sign_clk, |
71 | rst => sign_rst, |
72 | enable_data=>sign_enable_data, |
73 | data_acknowledged=>sign_data_acknowledged, |
74 | |
75 | filter_rdy=>sign_filter_rdy, |
76 | y=>sign_y |
77 | ); |
78 | |
79 | clk_gen : process |
80 | begin |
81 | wait for 4ns; |
82 | sign_clk <= '1'; |
83 | wait for 4ns; |
84 | sign_clk <= '0'; |
85 | end process clk_gen; |
86 | |
87 | enable_gen : process |
88 | begin |
89 | wait for 20us; |
90 | sign_enable_data <= '1'; |
91 | wait for 1us; |
92 | sign_enable_data <= '0'; |
93 | end process enable_gen; |
94 | end sim_fir_arch; |