Forum: FPGA, VHDL & Co. Simulation und Design falsch kompiliert?


von Günter (Gast)


Angehängte Dateien:

Lesenswert?

Liebe Kollegen!

Ich habe ein Design mit 60 PWM´s als Ausgang. Jeder Ausgang hängt an 
einer eigenen Entity (eine Entity 60 mal verwendet).
Wenn ich das ganze simuliere gehen alle 60. Wenn ich das Desing auf den 
FPGA spiele gehten etliche nicht.

Ich habe schon die Project Files gelöscht, ein anderes FPGA Board 
genommen und versucht die Zuordnung im UCF zu drehen (PWM3 Ausgang mit 
PWM4 Ausgang getauscht. Wobei 3 geht und 4 nicht).
1
--...
2
NET "pwm[2]" LOC = am20;
3
NET "pwm[4]" LOC = ap32;
4
NET "pwm[3]" LOC = an25;
5
NET "pwm[5]" LOC = ah25;
6
--...
7
--ML605 Board

Die Simulation sieht auch eigenartig aus. Für andere (!) Ausgänge sollen 
Signale vorbereitet werden und dann seriell rausgetaktet. Alle 16-Bit 
Signale werden in einem For Loop generiert. In der Simulation sollten 
alle Singale gleich sein da ich ihnen auch den gleichen 
Vergleichsparameter vorgebe (am Board wird da gemessen). 
Interessanterweise sind einige Singale 0 !?
Dazu kommt, dass mein Counter von 7 auf 16 Springt!!?? (Bild angehängt)
1
--Testbench
2
--...
3
wait for 100 ns;  
4
    ddc246_in <= (others => "0000000011111000");
5
--...
1
--code
2
--...
3
constant c_ddc246_comp : t_sollwert := ((others=> "1111111111111111"));
4
--...
5
6
for i in 0 to 59 loop
7
    if s_ddc246_in(i) < c_ddc246_comp(i) and s_data_o(i) /= "1111111111" then
8
      s_data_o(i) <= unsigned(s_data_o(i)) + 1;
9
    elsif s_ddc246_in(i) > c_ddc246_comp(i) and s_data_o(i) /= "0000000000" then
10
      s_data_o(i) <= unsigned(s_data_o(i)) - 1;
11
    else 
12
      s_data_o(i) <= s_data_o(i);
13
    end if;
14
  end loop;
15
--...

HELP!!! Ich hab schon erfolglos nach Vieren gesucht. Jetzt fällt mir 
nichts mehr ein.

DANKE
Günter

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


Lesenswert?

Günter schrieb:
> Ich hab schon erfolglos nach Vieren gesucht.
Mal echt: ist das ein Witz?

Häng doch mal die VHDL-Datei hier an. Der Fehler steckt vermutlich nicht 
im geposteten Code...

Günter schrieb:
> Wenn ich das ganze simuliere gehen alle 60.
> ...
> Die Simulation sieht auch eigenartig aus.
Ja, was denn nu?

Eine Frage: brauchst du wirklich 60 komplett unabhängige PWM Signale, 
oder würde auch ein einziger Zähler und 60 Vergleicher reichen? Muss das 
unbedingt eine symmetrische PWM (mit Auf und Ab-Zähler) sein?

von Günter (Gast)


Lesenswert?

Die Simulation der 60 PWM´s geht. Die Simulation die nicht geht bezieht 
sich auf eine andere Entity.

Ja. Leider brauche ich 60 unabhängige PWM´s.

von Duke Scarring (Gast)


Angehängte Dateien:

Lesenswert?

Günter schrieb:
> Wenn ich das ganze simuliere gehen alle 60. Wenn ich das Desing auf den
> FPGA spiele gehten etliche nicht.
Da gibt es eine Angabe im Datenblatt, wie viele IO gleichzeitig schalten 
dürfen (SSO). Vielleicht ist das bei Dir ein Problem.

Beim Spartan6 z.B. ist die Angabe im DS192 zu finden. Ein Auszug davon 
im Anhang.

Duke

von Heinrich (Gast)


Lesenswert?

Das Limit bezieht sich aber nur auf die Zahl dahingehend, dass die in 
der SPEc schalten. Bei mehr, geht die Flanke mehr in den Keller, als in 
de SPECs berücksichtigt. Da muss man sich eine flachere Fanke denken, 
mehr nicht. Die PWM muss trottzdem zu sehen sein, gfs minimal schlechter 
dem Wert folgen.

von Duke Scarring (Gast)


Lesenswert?

Heinrich schrieb:
> Das Limit bezieht sich aber nur auf die Zahl dahingehend, dass die in
> der SPEc schalten. Bei mehr, geht die Flanke mehr in den Keller, als in
> de SPECs berücksichtigt. Da muss man sich eine flachere Fanke denken,
> mehr nicht.
Sicher?
Ich hätte da u.A. erwartet, das die Stromversorgung nicht mehr 
hinterherkommt und die Spannung einbricht.


Günter schrieb:
> Die Simulation sieht auch eigenartig aus.
Ist Deine foor loop innerhal eines getakteten Prozesses?
Wo werden die Signale s_ddc246_in(i) und c_ddc246_comp(i) generiert?

Duke

P.S.: Mit kompletten Code und funktionierender Testbench, wäre die 
Fehlersuche für das Forum nachvollziehbar.

von Günter (Gast)


Lesenswert?

DANKE!

Ich werde mir die Angaben aus dem Datenblatt suchen.

Test Bench:
1
LIBRARY ieee;
2
USE ieee.std_logic_1164.ALL;
3
use work.Lady_pkg.all;
4
-- Uncomment the following library declaration if using
5
-- arithmetic functions with Signed or Unsigned values
6
--USE ieee.numeric_std.ALL;
7
 
8
ENTITY DAC108S085_DATA_TB IS
9
END DAC108S085_DATA_TB;
10
 
11
ARCHITECTURE behavior OF DAC108S085_DATA_TB IS 
12
 
13
    -- Component Declaration for the Unit Under Test (UUT)
14
 
15
    COMPONENT DAC088S085_data
16
    PORT(
17
         conv : in std_logic;
18
        reset : in std_logic;
19
        ddc246_in  : t_data_DDC246;
20
        pattern : in std_logic_vector (4 downto 0);
21
        sollwert   : in std_logic_vector (6 downto 0);
22
        data_o : out  t_data_DAC088S085
23
        );
24
    END COMPONENT;
25
    
26
27
   --Inputs
28
   signal conv : std_logic := '0';
29
   signal reset : std_logic := '1';
30
   signal ddc246_in : t_data_DDC246 := ((others=> ("0000000000000000")));
31
   signal sollwert   :  std_logic_vector (6 downto 0) := "0010000";
32
   signal pattern : std_logic_vector (4 downto 0) := "00000";
33
   --Outputs
34
   signal data_o : t_data_DAC088S085;
35
36
   -- No clocks detected in port list. Replace <clock> below with 
37
   -- appropriate port name 
38
 
39
   
40
 
41
BEGIN
42
reset <= '0' after 37 ns;
43
conv <= not conv after 7.5 ns;
44
  
45
  -- Instantiate the Unit Under Test (UUT)
46
   uut: DAC088S085_data PORT MAP (
47
          conv => conv,
48
          reset => reset,
49
       sollwert => sollwert,
50
          ddc246_in => ddc246_in,
51
       data_o => data_o,
52
       pattern => pattern
53
54
        );
55
56
   -- Clock process definitions
57
  
58
 
59
60
   -- Stimulus process
61
   stim_proc: process
62
   begin    
63
      -- hold reset state for 100 ns.
64
      wait for 100 ns;  
65
    ddc246_in <= (others => "0000000011111000");
66
    
67
    wait for 100 ns;
68
    ddc246_in <= (others => "1111111111111111");
69
    
70
    wait for 100 ns;  
71
    ddc246_in <= (others => "1111111011111000");
72
    
73
    wait for 100 ns;  
74
    ddc246_in <= (others => "0001111100000000");
75
    
76
    wait for 100 ns;
77
    ddc246_in <= (others => "1111111011111000");
78
    
79
    wait for 100 ns;
80
      -- insert stimulus here 
81
82
      wait;
83
   end process;
84
85
END;

Auf dem Board wird s_ddc246_in(i) seriell eingelesen (externer IC) und 
von einer Entity parallel weitergegeben.
c_ddc246_comp(i) steht hardcoded in einem Package. (60 x 
std_logic_vector (16 downto 0).

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


Lesenswert?

Heinrich schrieb:
> Da muss man sich eine flachere Fanke denken, mehr nicht.
Und weshalb? Weil die Versorgung für die IO-Zellen /im FPGA/ kurzzeitig 
wegknickt. Bei genügend großer Überschreitung des Werts evtl. so stark, 
dass die IO-Zellen ihre Konfiguration verlieren, oder sonstwas 
passiert...

Günter schrieb:
> Wenn ich das ganze simuliere gehen alle 60. Wenn ich das Desing auf den
> FPGA spiele gehten etliche nicht.
Und was passiert, wenn du das mal Schritt für Schritt angehst, und erst 
mal 1 in Betrieb nimmst, dann 10, dann 30, dann 60?
Wie sagten schon die römischen Kaiser?
http://de.wikipedia.org/wiki/Divide_et_impera

von Duke Scarring (Gast)


Lesenswert?

@Günter
Ich kann Deine Testbench leider nicht compilieren:
1
$ vlib work
2
3
$ vcom pwm60_tb.vhd
4
Model Technology ModelSim SE-64 vcom 10.1d Compiler 2012.11 Nov  1 2012
5
-- Loading package STANDARD
6
-- Loading package TEXTIO
7
-- Loading package std_logic_1164
8
** Error: (vcom-11) Could not find work.lady_pkg.
9
###### pwm60_tb.vhd(3): use work.Lady_pkg.all;
10
** Error: pwm60_tb.vhd(3): (vcom-1195) Cannot find expanded name "work.Lady_pkg".
11
** Error: pwm60_tb.vhd(3): Unknown expanded name.
12
###### pwm60_tb.vhd(8): ENTITY DAC108S085_DATA_TB IS
13
** Error: pwm60_tb.vhd(8): VHDL Compiler exiting
Wenn ich das lady-Package auskommentiere kommt das:
1
$ vcom pwm60_tb.vhd
2
Model Technology ModelSim SE-64 vcom 10.1d Compiler 2012.11 Nov  1 2012
3
-- Loading package STANDARD
4
-- Loading package TEXTIO
5
-- Loading package std_logic_1164
6
-- Compiling entity DAC108S085_DATA_TB
7
-- Compiling architecture behavior of DAC108S085_DATA_TB
8
###### pwm60_tb.vhd(19):         ddc246_in  : t_data_DDC246;
9
** Error: pwm60_tb.vhd(19): (vcom-1136) Unknown identifier "t_data_DDC246".
10
###### pwm60_tb.vhd(22):         data_o : out  t_data_DAC088S085
11
** Error: pwm60_tb.vhd(22): (vcom-1136) Unknown identifier "t_data_DAC088S085".
12
###### pwm60_tb.vhd(30):    signal ddc246_in : t_data_DDC246 := ((others=> ("0000000000000000")));
13
** Error: pwm60_tb.vhd(30): (vcom-1136) Unknown identifier "t_data_DDC246".
14
###### pwm60_tb.vhd(34):    signal data_o : t_data_DAC088S085;
15
** Error: pwm60_tb.vhd(34): (vcom-1136) Unknown identifier "t_data_DAC088S085".
16
###### pwm60_tb.vhd(85): END;
17
** Error: pwm60_tb.vhd(85): VHDL Compiler exiting

Du kannst Dateien auch als Anhang zu einem Beitrag anlegen. Da muß man 
nicht soviel scrollen.

Duke

von Günter (Gast)


Lesenswert?

Gute Idee. Ich werde das reduzieren.
Im ersten Design laufen nur 6 PWM´s. Da geht alles.
Leider laufen genau diese 6 PWM´s auch im Design mit 60 also kann ich 
keine Aussage dazu treffen.

Naja, ich kann die Packages abgespeckt dazugeben. Sobald ich aus meiner 
Besprechung wieder am Platz bin mache ich das.

LG
Günter

von Günter (Gast)


Angehängte Dateien:

Lesenswert?

Package

von Duke Scarring (Gast)


Lesenswert?

So. Wir sind ein Stück weiter:
1
vcom pwm60_tb.vhd
2
Model Technology ModelSim SE-64 vcom 10.1d Compiler 2012.11 Nov  1 2012
3
-- Loading package STANDARD
4
-- Loading package TEXTIO
5
-- Loading package std_logic_1164
6
-- Loading package std_logic_arith
7
-- Loading package NUMERIC_STD
8
-- Loading package Lady_pkg
9
-- Compiling entity DAC108S085_DATA_TB
10
-- Compiling architecture behavior of DAC108S085_DATA_TB
11
12
13
$ vsim -gui DAC108S085_DATA_TB
14
# ** Error: pwm60_tb.vhd(54): (vopt-3473) Component instance "uut : DAC088S085_data" is not bound.

Jetzt fehlt nur noch das passende Herzstück :-)

Duke

von Günter (Gast)


Lesenswert?

Sorry, ich muss einiges an Kommentaren rauslöschen deshalb nicht als 
Datei. Sonst bekomme ich probleme wegen der Verschwiegenheitsklausel 
usw.
1
library IEEE;
2
use IEEE.std_logic_1164.all;
3
use ieee.std_logic_arith.all;
4
use ieee.std_logic_unsigned.all;
5
use work.PWM_pkg.all;
6
use work.Lady_pkg.all;
7
8
entity DAC088S085_data is
9
    Port ( conv : in std_logic;
10
        reset : in std_logic;
11
        ddc246_in  : t_data_DDC246;
12
        pattern : in std_logic_vector (4 downto 0);
13
        sollwert   : in std_logic_vector (6 downto 0);
14
        data_o : out  t_data_DAC088S085);
15
end DAC088S085_data;
16
17
architecture Behavioral of DAC088S085_data is
18
19
type t_s_data_DAC088S085  is array (0 to 63) of std_logic_vector (9 downto 0);
20
21
signal s_data_o :   t_s_data_DAC088S085 := ((others=> (c_start_current)));
22
signal s_ddc246_in  :    t_data_DDC246 := ((others=> ("0000000000000000")));
23
24
begin
25
26
p_regelung : process (conv, reset)
27
28
begin
29
30
if reset = '1' then
31
  s_data_o <= ((others=> (c_start_current)));
32
  for i in 0 to 59 loop
33
    if s_ddc246_in(i) < c_ddc246_comp(i) and s_data_o(i) /= "1111111111" then
34
      s_data_o(i) <= unsigned(s_data_o(i)) + 1;
35
    elsif s_ddc246_in(i) > c_ddc246_comp(i) and s_data_o(i) /= "0000000000" then
36
      s_data_o(i) <= unsigned(s_data_o(i)) - 1;
37
    else 
38
      s_data_o(i) <= s_data_o(i);
39
    end if;
40
  end loop;
41
  for a in 0 to 59 loop
42
    for b in 0 to 15 loop
43
      s_ddc246_in(a)(b) <= ddc246_in(a)(b); --Little to Big Endian
44
    end loop;
45
  end loop;
46
end if;
47
end process;
48
49
  data_o <= (s_data_o(17),s_data_o(48),s_data_o(36),s_data_o(0),c_start_current,c_start_current,c_start_current,c_start_current,
50
          s_data_o(27),s_data_o(54),s_data_o(8),s_data_o(32),s_data_o(20),s_data_o(50),s_data_o(5),s_data_o(1),
51
          s_data_o(31),s_data_o(57),s_data_o(14),s_data_o(35),s_data_o(26),s_data_o(56),s_data_o(43),s_data_o(3),
52
          s_data_o(60),s_data_o(19),s_data_o(6),s_data_o(33),s_data_o(53),s_data_o(18),s_data_o(37),s_data_o(12),
53
          s_data_o(62),s_data_o(24),s_data_o(11),s_data_o(9),s_data_o(61),s_data_o(22),s_data_o(40),s_data_o(34),
54
          s_data_o(28),s_data_o(49),s_data_o(38),s_data_o(2),s_data_o(21),s_data_o(25),s_data_o(47),s_data_o(42),
55
          s_data_o(30),s_data_o(55),s_data_o(7),s_data_o(41),s_data_o(29),s_data_o(52),s_data_o(39),s_data_o(4),
56
          s_data_o(63),s_data_o(58),s_data_o(15),s_data_o(46),s_data_o(23),s_data_o(59),s_data_o(44),s_data_o(10));
57
58
  
59
60
  
61
end Behavioral;

von Duke Scarring (Gast)


Lesenswert?

Ohje. Da ist ja gar kein Takt im Spiel :-(
Für eine PWM nimmt man einen Zähler, der im Takt inkrementiert wird. Der 
Zählerstand wird mit einem bestimmten Wert verglichen. Wenn der 
Zählerstand größer als der Vergleichswert ist, dann wird '1' ausgegeben, 
sonst '0'.

Die Bitbreite des Zählers ergibt die mögliche PWM-Auflösung. 
Taktfrequenz des Zählers dividiert durch 2^Bitbreite ergibt die 
entsprechende PWM-Frequenz.

Duke

von Günter (Gast)


Lesenswert?

Hab ich aus versehen mit den Kommentaren rausgelöscht.
1
--...
2
begin
3
4
if reset = '1' then
5
  s_data_o <= ((others=> (c_start_current)));
6
7
elsif conv'event and conv = '1' then
8
  for i in 0 to 59 loop
9
    if s_ddc246--...

Sorry

von Günter (Gast)


Lesenswert?

Dieser Teil hat auch nichts mit der PWM zu tun.

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


Lesenswert?

Duke Scarring schrieb:
> Ohje. Da ist ja gar kein Takt im Spiel :-(
1
if reset = '1' then ...
2
      s_data_o(i) <= unsigned(s_data_o(i)) + 1;
Das wäre kombinatorische Schleife...   :-o
http://www.lothar-miller.de/s9y/archives/42-Kombinatorische-Schleifen.html

Ich vermute aber eher, dass da zuviel rausgelöscht wurde, denn die TB 
hat einen Takt wie Günter schrieb:
> conv <= not conv after 7.5 ns;
>
>   -- Instantiate the Unit Under Test (UUT)
>    uut: DAC088S085_data PORT MAP (
>           conv => conv,
Und dieser conv (was ist das eigentlich für ein Name für einen Takt... 
hmmm... Wieviele Takte gibt es denn in dem Design?) taucht ja auch in 
der Sensitivliste des Prozesses auf:
> p_regelung : process (conv, reset)

Günter schrieb:
> Dieser Teil hat auch nichts mit der PWM zu tun.
Nein? Ich würde schwören, das sind die Zähler für die PWM...

von Patrick (Gast)


Lesenswert?

Günter schrieb:
> Sorry, ich muss einiges an Kommentaren rauslöschen deshalb nicht als
> Datei. Sonst bekomme ich probleme wegen der Verschwiegenheitsklausel
> usw.

Hä? Was hat das Eine mit dem Anderen zu tun? - Es gibt auch Programme, 
sogenannte "Texteditoren", die das Bearbeiten von Textdateien vor dem 
Hochladen ermöglichen. Und es gibt auf allen mir bekannten 
Betriebssystemen die Möglichkeit, eine sogenannte "Kopie" anzulegen und 
diese dann abzuspecken, zu bearbeiten und hochzuladen.

Sorry, aber so wird nur die Geduld der Hilfsbereiten unnötigerweise auf 
die Probe gestellt.

von Günter (Gast)


Lesenswert?

Guten Morgen!

Kann mir schon jemand einen Tip geben wo mein Fehler ist?

Ich werde auf jeden Fall heute versuchen die Anzahl der PWM´s auf 10 zu 
reduzieren und hoffe auf ein positiveres Ergebnis.

von Duke Scarring (Gast)


Lesenswert?

Kannst Du denn bitte den Quelltext einstellen, bei dem es nicht geht?! 
Meinetwegen als Minimalbeispiel ohne third-party-Code.

Duke

von Günter (Gast)


Lesenswert?

Der Quelltext von der nicht funktionierenden Simulation ist schon 
eingestellt (Test Bench auch).

An den PWM´s muss ich noch ein bischen herumdoktern.

von Duke Scarring (Gast)


Lesenswert?

Günter schrieb:
> Der Quelltext von der nicht funktionierenden Simulation ist schon
> eingestellt (Test Bench auch).
Die Testbench hab ich gefunden.
Wo ist der komplette Quelltext am Stück?
Ich kopiere mir doch nicht aus x-Postings den möglichen Quelltext des 
Threaderstellers zusammen :-(

Duke

von Günter (Gast)


Lesenswert?

Ich hab einen neuen Versuch bezüglich PWM´s gestartet. Ganz einfaches 
Design. Alle PWM´s auf fix '0' und sonst nichts im Design.

Eigenartigerweise invertieren die P Ausgänge vom FPGA (?) - alle 
Ausgänge somit auf '1' - und die PWM´s die nicht gehen funktionieren 
immer noch nicht.

Laut Liste sind das aber ganz normale I/O´s!?
z.B.: der AP32 gent nicht aber AN25 geht???

Ich kann doch nicht zu dumm sein einen I/O auf 1 zu legen?? (bitte keine 
Antwort auf darauf!!!) ;)

LG
Günter

von Duke Scarring (Gast)


Lesenswert?

Günter schrieb:
> Laut Liste sind das aber ganz normale I/O´s!?
> z.B.: der AP32 gent nicht aber AN25 geht???
Was hast Du denn für einen Chip?

Duke

von Günter (Gast)


Lesenswert?

Xilinx ML605 Evaluation Kit
Virtex XC6VLX240T-1FFG1156

von Christian R. (supachris)


Lesenswert?

Und wo ist da ein Pin namens AP32 und AN25? Ich seh am Virtex nur 
Pin-Bezeichnungen mit z.B. IO_L0P_13 oder IO_L0N_13.

von Günter (Gast)


Lesenswert?


von Christian R. (supachris)


Lesenswert?

Achso, die Ball-Nummern des BGA Gehäuses. Na die haben ja relativ wenig 
zu sagen.

von Günter (Gast)


Lesenswert?

Hast recht

von Duke Scarring (Gast)


Lesenswert?

Duke Scarring schrieb:
>> Laut Liste sind das aber ganz normale I/O´s!?
>> z.B.: der AP32 gent nicht aber AN25 geht???
Dann schau mal in den Schaltplan [1]:
AN25 -> Bank 23 -> V_Bank23 = VCC2V5_FPGA
AP32 -> Bank 12 -> V_Bank12 = FMC_VIO_B_M2C

Hast Du eine FMC-Karte drauf, die den Pin FMC_VIO_B_M2C mit Spannung 
versorgt?

Duke

[1] 
http://www.xilinx.com/support/documentation/boards_and_kits/xtp052_ml605_schematics.pdf

von Duke Scarring (Gast)


Angehängte Dateien:

Lesenswert?

P.S.: Das steht auch als Fußnote im UG534 drin. Siehe Anhang.

von Günter (Gast)


Lesenswert?

Nein, ich hab eine selbst gebaute Karte drauf.

Was muss ich wo versorgen? Ich muss mir das genau durchlesen.

von Günter (Gast)


Lesenswert?

Ja, SUPER!!!! Das scheint es zu sein.
Der erste Fehler ist anscheinend erklärt.

DANKE!!!

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.