Forum: FPGA, VHDL & Co. Port Map Verständigungsproblem (Core Generator)


von Student (Gast)


Lesenswert?

Hallo,

ich wollte mal einen PI Regler in Floating Point realisieren und bin 
dabei auf folgendes Problem gestoßen: Ich verwende 2 FPU aus 
CoreGenerator Bibliothek (Xilinx). Der ISE Compiler sagt z.B.


WARNING:HDLCompiler:871 - 
"C:\Users\user71\Desktop\Xilinx_projects\fixed_point\PI_Cntr.vhd" Line 
67: Using initial value "00000000000000000000000000000000" for integral 
since it is never assigned

dabei verwende ich doch die Variable. Ich vermute mal dass das Problem 
bei Port Map liegt.

Kann mir jemand sagen ob ich etwas falsch mache?

Danke im Vorraus
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.NUMERIC_STD.ALL;
4
5
6
entity PI_Cntr is
7
    Port ( clk : in  STD_LOGIC;
8
        setpoint : in  STD_LOGIC_VECTOR (31 downto 0);
9
           actualpoint : in  STD_LOGIC_VECTOR (31 downto 0);
10
           output : out  STD_LOGIC_VECTOR (31 downto 0)
11
       );
12
end PI_Cntr;
13
14
15
architecture Behavioral of PI_Cntr is
16
17
------------- Begin Cut here for COMPONENT Declaration ------ COMP_TAG
18
COMPONENT float_sum
19
  PORT (
20
    a : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
21
    b : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
22
    operation : IN STD_LOGIC_VECTOR(5 DOWNTO 0);
23
    result : OUT STD_LOGIC_VECTOR(31 DOWNTO 0)
24
  );
25
END COMPONENT;
26
27
COMPONENT float_mult
28
  PORT (
29
    a : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
30
    b : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
31
    result : OUT STD_LOGIC_VECTOR(31 DOWNTO 0)
32
  );
33
END COMPONENT;
34
35
36
-- COMP_TAG_END ------ End COMPONENT Declaration ------------
37
38
signal dt               :   STD_LOGIC_VECTOR(31 DOWNTO 0) := x"38d1b717";  --    100us
39
signal Kp               :   STD_LOGIC_VECTOR(31 DOWNTO 0) := x"3f800000";  --    1
40
signal Ki               :   STD_LOGIC_VECTOR(31 DOWNTO 0) := x"3c23d70a";  --    0.01
41
signal max               :   STD_LOGIC_VECTOR(31 DOWNTO 0) := x"42200000";  --    40
42
signal min               :   STD_LOGIC_VECTOR(31 DOWNTO 0) := x"c2200000";  --  - 40
43
44
signal mult_a, mult_b, mult_r :   STD_LOGIC_VECTOR(31 DOWNTO 0):= x"00000000";
45
signal add_a, add_b, add_r   :   STD_LOGIC_VECTOR(31 DOWNTO 0):= x"00000000";
46
signal oper             :  STD_LOGIC_VECTOR(5 DOWNTO 0);
47
signal pre_error          :  STD_LOGIC_VECTOR(31 DOWNTO 0):= x"00000000";
48
signal integral          :  STD_LOGIC_VECTOR(31 DOWNTO 0):= x"00000000";
49
signal error            :  STD_LOGIC_VECTOR(31 DOWNTO 0):= x"00000000";
50
signal temp, temp2        :  STD_LOGIC_VECTOR(31 DOWNTO 0):= x"00000000";
51
52
53
signal cnt               :  integer range 0 to 15 := 0;
54
55
begin  
56
  C0 : float_sum PORT MAP (  a => add_a,
57
                    b => add_b,
58
                    operation => oper ,
59
                    result => add_r
60
                  );
61
  C1 : float_mult PORT MAP (  a => mult_a,
62
                    b => mult_b,
63
                    result => mult_r
64
                  );
65
66
67
GEN: block
68
  begin 
69
    process(clk)
70
      begin
71
      IF rising_edge(clk) THEN
72
        cnt <= cnt + 1;
73
        IF cnt = 0 THEN        -- Berechnen Error          
74
          add_a <= setpoint;
75
          add_b <= actualpoint;
76
          oper  <= "000001";
77
          add_r <= error;
78
        ELSIF cnt = 1 THEN      
79
          mult_a <= dt;          -- temp  = error*dt
80
          mult_b <= error;
81
          mult_r <= temp;
82
        ELSIF cnt = 2 THEN        -- integral = integral + temp  
83
          add_a <= integral;
84
          add_b <= temp;
85
          oper  <= "000000";
86
          add_r <= integral;
87
          
88
          mult_a <= Kp;          -- temp2  = Kp * error
89
          mult_b <= error;
90
          mult_r <= temp2;
91
        ELSIF cnt = 3 THEN       
92
          mult_a <= Ki;          -- temp  = Ki*Integral
93
          mult_b <= integral;
94
          mult_r <= temp;
95
        ELSIF cnt = 4 THEN        -- integral = integral + temp
96
          add_a <= temp;
97
          add_b <= temp2;
98
          oper  <= "000000";
99
          add_r <= temp;
100
        ELSIF cnt > 5 THEN
101
          cnt <= 0;
102
          output <= error;
103
        END IF;
104
      END IF;
105
    END PROCESS;
106
  END BLOCK GEN;  
107
  
108
end Behavioral;

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Student schrieb:
1
  C1 : float_mult PORT MAP (  a => mult_a,
2
                              b => mult_b,
3
                              result => mult_r
4
                            );
Ich würde probieren, so einen Regler mit Integern machen. Die lassen 
sich wesentlich einfacher verrechnen. Und mit einem geeigneten Modell 
läuft ein Regler auch mit 32-Bit Integern.

Student schrieb:
> 67: Using initial value "00000000000000000000000000000000" for integral
> since it is never assigned
> dabei verwende ich doch die Variable.
Sososo, das ist eine Variable...
Warum steht da dann /Signal/:
1
signal integral  :  STD_LOGIC_VECTOR(31 DOWNTO 0):= x"00000000";

> dabei verwende ich doch die Variable.
Ja, aber immer auf der rechten Seite des Zuweisungspfeils...

BTW: vergiss diese Softwaredenkweise.
Und merk dir schon mal das Wort "Latency". Du wirst es im Verlauf der 
Fehlersuche noch ein paar mal hören...

von Student (Gast)


Lesenswert?

>> Lothar Miller
Sorry es handelt sich wirklich um ein Signal.
Ich habe beides probiert. Wenn ich in Int32 rechne zeigt mir der 
Compiler max. Frequenz von 98 Mhz für die Multiplikation. Wenn ich FPU 
anwende errechnet 89Mhz. Vom Platz her macht es auch nicht wirklich viel 
aus.

Bei der Simulation habe ich bemerkt dass es kein Wert übergeben wird. 
Liegt es an die Schreibweise?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Student schrieb:
> Bei der Simulation habe ich bemerkt dass es kein Wert übergeben wird.
Wohin soll da ein Wert übergeben werden?

> Liegt es an die Schreibweise?
Naja, du weist dem Signal add_r von 2 Stellen aus etwas zu.
Hier wird in der Portliste ein Ausgang zugewiesen:
           result => add_r,
Und hier ein Wert:
           add_r <= integral;
Was sollte da herauskommen?

von Student (Gast)


Lesenswert?

>> Lothar Miller

Vielen Dank. Du bist der beste!!
Ich habe es endlich.

Eine Frage hätte ich trotzdem. Was will mir den Compiler mit Warning 
sagen:
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <oper_2> has 
a constant value of 0 in block <PI_Cntr>. This FF/Latch will be trimmed 
during the optimization process.


1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.NUMERIC_STD.ALL;
4
5
6
entity PI_Cntr is
7
    Port ( clk : in  STD_LOGIC;
8
        setpoint : in  STD_LOGIC_VECTOR (31 downto 0);
9
           actualpoint : in  STD_LOGIC_VECTOR (31 downto 0);
10
           output : out  STD_LOGIC_VECTOR (31 downto 0)
11
       );
12
end PI_Cntr;
13
14
15
architecture Behavioral of PI_Cntr is
16
17
------------- Begin Cut here for COMPONENT Declaration ------ COMP_TAG
18
COMPONENT float_sum
19
  PORT (
20
    a : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
21
    b : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
22
    operation : IN STD_LOGIC_VECTOR(5 DOWNTO 0);
23
    result : OUT STD_LOGIC_VECTOR(31 DOWNTO 0)
24
  );
25
END COMPONENT;
26
27
COMPONENT float_mult
28
  PORT (
29
    a : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
30
    b : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
31
    result : OUT STD_LOGIC_VECTOR(31 DOWNTO 0)
32
  );
33
END COMPONENT;
34
35
36
-- COMP_TAG_END ------ End COMPONENT Declaration ------------
37
38
signal dt               :   STD_LOGIC_VECTOR(31 DOWNTO 0) := x"38d1b717";  --    100us
39
signal Kp               :   STD_LOGIC_VECTOR(31 DOWNTO 0) := x"3f800000";  --    1
40
signal Ki               :   STD_LOGIC_VECTOR(31 DOWNTO 0) := x"3c23d70a";  --    0.01
41
signal max               :   STD_LOGIC_VECTOR(31 DOWNTO 0) := x"42200000";  --    40
42
signal min               :   STD_LOGIC_VECTOR(31 DOWNTO 0) := x"c2200000";  --  - 40
43
44
signal mult_a, mult_b, mult_r :   STD_LOGIC_VECTOR(31 DOWNTO 0):= x"00000000";
45
signal add_a, add_b, add_r   :   STD_LOGIC_VECTOR(31 DOWNTO 0):= x"00000000";
46
signal oper             :  STD_LOGIC_VECTOR(5 DOWNTO 0) := "000000";
47
signal integral          :  STD_LOGIC_VECTOR(31 DOWNTO 0):= x"00000000";
48
signal error            :  STD_LOGIC_VECTOR(31 DOWNTO 0):= x"00000000";
49
signal temp, temp2        :  STD_LOGIC_VECTOR(31 DOWNTO 0):= x"00000000";
50
51
52
signal cnt               :  integer range 0 to 15 := 0;
53
54
begin  
55
  C0 : float_sum PORT MAP (  a => add_a,
56
                    b => add_b,
57
                    operation => oper,
58
                    result => add_r
59
                  );
60
  C1 : float_mult PORT MAP (  a => mult_a,
61
                    b => mult_b,
62
                    result => mult_r
63
                  );
64
65
66
GEN: block
67
  begin 
68
    process(clk)
69
      begin
70
      IF rising_edge(clk) THEN
71
        cnt <= cnt + 1;
72
        IF cnt = 0 THEN          -- Berechnen Error          
73
          add_a <= setpoint;
74
          add_b <= actualpoint;
75
          oper  <= "000001"; 
76
        ELSIF cnt = 1 THEN  
77
          error <= add_r;
78
        ELSIF cnt = 2 THEN  
79
          mult_a <= dt;          -- temp  = error*dt
80
          mult_b <= error;
81
        ELSIF cnt = 3 THEN  
82
          temp <= mult_r;        -- Ergebnis der Multiplication wird in 
83
        ELSIF cnt = 4 THEN        -- integral = integral + temp  
84
          add_a <= integral;
85
          add_b <= temp;
86
          oper  <= "000000";
87
          
88
          mult_a <= Kp;          -- temp2  = Kp * error
89
          mult_b <= error;
90
        ELSIF cnt = 5 THEN  
91
          integral <= add_r;
92
          temp2 <=  mult_r;
93
        ELSIF cnt = 6 THEN       
94
          mult_a <= Ki;          -- temp  = Ki*Integral
95
          mult_b <= integral;
96
        ELSIF cnt = 7 THEN  
97
          temp <= mult_r;
98
        ELSIF cnt = 8 THEN        -- Pre_error = temp + temp2
99
          add_a <= temp;
100
          add_b <= temp2;
101
          oper  <= "000000"; 
102
        ELSIF cnt = 9 THEN
103
          output <= add_r;
104
          cnt <= 0;
105
        END IF;
106
      END IF;
107
    END PROCESS;
108
  END BLOCK GEN;  
109
  
110
end Behavioral;

von Mirco (Gast)


Lesenswert?

Student schrieb:
> This FF/Latch will be trimmed
>
> during the optimization process.
Die Randbedingungen, also das Timing, die Signale von aussen und das 
Verhalten der state machines verändern das Signal nicht. Daher wird es 
ersetzt. Vermutlich ist das falsch und hat seine Ursache darin, dass Du 
etwas nicht angeschlossen hast, eine state machine einen Zustand nicht 
erreicht oder sonst etwas (nicht) passiert, was Du (nicht) wolltest. Du 
musst das design simulieren und rausfinden, welches Signal sich da nicht 
ändert, wesewegen in der Folge das nächste nicht ändert und den Grund 
finden.

von Student (Gast)


Lesenswert?

>> Mirco

Ich bin mir nicht sicher aber es scheint, dass die Warnung nur in einem 
Zusammenhang mit DSP48 Element kommt. Ich habe im CoreGenerator die 
gleiche Elemente nur auf FF aufbauen lassen(also ohne DSP48 Option) und 
sieh mal an es kommen die anderen Meldungen:

WARNING:Xst:387 - The KEEP property attached to the net <C0/sig00000069> 
may hinder timing optimization.
   You may achieve better results by removing this property

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Student schrieb:
> Eine Frage hätte ich trotzdem. Was will mir den Compiler mit Warning
> sagen:
> WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <oper_2> has
> a constant value of 0 in block <PI_Cntr>. This FF/Latch will be trimmed
> during the optimization process.
Mich wundert eher, dass die anderen oper(5..1) nicht erwähnt werden. 
Denn in dem Codebeispiel ändert sich nur oper(0)...

von Student (Gast)


Lesenswert?

>>Lothar Miller

ich habe nur eine herausgegriffen.

WARNING:Xst:1902 - Value 0 for attribute AUTORESET_PATDET of instance 
blk00000090 in unit blk00000090 is not supported
WARNING:Xst:1902 - Value 0 for attribute AUTORESET_PATDET of instance 
blk00000091 in unit blk00000091 is not supported
WARNING:Xst:1902 - Value 0 for attribute AUTORESET_PATDET of instance 
blk00000092 in unit blk00000092 is not supported
WARNING:Xst:1293 - FF/Latch <oper_1> has a constant value of 0 in block 
<PI_Cntr>. This FF/Latch will be trimmed during the optimization 
process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <oper_2> has 
a constant value of 0 in block <PI_Cntr>. This FF/Latch will be trimmed 
during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <oper_3> has 
a constant value of 0 in block <PI_Cntr>. This FF/Latch will be trimmed 
during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <oper_4> has 
a constant value of 0 in block <PI_Cntr>. This FF/Latch will be trimmed 
during the optimization process.
WARNING:Xst:1896 - Due to other FF/Latch trimming, FF/Latch <oper_5> has 
a constant value of 0 in block <PI_Cntr>. This FF/Latch will be trimmed 
during the optimization process.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Student schrieb:
> ich habe nur eine herausgegriffen.
Ja, dann dürfte es wohl klar sein: oper kennt nur zwei Werte
1
          oper  <= "000001";
2
3
          oper  <= "000000";
Weil du aber mit einer steigenden Flanke erst mal 6 Flipflops 
beschrieben hast:
1
      IF rising_edge(clk) THEN
2
          oper  <= "000001";
sagt dir der Synthesizer mit der Warnung, dass die meisten davon 
konstant und daher überflüssig sind.

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.