Forum: FPGA, VHDL & Co. Integer vergleichen


von Robert (Gast)


Lesenswert?

hey, hier Robert. ich möchte eine motorsteuerung für ein BLDC in VHDL 
schreiben.
Mein problem sind die IF abfragen. Ich bekomme es nicht hin, die integer 
richtig miteinander zu vergleichen. kann mir bitte jemand sagen, wie ich 
das richtig schreibe?
1
library ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.numeric_std.ALL;
4
5
Entity bldcSorce is
6
7
PORT(
8
  wi_hallA: IN std_logic;
9
  wi_haLLB: IN std_logic;
10
  wi_hallC: IN std_logic;
11
  wi_decoder: IN std_logic;
12
  clock: IN std_logic;  
13
  wo_MotorU: OUT std_logic;
14
  wo_MotorV: OUT std_logic;
15
  wo_MotorW: OUT std_logic;
16
  wo_MotorUEn: OUT std_logic;
17
  wo_MotorVEn: OUT std_logic;
18
  wo_MotorWEn: OUT std_logic;
19
  Sensorzustand: INOUT integer  );
20
        
21
END bldcSorce;
22
23
Architecture logic_level of bldcSorce is
24
25
  signal  ha:  bit;
26
  signal  hb:  bit;
27
  signal  hc:  bit;
28
29
type Motorzustaende is array (0 to 5) of integer;
30
type Motorzustand0 is array (0 to 12) of Motorzustaende;
31
signal Blockkomultation : Motorzustand0 := (
32
            --EnU,  PhaseU,EnV, PhaseV, EnW,  PhaseW
33
             ( 1,     2,    1,    0,      0,    0 ),   -- 0  
34
                               ( 1,     2,    1,    0,      0,    0 ),   -- 1  
35
                               ( 0,     0,    1,    0,      1,    2 ),   -- 2
36
                               ( 0,     0,    1,    0,      1,    2 ),   -- 3
37
                               ( 1,     0,    0,    0,      1,    2 ),   -- 4
38
                               ( 1,     0,    0,    0,      1,    2 ),   -- 5
39
                               ( 1,     0,    1,    2,      0,    0 ),   -- 6
40
                               ( 1,     0,    1,    2,      0,    0 ),   -- 7
41
                               ( 0,     0,    1,    2,      1,    0 ),   -- 8
42
                               ( 0,     0,    1,    2,      1,    0 ),   -- 9
43
                               ( 1,     2,    0,    0,      1,    0 ),   -- 10
44
                               ( 1,     2,    0,    0,      1,    0 ),   -- 11
45
 
46
                               ( 0,     0,    0,    0,      0,    0 ) ); -- 12      aus
47
48
49
50
Begin
51
  ha <= to_bit(wi_hallA);
52
  hb <= to_bit(wi_hallB);
53
  hc <= to_bit(wi_hallC);
54
55
with bit_vector'(ha ,hb ,hc) select
56
57
  Sensorzustand <= 0 when "001",
58
       2 when "011",
59
       4 when "010",
60
       6 when "110",
61
       8 when "100",
62
       10 when "101",
63
       12 when others;
64
65
66
67
if (blockkomultation(Sensorzustand)(0) = 0) then
68
  wo_MotorUEn <= '0';
69
elsif(blockkomultation(Sensorzustand)(0) = 1) then
70
  wo_MotorUEn <= '1';
71
elsif(blockkomultation(Sensorzustand)(0) = 2) then
72
I_PWMUEn  : entity work.bldcPWM
73
port map(
74
  clk  => clock,
75
  startImp  => '0',
76
  PwmReg     => "0011000100",  --200
77
  MotorPwm  => wo_MotorUEn
78
  );
79
end if;          
80
81
end logic_level;

die fehlermeldung zu diesem code ist:
1
vcom -work work -2002 -explicit -stats=none C:/altera/14.1/bldcSorce.vhd
2
Model Technology ModelSim ALTERA vcom 10.3c Compiler 2014.09 Sep 20 2014
3
-- Loading package STANDARD
4
-- Loading package TEXTIO
5
-- Loading package std_logic_1164
6
-- Loading package NUMERIC_STD
7
-- Compiling entity bldcSorce
8
-- Compiling architecture logic_level of bldcSorce
9
** Warning: C:/altera/14.1/bldcSorce.vhd(55): (vcom-1186) Array type selected signal assignment expression must be of a locally static subtype.
10
11
** Error: C:/altera/14.1/bldcSorce.vhd(67): Illegal concurrent statement.
12
-- Loading entity bldcPWM
13
** Error: C:/altera/14.1/bldcSorce.vhd(81): VHDL Compiler exiting

zeile 67 ist die IF abfrage. Danke für die Hilfe.

von Nick S. (c0re)


Lesenswert?

Zuweisungen =
Vergleiche ==

von Robert (Gast)


Lesenswert?

für c ja, für vhdl nein.

von Duke Scarring (Gast)


Lesenswert?

Robert schrieb:
> ** Error: C:/altera/14.1/bldcSorce.vhd(67): Illegal concurrent
> statement.
Welche ist denn die Zeile 67?

von Robert (Gast)


Lesenswert?

Robert schrieb:
> zeile 67 ist die IF abfrage. Danke für die Hilfe.

von Markus F. (mfro)


Lesenswert?

Robert schrieb:

Das

> Array type selected signal assignment expression must be of a locally
> static subtype.

steht für den (ha, hb, hc) Sensorzustand. Das Argument eines 
Conditional Assignments muß in VHDL eben "locally static" (d.h. eben 
nicht "im Flug zusammengebastelt") sein. Pack' das in eine temporäre 
Variable, dann ist der Fehler weg.

> Illegal concurrent statement.

Hier wird dasselbe Statement angemeckert. Vor VHDL 2008 ist das 
Conditional Assignment nur als sequentielles Statement erlaubt (muß 
also in einem Prozeß stehen). Ab VHDL 2008 darfst Du es überall 
hinschreiben.

Wenn dein Synthesetool VHDL 2008 nicht beherrscht, bleibt nur ändern, 
ansonsten halt den entsprechenden Schalter setzen (ModelSim kann's 
jedenfalls).

von kaputzke (Gast)


Lesenswert?

Hier sind zwei if Auslegen vermixt:

1.) das if sollte in einem Prozess stehen, wenn es signale ändert.

oder

2.)Bei einem if-generate werden kann ein port map gemacht werden, es wid 
also zur Synthese Zeit Hardware erzugt oder nicht. Dynamisch geht das 
nicht

von Markus F. (mfro)


Lesenswert?

Stimmt.

von Robert (Gast)


Lesenswert?

die änderungen an den Ha, hb, hc Signalen habe ich nicht verstanden. 
bitte um eine neue erklärung.

ich habe die if abfragen in ein Prozess gelegt. bekomme jetzt andere 
Fehler. sollte ich es anders machen?
1
library ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.numeric_std.ALL;
4
5
Entity bldcSorce is
6
7
PORT(
8
  wi_hallA: IN std_logic;
9
  wi_haLLB: IN std_logic;
10
  wi_hallC: IN std_logic;
11
  wi_decoder: IN std_logic;
12
  clock: IN std_logic;  
13
  wo_MotorU: OUT std_logic;
14
  wo_MotorV: OUT std_logic;
15
  wo_MotorW: OUT std_logic;
16
  wo_MotorUEn: OUT std_logic;
17
  wo_MotorVEn: OUT std_logic;
18
  wo_MotorWEn: OUT std_logic;
19
  Sensorzustand: INOUT integer  );
20
        
21
END bldcSorce;
22
23
Architecture logic_level of bldcSorce is
24
25
  signal  ha:  bit;
26
  signal  hb:  bit;
27
  signal  hc:  bit;
28
29
type Motorzustaende is array (0 to 5) of integer;
30
type Motorzustand0 is array (0 to 12) of Motorzustaende;
31
signal Blockkomultation : Motorzustand0 := (
32
            --EnU,  PhaseU,EnV, PhaseV, EnW,  PhaseW
33
             ( 1,     2,    1,    0,      0,    0 ),   -- 0  
34
                               ( 1,     2,    1,    0,      0,    0 ),   -- 1  
35
                               ( 0,     0,    1,    0,      1,    2 ),   -- 2
36
                               ( 0,     0,    1,    0,      1,    2 ),   -- 3
37
                               ( 1,     0,    0,    0,      1,    2 ),   -- 4
38
                               ( 1,     0,    0,    0,      1,    2 ),   -- 5
39
                               ( 1,     0,    1,    2,      0,    0 ),   -- 6
40
                               ( 1,     0,    1,    2,      0,    0 ),   -- 7
41
                               ( 0,     0,    1,    2,      1,    0 ),   -- 8
42
                               ( 0,     0,    1,    2,      1,    0 ),   -- 9
43
                               ( 1,     2,    0,    0,      1,    0 ),   -- 10
44
                               ( 1,     2,    0,    0,      1,    0 ),   -- 11
45
 
46
                               ( 0,     0,    0,    0,      0,    0 ) ); -- 12      aus
47
48
49
50
Begin
51
  ha <= to_bit(wi_hallA);
52
  hb <= to_bit(wi_hallB);
53
  hc <= to_bit(wi_hallC);
54
55
with bit_vector'(ha ,hb ,hc) select
56
57
  Sensorzustand <= 0 when "001",
58
       2 when "011",
59
       4 when "010",
60
       6 when "110",
61
       8 when "100",
62
       10 when "101",
63
       12 when others;
64
65
66
process
67
begin      -- motorzustand setzen
68
69
  if (blockkomultation(Sensorzustand)(0) = 0) then
70
    wo_MotorUEn <= '0';
71
  elsif(blockkomultation(Sensorzustand)(0) = 1) then
72
    wo_MotorUEn <= '1';
73
  elsif(blockkomultation(Sensorzustand)(0) = 2) then
74
  I_PWMUEn  : entity work.bldcPWM
75
  port map(
76
    clk  => clock,
77
    startImp  => '0',
78
    PwmReg     => "0011000100",  --200
79
    MotorPwm  => wo_MotorUEn
80
    );       --Zeile 80
81
  end if;          
82
end process;
83
end logic_level;

fehlerausgabe:
1
vcom -work work -2002 -explicit -stats=none C:/altera/14.1/bldcSorce.vhd
2
Model Technology ModelSim ALTERA vcom 10.3c Compiler 2014.09 Sep 20 2014
3
-- Loading package STANDARD
4
-- Loading package TEXTIO
5
-- Loading package std_logic_1164
6
-- Loading package NUMERIC_STD
7
-- Compiling entity bldcSorce
8
-- Compiling architecture logic_level of bldcSorce
9
** Warning: C:/altera/14.1/bldcSorce.vhd(55): (vcom-1186) Array type selected signal assignment expression must be of a locally static subtype.
10
11
-- Loading entity bldcPWM
12
** Error: C:/altera/14.1/bldcSorce.vhd(80): Illegal sequential statement.
13
** Warning: [2] C:/altera/14.1/bldcSorce.vhd(82): (vcom-1090) Possible infinite loop: Process contains no WAIT statement.
14
15
** Error: C:/altera/14.1/bldcSorce.vhd(83): VHDL Compiler exiting

von Markus F. (mfro)


Lesenswert?

Robert schrieb:
> with bit_vector'(ha ,hb ,hc) select

Das ist ein Conditional assignment und ist so gar nicht und - so:
1
    signal h : bit_vector(2 downto 0);
2
.
3
.
4
.
5
    h <= ha & hb & hc;
6
7
    with h select

erst ab VHDL 2008 außerhalb eines Prozesses erlaubbt (vorher nur 
innerhalb).

Das hier:
1
  elsif(blockkomultation(Sensorzustand)(0) = 2) then
2
  I_PWMUEn  : entity work.bldcPWM
3
  port map(
4
    clk  => clock,
5
    startImp  => '0',
6
    PwmReg     => "0011000100",  --200
7
    MotorPwm  => wo_MotorUEn
8
    );       --Zeile 80
9
  end if;

ist irgendwie völlig daneben. Du willst die PWM(?)-Komponente nur dann 
instantiieren, wenn der Sensorzustand einen bestimmten Wert hat? Und 
falls nicht, soll die entsprechende Hardware "weggezaubert" werden?

Wie stellst Du dir das vor?

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


Lesenswert?

Robert schrieb:
1
 process
2
 begin      -- motorzustand setzen
3
   if (blockkomultation(Sensorzustand)(0) = 0) then
4
...
5
   elsif(blockkomultation(Sensorzustand)(0) = 2) then
6
7
   I_PWMUEn  : entity work.bldcPWM
8
   port map(
9
     clk  => clock,
10
     startImp  => '0',
11
     PwmReg     => "0011000100",  --200
12
     MotorPwm  => wo_MotorUEn
13
     );       --Zeile 80
14
15
   end if;
16
 end process;
Seit wann geht sowas?

> Possible infinite loop: Process contains no WAIT statement.
Ein Prozess braucht entweder eine Sensitivliste oder ein wait().

Mein Tipp: du solltest nicht nur "wild drauf los programmieren", sondern 
dich mal mit VHDL beschäftigen. Nimm das Buch "VHDL-Synthese" oder ein 
gleichwertiges, das sich mit Umsetzung von VHDL auf reale Hardware 
befasst.

Ein Tipp dazu: es gibt unterschiedliche Syntaxelemente für Abfragen 
innerhalb und ausserhalb eines Prozesses. Die nennen sich "sequential 
statements" und "concurrent statements"

: Bearbeitet durch Moderator
von Robert (Gast)


Lesenswert?

ne ich wollte ehr so was schreiben:
1
library ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.numeric_std.ALL;
4
5
Entity bldcSorce is
6
7
PORT(
8
  wi_hallA: IN std_logic;
9
  wi_haLLB: IN std_logic;
10
  wi_hallC: IN std_logic;
11
  wi_decoder: IN std_logic;
12
  PWM: IN integer;
13
  clock: IN std_logic;  
14
  wo_MotorU: OUT std_logic;
15
  wo_MotorV: OUT std_logic;
16
  wo_MotorW: OUT std_logic;
17
  wo_MotorUEn: OUT std_logic;
18
  wo_MotorVEn: OUT std_logic;
19
  wo_MotorWEn: OUT std_logic;
20
  Sensorzustand: INOUT integer  );
21
        
22
END bldcSorce;
23
24
Architecture logic_level of bldcSorce is
25
26
  signal  ha:  bit;
27
  signal  hb:  bit;
28
  signal  hc:  bit;
29
  signal PWMU: unsigned (9 downto 0);
30
  signal PWMV: unsigned (9 downto 0);
31
  signal PWMW: unsigned (9 downto 0);
32
33
  type Motorzustaende is array (0 to 5) of integer;
34
  type Motorzustand0 is array (0 to 12) of Motorzustaende;
35
  signal Blockkomultation : Motorzustand0 := (
36
                    --EnU,  PhaseU,EnV, PhaseV, EnW,  PhaseW
37
                    ( 1,     2,    1,    0,      0,    0 ),   -- 0  
38
                               ( 1,     2,    1,    0,      0,    0 ),   -- 1  
39
                               ( 0,     0,    1,    0,      1,    2 ),   -- 2
40
                               ( 0,     0,    1,    0,      1,    2 ),   -- 3
41
                               ( 1,     0,    0,    0,      1,    2 ),   -- 4
42
                               ( 1,     0,    0,    0,      1,    2 ),   -- 5
43
                               ( 1,     0,    1,    2,      0,    0 ),   -- 6
44
                               ( 1,     0,    1,    2,      0,    0 ),   -- 7
45
                               ( 0,     0,    1,    2,      1,    0 ),   -- 8
46
                               ( 0,     0,    1,    2,      1,    0 ),   -- 9
47
                               ( 1,     2,    0,    0,      1,    0 ),   -- 10
48
                               ( 1,     2,    0,    0,      1,    0 ),   -- 11
49
 
50
                               ( 0,     0,    0,    0,      0,    0 ) ); -- 12      aus
51
52
53
54
Begin
55
  ha <= to_bit(wi_hallA);
56
  hb <= to_bit(wi_hallB);
57
  hc <= to_bit(wi_hallC);
58
59
with bit_vector'(ha ,hb ,hc) select
60
61
  Sensorzustand <= 0 when "001",
62
       2 when "011",
63
       4 when "010",
64
       6 when "110",
65
       8 when "100",
66
       10 when "101",
67
       12 when others;
68
69
I_PWMUEn  : entity work.bldcPWM
70
  port map(
71
    clk  => clock,
72
    startImp  => '0',
73
    PwmReg     => PWMU,
74
    MotorPwm  => wo_MotorUEn
75
    );
76
process
77
begin      -- motorzustand setzen
78
79
  if (blockkomultation(0)(Sensorzustand) = 0) then
80
    wo_MotorUEn <= '0';
81
  elsif(blockkomultation(0)(Sensorzustand) = 1) then
82
    wo_MotorUEn <= '1';
83
  elsif(blockkomultation(0)(Sensorzustand) = 2) then
84
    PWMU <= to_unsigned(PWM,10);
85
  end if;          
86
end process;
87
end logic_level;

in dieser fassung läuft es auch so wie ich es wollte. erstmal.
ich danke für die schnelle Hilfe.

von Markus F. (mfro)


Lesenswert?

Robert schrieb:
> in dieser fassung läuft es auch so wie ich es wollte

... das glaub' ich allerdings erst mal nicht.

Es sei denn, Du wolltest, daß es nicht läuft ;).

Ein Prozeß ohne wait-Statement und ohne Sensitivliste macht seltsame 
Dinge ...

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


Lesenswert?

Markus F. schrieb:
> Ein Prozeß ohne wait-Statement und ohne Sensitivliste macht seltsame
> Dinge ...
Nur in der Simulation. Das sagt der Synthesizer aber klar und deutlich. 
Aber eines ist ganz offensichtlich: so wie es derzeit darstellst das 
gerade so irgendwie hingebastelt.

Robert schrieb:
> in dieser fassung läuft es auch so wie ich es wollte.
Heute noch. Zufällig. Zum Glück. Usw.
Simulier das seltsame Konstrukt mal. Der Simulator ist der Debugger 
eines HDL Designs.

: Bearbeitet durch Moderator
von Robert (Gast)


Lesenswert?

muss leider gestehen, dass du recht hast. der code läst sich compilieren 
doch die Simulation macht mir zu schaffen.
1
library ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.numeric_std.ALL;
4
5
Entity bldcSorce is
6
7
PORT(
8
  wi_hallA: IN std_logic;
9
  wi_haLLB: IN std_logic;
10
  wi_hallC: IN std_logic;
11
  wi_decoder: IN std_logic;
12
  PWM: IN integer;
13
  clock: IN std_logic;  
14
  wo_MotorU: OUT std_logic;
15
  wo_MotorV: OUT std_logic;
16
  wo_MotorW: OUT std_logic;
17
  wo_MotorUEn: OUT std_logic;
18
  wo_MotorVEn: OUT std_logic;
19
  wo_MotorWEn: OUT std_logic;
20
  Sensorzustand: INOUT integer  );
21
        
22
END bldcSorce;
23
24
Architecture logic_level of bldcSorce is
25
26
  signal  ha:  bit;
27
  signal  hb:  bit;
28
  signal  hc:  bit;
29
  signal PWMU: unsigned (9 downto 0);
30
  signal PWMV: unsigned (9 downto 0);
31
  signal PWMW: unsigned (9 downto 0);
32
33
  type Motorzustaende is array (0 to 5) of integer;
34
  type Motorzustand0 is array (0 to 12) of Motorzustaende;
35
  signal Blockkomultation : Motorzustand0 := (
36
                    --EnU,  PhaseU,EnV, PhaseV, EnW,  PhaseW
37
                    ( 1,     2,    1,    0,      0,    0 ),   -- 0  
38
                               ( 1,     2,    1,    0,      0,    0 ),   -- 1  
39
                               ( 0,     0,    1,    0,      1,    2 ),   -- 2
40
                               ( 0,     0,    1,    0,      1,    2 ),   -- 3
41
                               ( 1,     0,    0,    0,      1,    2 ),   -- 4
42
                               ( 1,     0,    0,    0,      1,    2 ),   -- 5
43
                               ( 1,     0,    1,    2,      0,    0 ),   -- 6
44
                               ( 1,     0,    1,    2,      0,    0 ),   -- 7
45
                               ( 0,     0,    1,    2,      1,    0 ),   -- 8
46
                               ( 0,     0,    1,    2,      1,    0 ),   -- 9
47
                               ( 1,     2,    0,    0,      1,    0 ),   -- 10
48
                               ( 1,     2,    0,    0,      1,    0 ),   -- 11
49
 
50
                               ( 0,     0,    0,    0,      0,    0 ) ); -- 12      aus
51
52
53
54
Begin
55
  ha <= to_bit(wi_hallA);
56
  hb <= to_bit(wi_hallB);
57
  hc <= to_bit(wi_hallC);
58
59
with bit_vector'(ha ,hb ,hc) select
60
61
  Sensorzustand <= 0 when "001",
62
       2 when "011",
63
       4 when "010",
64
       6 when "110",
65
       8 when "100",
66
       10 when "101",
67
       12 when others;
68
69
I_PWMUEn  : entity work.bldcPWM
70
  port map(
71
    clk  => clock,
72
    startImp  => '0',
73
    PwmReg     => PWMU,
74
    MotorPwm  => wo_MotorUEn
75
    );
76
motorbestromung: process (ha,hb, hc)
77
begin      -- motorzustand setzen
78
79
  if (blockkomultation(Sensorzustand)(0) = 0) then  --zeile 79
80
    wo_MotorUEn <= '0';
81
  elsif(blockkomultation(Sensorzustand)(0) = 1) then
82
    wo_MotorUEn <= '1';
83
  elsif(blockkomultation(Sensorzustand)(0) = 2) then
84
    PWMU <= to_unsigned(PWM,10);
85
  else
86
    PWMU <= to_unsigned(200,10);
87
  end if;    
88
--  wait on clock;      
89
end process;
90
end logic_level;

bei der Simulation bekomme ich volgende Fehlermeldung herraus, mit der 
ich wenig anfangen kann:
1
VSIM35>run 50 ms
2
# ** Fatal: (vsim-3734) Index value -2147483648 is out of range 0 to 12.
3
#    Time: 0 ps  Iteration: 0  Process: /bldcsorce/motorbestromung File: C:/altera/14.1/bldcSorce.vhd
4
# Fatal error in Process motorbestromung at C:/altera/14.1/bldcSorce.vhd line 79
5
# 
6
# HDL call sequence:
7
# Stopped at C:/altera/14.1/bldcSorce.vhd 79 Process motorbestromung
8
# 
9
10
VSIM35>
 die wait Anweisung konnte ich nicht in den code intrigieren. dabei hat 
der Compiler gemeckert.

von robert (Gast)


Lesenswert?

Lothar M. schrieb:
> so wie es derzeit darstellst das
> gerade so irgendwie hingebastelt.

um das irgendwie genauer zu beschreiben: so gut ich kann.

ich habe nur sehr wenig erfahrung in vhdl und versuche durch diese 
anwendung mehr zu erfahren.

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


Lesenswert?

Robert schrieb:
> motorbestromung: process (ha,hb, hc)
Die Sensitivliste ist falsch.
Dort müssen die Signale rein,  die in der Simulation eine Neuberechnung 
des Prozesses nötig machen. Also die, die rechts in Zuweisungen stehen, 
und die, die in Abfragen verwendet werden.

Oder kurz: eine falsche Sensitivliste hat eine falsche Simulation als 
Ergebnis.

robert schrieb:
> ich habe nur sehr wenig erfahrung in vhdl
Das war bei jedem mal so.

> und versuche durch diese
> anwendung mehr zu erfahren.
Die üblichen einfachen ersten Schritte (blinkende LED, Laufschrift, 
serielle Schnitte...) samt Simulation hast du schon erfolgreich gemacht?

> Fehlermeldung
Was passiert denn in der Zeile 79?
Und was ist der Initialisierungswert eines uneingeschränkten Integers, 
wenn du nicht extra einen angibst?

Das hier ist übrigens ein potentieller Kündigungsgrund:
> Sensorzustand: INOUT integer
Wozu soll hier ein bidirektionaler Port nötig sein?

Robert schrieb:
> die wait Anweisung konnte ich nicht in den code intrigieren. dabei hat
> der Compiler gemeckert.
Du solltest auch nicht irgendwas in deinen Code hineinbasteln, was dir 
irgendwer gesagt hat. Sondern du solltest erst mal verstehen Was dann 
passiert. Oder es wenigstens versuchen. Denn wie gesagt: die übliche 
Try-and-Error Softwareentwicklung kannst du hier nicht anwenden. Du 
musst deine Hardware kennen. Dann kannst du sie beschreiben.

Oder sag mal einem eingeborenen subtropischen Dschungelbewohner er solle 
einen Schneemann beschreiben. Was kommt dabei wohl raus?

: Bearbeitet durch Moderator
von robert (Gast)


Lesenswert?

Lothar M. schrieb:
>> Fehlermeldung
> Was passiert denn in der Zeile 79?

Robert schrieb:
> if (blockkomultation(Sensorzustand)(0) = 0) then  --zeile 79
>     wo_MotorUEn <= '0';

Lothar M. schrieb:
> Die üblichen einfachen ersten Schritte (blinkende LED, Laufschrift,
> serielle Schnitte...) samt Simulation hast du schon erfolgreich gemacht?

ja. ist ein jahr her und ich merke, das ich da schlecht durch die 
aufgaben geführt wurde

Lothar M. schrieb:
> Dort müssen die Signale rein,  die in der Simulation eine Neuberechnung
> des Prozesses nötig machen.

ha, hb, und hc stehen wür die hallsensoren. jedes mal wen es dort eine 
änderung gibt, dann sollt der prozess motorbestromung abgearbeitet 
werden. ich denke das es besser ist dort die Variable: "Sensorzustand" 
zu benutzen, den die ist das eigendliche, worauf es hier ankommt.

zum Projekt: ich habe die realiesierung schon mit ein arduino 
gemeistert. also ist mir das, was ich eigendlich machen möchte klar. 
dieser ist mir aber zu langsam. ich bestrom den Motor mit 
sinuskomultation. also es ist mir nicht zu langsam, es ist zu langsam. 
ich kann den motor nur auf kleinen drehzahlen betreiben. dies aber nur 
nebennei.

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


Lesenswert?

robert schrieb:
> if (blockkomultation(Sensorzustand)(0) = 0)
Der Sensorzustand ist logischerweise ein nicht initialisierte Integer, 
der mit dem "linkesten" Wert initialisiert wird (siehe die Definition 
eines integers in VHDL: 
http://www.vhdl.renerta.com/mobile/source/vhd00039.htm und 
https://wiki.kip.uni-heidelberg.de/KIPwiki/images/d/d7/VHDL_Language_Reference_Guide_(help_file).pdf). 
Und dieser linke Wert ist -2147483648, was natürlich ausserhalb des 
erlaubten Bereichs 0..12 liegt.

> ich denke das es besser ist dort die Variable: "Sensorzustand" zu
> benutzen, den die ist das eigendliche, worauf es hier ankommt.
Da brauchst du gar nichts zu denken (du hast da keinerlei 
Wahlmöglichkeit). Du mußt letztlich nur die Warnungen/Meldungen des 
Compilers lesen.

In diese Sensitivliste muss natürlich auch PWM. Siehe meinen Post 
zum Thema "rechts von Zuweisungen" weiter oben...

> schon mit ein arduino gemeistert.
> also ist mir das, was ich eigendlich machen möchte klar.
Und man sieht, dass du es genau so "programmieren" willst, wie du es 
schon hattest...

: Bearbeitet durch Moderator
von robert (Gast)


Lesenswert?

Hey, ich bin vom Festival zurück mit neuen Problemen. Ich bitte um 
Gedult und verständnis dafür, dass ich es so gut wie möglich, aber eben 
noch nciht gut schreibe.



1
library ieee;
2
3
use ieee.std_logic_1164.all;
4
use ieee.numeric_std.ALL;
5
6
7
8
Entity bldcSorce is
9
10
11
12
PORT(
13
  wi_hallA: IN std_logic;
14
15
  wi_haLLB: IN std_logic;
16
17
  wi_hallC: IN std_logic;
18
  wi_decoder: IN std_logic;
19
  PWM: IN integer;
20
  clock: IN std_logic;
21
  wo_MotorUEn: OUT std_logic;
22
  wo_MotorU: OUT std_logic;
23
  wo_MotorVEn: OUT std_logic;
24
  wo_MotorV: OUT std_logic;
25
  wo_MotorWEn: OUT std_logic;  
26
  wo_MotorW: OUT std_logic
27
--  Sensorzustand: INOUT integer
28
29
    );
30
31
        
32
33
END bldcSorce;
34
35
36
37
Architecture logic_level of bldcSorce is
38
39
40
  signal  ha:  bit;
41
42
  signal  hb:  bit;
43
44
  signal  hc:  bit;
45
  signal PWMUEn: unsigned (9 downto 0);
46
  signal PWMVEn: unsigned (9 downto 0);
47
  signal PWMWEn: unsigned (9 downto 0);
48
  signal PWMU: unsigned (9 downto 0);
49
  signal PWMV: unsigned (9 downto 0);
50
  signal PWMW: unsigned (9 downto 0);
51
  signal DecoderSchritt: unsigned (9 downto 0);
52
  signal Sensorzustand:  unsigned (9 downto 0);
53
54
  type Motorzustaende is array (0 to 5) of integer;
55
  type Motorzustand0 is array (0 to 12) of Motorzustaende;
56
  signal Blockkomultation : Motorzustand0 := (
57
             --EnU,  PhaseU,EnV, PhaseV, EnW,  PhaseW
58
                 ( 1,     2,    1,    0,      0,    0 ),   -- 0  
59
                               ( 1,     2,    1,    0,      0,    0 ),   -- 1  
60
                               ( 0,     0,    1,    0,      1,    2 ),   -- 2
61
                               ( 0,     0,    1,    0,      1,    2 ),   -- 3
62
                               ( 1,     0,    0,    0,      1,    2 ),   -- 4
63
                               ( 1,     0,    0,    0,      1,    2 ),   -- 5
64
                               ( 1,     0,    1,    2,      0,    0 ),   -- 6
65
                               ( 1,     0,    1,    2,      0,    0 ),   -- 7
66
                               ( 0,     0,    1,    2,      1,    0 ),   -- 8
67
                               ( 0,     0,    1,    2,      1,    0 ),   -- 9
68
                               ( 1,     2,    0,    0,      1,    0 ),   -- 10
69
                               ( 1,     2,    0,    0,      1,    0 ),   -- 11
70
 
71
                               ( 0,     0,    0,    0,      0,    0 ) ); -- 12      aus
72
73
74
75
Begin
76
  ha <= to_bit(wi_hallA);
77
  hb <= to_bit(wi_hallB);
78
  hc <= to_bit(wi_hallC);
79
80
81
SensorzustandSetzen: process (clock)
82
83
begin  
84
with bit_vector'(ha ,hb ,hc) select
85
86
87
  Sensorzustand <= To_unsigned( 0,10) when "001",  --Zeile 70
88
       To_unsigned( 2,10) when "011",
89
       To_unsigned( 4,10) when "010",
90
         To_unsigned( 6,10) when "110",
91
        To_unsigned( 8,10) when "100",
92
       To_unsigned(10,10) when "101",
93
       To_unsigned(12,10) when others;
94
end process;
95
96
I_PWMUEn  : entity work.bldcPWM
97
  port map(
98
    clk  => clock,
99
    startImp  => '0',
100
    PwmReg     => PWMUEn,
101
    MotorPwm  => wo_MotorUEn
102
    );
103
104
105
I_PWMU    : entity work.bldcPWM
106
  port map(
107
    clk  => clock,
108
    startImp  => '0',
109
    PwmReg     => PWMU,
110
    MotorPwm  => wo_MotorU
111
    );
112
113
I_PWMVEn    : entity work.bldcPWM
114
  port map(
115
    clk  => clock,
116
    startImp  => '0',
117
    PwmReg     => PWMVEn,
118
    MotorPwm  => wo_MotorVEn
119
    );
120
121
122
I_PWMV    : entity work.bldcPWM
123
  port map(
124
    clk  => clock,
125
    startImp  => '0',
126
    PwmReg     => PWMV,
127
    MotorPwm  => wo_MotorV
128
    );
129
130
I_PWMWEn    : entity work.bldcPWM
131
  port map(
132
    clk  => clock,
133
    startImp  => '0',
134
    PwmReg     => PWMWEn,
135
    MotorPwm  => wo_MotorWEn
136
    );
137
138
139
I_PWMW    : entity work.bldcPWM
140
  port map(
141
    clk  => clock,
142
    startImp  => '0',
143
    PwmReg     => PWMW,
144
    MotorPwm  => wo_MotorW
145
    );
146
147
148
149
motorbestromung: process (clock)
150
151
begin      -- motorzustand setzen
152
153
154
  if (blockkomultation(To_integer(Sensorzustand))(0) = 0) then   -- U En
155
    PWMUEn <= to_unsigned(0,10);
156
  elsif(blockkomultation( To_integer(Sensorzustand))(0) = 1) then
157
    PWMUEn <= to_unsigned(1023,10);
158
  elsif(blockkomultation(To_integer(Sensorzustand))(0) = 2) then
159
    PWMUEn <= to_unsigned(PWM,10);
160
  else
161
    PWMUEn <= to_unsigned(0,10);  -- falls es mal als irgendwelchen gruenden keine Zahl aus der liste ist. 
162
163
  end if;    
164
165
  if (blockkomultation(To_integer(Sensorzustand))(1) = 0) then  -- u
166
    PWMU <= to_unsigned(0,10);
167
  elsif(blockkomultation(To_integer(Sensorzustand))(1) = 1) then
168
    PWMU <= to_unsigned(1023,10);
169
  elsif(blockkomultation(To_integer(Sensorzustand))(1) = 2) then
170
    PWMU <= to_unsigned(PWM,10);
171
  else
172
    PWMU <= to_unsigned(0,10);  -- falls es mal als irgendwelchen gruenden keine Zahl aus der liste ist. 
173
174
  end if;  
175
176
  if (blockkomultation(To_integer(Sensorzustand))(2) = 0) then  -- V En
177
    PWMVEn <= to_unsigned(0,10);
178
  elsif(blockkomultation(To_integer(Sensorzustand))(2) = 1) then
179
    PWMVEn <= to_unsigned(1023,10);
180
  elsif(blockkomultation(To_integer(Sensorzustand))(2) = 2) then
181
    PWMVEn <= to_unsigned(PWM,10);
182
  else
183
    PWMVEn <= to_unsigned(0,10);  -- falls es mal als irgendwelchen gruenden keine Zahl aus der liste ist. 
184
185
  end if;  
186
187
  if (blockkomultation(To_integer(Sensorzustand))(3) = 0) then  -- V 
188
    PWMV <= to_unsigned(0,10);
189
  elsif(blockkomultation(To_integer(Sensorzustand))(3) = 1) then
190
    PWMV <= to_unsigned(1023,10);
191
  elsif(blockkomultation(To_integer(Sensorzustand))(3) = 2) then
192
    PWMV <= to_unsigned(PWM,10);
193
  else
194
    PWMV <= to_unsigned(0,10);  -- falls es mal als irgendwelchen gruenden keine Zahl aus der liste ist. 
195
196
  end if;  
197
198
  if (blockkomultation(To_integer(Sensorzustand))(4) = 0) then  -- W En
199
    PWMWEn <= to_unsigned(0,10);
200
  elsif(blockkomultation(To_integer(Sensorzustand))(4) = 1) then
201
    PWMWEn <= to_unsigned(1023,10);
202
  elsif(blockkomultation(To_integer(Sensorzustand))(4) = 2) then
203
    PWMWEn <= to_unsigned(PWM,10);
204
  else
205
    PWMWEn <= to_unsigned(0,10);  -- falls es mal als irgendwelchen gruenden keine Zahl aus der liste ist. 
206
207
  end if;  
208
209
  if (blockkomultation(To_integer(Sensorzustand))(5) = 0) then  -- V 
210
    PWMW <= to_unsigned(0,10);
211
  elsif(blockkomultation(To_integer(Sensorzustand))(5) = 1) then
212
    PWMW <= to_unsigned(1023,10);
213
  elsif(blockkomultation(To_integer(Sensorzustand))(5) = 2) then
214
    PWMW <= to_unsigned(PWM,10);
215
  else
216
    PWMW <= to_unsigned(0,10);  -- falls es mal als irgendwelchen gruenden keine Zahl aus der liste ist. 
217
218
  end if;  
219
      
220
end process;
221
222
end logic_level;

die Felermeldung ist in der markirten Zeile 70 und in der letzten.
1
** Error: C:/altera/14.1/bldcSorce.vhd(70): Illegal sequential statement.
2
-- Loarding entity bldcPWM
3
** Error: C:/altera/14.1/bldcSorce.vhd(196): VHDL Compiler exiting

Lothar M. schrieb:
> Du mußt letztlich nur die Warnungen/Meldungen des
> Compilers lesen.

ich lese sie auch aufmerksam. doch das interprätieren, der nachichten 
erweißt sich als schwirig.

von robert (Gast)


Lesenswert?

was ich machen will ist das Signal Sensorzustand bei zwei verschiedenen 
Ereignissen zu verändern.
Ein mal, so wie schon geschieben, bei veränderung der Hallsensoren und 
zum andern 5 Decodertackte nach einer veränderung des Sensorzustandes. 
Hat jemand eine idee wie ich das günstig schreiben kann?

von Ozelot S. (poko)


Lesenswert?

Evtl sollte man einmal == anstatt = versuchen.
Mit == vergleicht man etwas mit = setzt man etwas.

von Pat A. (patamat)


Lesenswert?

Ozelot S. schrieb:
> Mit == vergleicht man etwas mit = setzt man etwas.

Aber NICHT bei VHDL!
Außerdem wurde das hier schon mal falsch verzapft!


robert schrieb:
> ** Error: C:/altera/14.1/bldcSorce.vhd(70): Illegal sequential
> statement.
> -- Loarding entity bldcPWM

"with ... select" ist ein 'concurrent statement' und damit erst ab 
VHDL-2008 innerhalb von Prozessen zugelassen. Nimm dafür ein 'sequential 
statement' wie "if" oder "case".

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


Lesenswert?

robert schrieb:
> ** Error: C:/altera/14.1/bldcSorce.vhd(70): Illegal sequential statement.
Du verwendest in einem Prozess eine Zuweisung, die nur 
nebenläufig/concurrent ausserhalb eines Prozesses verwendet werden darf.
Fazit: mach den Prozess dort weg, dann ist dieser Fehler weg.
1
--SensorzustandSetzen: process (clock)
2
--begin  
3
with bit_vector'(ha ,hb ,hc) select
4
  Sensorzustand <= To_unsigned( 0,10) when "001",  --Zeile 70
5
       To_unsigned( 2,10) when "011",
6
       To_unsigned( 4,10) when "010",
7
         To_unsigned( 6,10) when "110",
8
        To_unsigned( 8,10) when "100",
9
       To_unsigned(10,10) when "101",
10
       To_unsigned(12,10) when others;
11
--end process;

robert schrieb:
> motorbestromung: process (clock)
Allerdings taucht der clock im ganzen Prozess nicht auf. Fazit: die 
Simulation ist falsch. Sie passt nicht zur erzeugten Hardware. Das 
taucht aber garantiert in den Meldungen auf, und das hatte ich schon vor 
einer Woche mal geschrieben...

> type Motorzustaende is array (0 to 5) of integer;
Wozu für 4 unterschiedliche Werte (=2 Bit) ein uneingeschränkter Integer 
mit 32 Bit?

robert schrieb:
> das Signal Sensorzustand bei zwei verschiedenen Ereignissen zu
> verändern. Ein mal, so wie schon geschieben, bei veränderung der
> Hallsensoren und zum andern 5 Decodertackte nach einer veränderung des
> Sensorzustandes.
Du brauchst einen Zustandsautomaten und/oder einen Zähler.

> Hat jemand eine idee wie ich das günstig schreiben kann?
Zeichne eine Hardware, die das machen würde, auf ein Blatt Papier und 
beschreibe diese Hardware mit VHDL.

: Bearbeitet durch Moderator
Beitrag #5070407 wurde von einem Moderator gelöscht.
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.