Forum: FPGA, VHDL & Co. Vivado Simulation stoppt vor Ende der Simulationszeit


von Alex K. (alexk99123)


Angehängte Dateien:

Lesenswert?

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;

: Bearbeitet durch User
von Tobias B. (Firma: www.elpra.de) (ttobsen) Benutzerseite


Lesenswert?

Da muss t schon den ganzen Log mit anhaengen. XSim wird ja nicht einfach 
aufhoeren mit simulieren ohne irgendeinen Grund zu nennen warum 
aufgehoert wird.

: Bearbeitet durch User
von Alex K. (alexk99123)


Lesenswert?

Sorry, dämlicher Post... Ich wusste nicht, dass der Konsolenoutput so 
explizit auf Fehler hinweist.
1
if (counter_filter < 12) then                         
2
    sop := sop + coeff(counter_filter - 1) * signed(x(counter_filter - 1)); --Durchführung einer Multiplikation und einer Addition
3
    x(counter_filter) <= x(counter_filter - 1); --Zeitverschiebung
4
else
5
    filter_rdy_intern <= '1';
6
end if;
7
    counter_filter := counter_filter + 1;

In dem Codeschnipsel zählt counter_filter zu weit. Der Index des Arrays 
"x" ist gar nicht so groß

von Tobias B. (Firma: www.elpra.de) (ttobsen) Benutzerseite


Lesenswert?

Perfekt, das ist DER typische Fehler wenn Simulationen ploetzlich 
stoppen. :-)

von Elbi (Gast)


Lesenswert?

Es gibt noch einen Punkt: Wenn sie zu lange dauert und die Anzahl der 
Zeitpunkte zu gross wird. Da gibt es ein Limit.

Ansonsten säuft ModelSIM gerne mal ab, wenn es zuviel Speichern muss.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.