Forum: FPGA, VHDL & Co. Frage zum Sparten 3A


von Peter F. (widlarizer)


Lesenswert?

Hallo zusammen!

Ich bin relativ neu in der FPGA Welt und stehe momentan vor einem 
konkreten Problem...oder gar mehreren Problemen :-)

Zur Verfügung steht mir das Xilinx Spartan 3A Starter Kit und ISE 14.6.
Ich möchte eine Art "Dummy-Logik" in Form von miteinander verschalteten 
(N)OR, (N)AND, XOR-Gattern usw. Gattern auf dem FPGA realisieren.

Dabei habe ich das Ziel mindestens 50% des FPGA "voll zu kriegen".
Meine erste Frage hierbei:
Wie realisiere ich so eine Dummy-Logik am einfachsten in VHDL? Klar, ich 
schreibe mir für jedes Gatter ein entsprechendes Modell und instanziiere 
das anschließend in einer weiteren VHDL Datei inkl. port mapping...aber 
das könnte doch etwas arf aufwändig werden, den FPGA damit zu "füllen" 
:-)
(Übrigens: ich kann mich doch auf diese grundlegenden, nicht getakteten 
Gatter beschränken, oder? Ich meine, ich muss dafür nicht zwingend 
getaktete FlipFlops einsetzen, nicht wahr?)

Ich gehe mal davon aus, dass mir ISE 14.6 die Möglichkeit gibt, die 
Anzahl der verwendeten Gatter anzeigen zu lassen? Also mit anderen 
Worten: den "Füllgrad" des Spartan 3A Chips. Kann mir hierzu jemand was 
sagen?

Wie ihr seht, stehe ich noch ziemlich am Anfang, von daher nehmt es mir 
nicht übel, wenn ich hier irgendwelchen Schmarrn aufgeschrieben habe. 
Ich gelobe Besserung!

Besten Dank für eure Hilfe im Voraus!

Grüße
Kai

von Sigi (Gast)


Lesenswert?

Arbeite dich in VHDL ein. In VHDL gibt es z.B. Methoden
wie GENERATE, damit lassen sich dann baumartige/listenartige
Konstrukte aus Komponenten aufbauen.

Sowas habe ich mal selbst mal gemacht um probehalber das
FPGA vollzuschreiben. Eine Listenstruktur wird gut in ein
FPGA gemappt, eine 2-dim Struktur (z.B. zwei Eingänge von
2 Komponenten, 2 Ausgänge an 2 Komponenten) wird ebenfalls
gut gemappt. Damit kriegt man jedes FPGA voll.

von Peter F. (widlarizer)


Lesenswert?

Hallo Sigi,

der Hinweis auf GENERATE ist schon mal sehr gut! Danke!
Könntest du mir noch ein wenig genauer beschreiben, was du mit der 2-dim 
Struktur meinst? Ich bin mir nicht sicher, ob ich dein erwähntes 
Beispiel richtig verstanden habe.

von Fpgakuechle K. (Gast)


Lesenswert?

Peter Falk schrieb:

> Zur Verfügung steht mir das Xilinx Spartan 3A Starter Kit und ISE 14.6.
> Ich möchte eine Art "Dummy-Logik" in Form von miteinander verschalteten
> (N)OR, (N)AND, XOR-Gattern usw. Gattern auf dem FPGA realisieren.
>
> Dabei habe ich das Ziel mindestens 50% des FPGA "voll zu kriegen".
> Meine erste Frage hierbei:
> Wie realisiere ich so eine Dummy-Logik am einfachsten in VHDL? Klar, ich
> schreibe mir für jedes Gatter ein entsprechendes Modell und instanziiere
> das anschließend in einer weiteren VHDL Datei inkl. port mapping...aber
> das könnte doch etwas arf aufwändig werden, den FPGA damit zu "füllen"
> :-)

> Ich gehe mal davon aus, dass mir ISE 14.6 die Möglichkeit gibt, die
> Anzahl der verwendeten Gatter anzeigen zu lassen? Also mit anderen
> Worten: den "Füllgrad" des Spartan 3A Chips. Kann mir hierzu jemand was
> sagen?



Die Auslastung des FPGA's steht im Map report und im Place und route 
report. Der wird nicht in gattern sondern in Slices gemessen. Zum füllen 
schue dir mal die generate anweisung an.

Beispiel Großes shiftregister:

1
--eThermalload.vhd
2
library ieee;
3
use ieee.std_logic_1164.all;
4
library UNISIM;
5
use UNISIM.VComponents.SRLC32E;
6
use UNISIM.VComponents.FDD;
7
8
entity eThermalLoad is
9
   generic (
10
      G_NUMBER_FF  : integer := 1000;
11
      G_NUMBER_SRL : integer := 1000);
12
   port (
13
      rst           : in  std_logic;
14
      clk           : in  std_logic;
15
      onoff_ff      : in  std_logic;
16
      onoff_srl     : in  std_logic;
17
      dummy_out_ff  : out std_logic;
18
      dummy_out_srl : out std_logic);
19
20
end eThermalLoad;
21
22
architecture behave of eThermalLoad is
23
attribute BOX_TYPE : string;
24
25
26
   signal ff_chain_q  : std_logic_vector(G_NUMBER_FF  downto 0);
27
   signal srl_chain_q : std_logic_vector(G_NUMBER_SRL downto 0);
28
   signal head_chain_q,onoff : std_logic_vector(1 downto 0);
29
30
   
31
begin  -- behave
32
   
33
 --toggle FF feeding delay chain
34
onoff <= onoff_srl & onoff_ff;
35
   
36
37
G_chain_head : for i in 1 downto 0 generate
38
   process(clk)
39
   begin
40
      if rising_edge(clk) then
41
         if rst = '1' then
42
            head_chain_q(i) <= '1';
43
         elsif onoff(i) = '1' then
44
            head_chain_q(i) <= not head_chain_q(i);
45
         else
46
            head_chain_q(i) <= head_chain_q(i);
47
         end if;
48
      end if;
49
   end process;
50
end generate G_chain_head;
51
52
 ff_chain_q(0) <= head_chain_q(0);
53
54
 G_srl_chain: for i in 0 to G_NUMBER_SRL - 1  generate
55
    srl_delay:UNISIM.VComponents.SRLC32E
56
    -- synthesis translate_off
57
       generic map (
58
          INIT => X"55555555")
59
    -- synthesis translate_on
60
       port map (
61
          clk => clk,
62
          d   => srl_chain_q(i),
63
          q   => open,
64
          q31 => srl_chain_q(i+1),
65
          A   => "11111",               --32 bit deep
66
          ce  => '1');
67
 end generate G_srl_chain;
68
69
dummy_out_srl <= srl_chain_q(G_NUMBER_SRL) when G_NUMBER_SRL /= 0 else '0';
70
    
71
 srl_chain_q(0) <= head_chain_q(1);
72
73
 G_ff_chain: for i in 0 to G_NUMBER_FF - 1  generate
74
    ff_delay: UNISIM.VComponents.FDCPE
75
    -- synthesis translate_off
76
       generic map (
77
          INIT => '1')
78
    -- synthesis translate_on
79
       port map (
80
          c   => clk,
81
          d   => ff_chain_q(i),
82
          q   => ff_chain_q(i+1),
83
          ce  =>  '1',
84
          clr   =>  '0',
85
          pre   =>  '0');
86
    end generate G_ff_chain;
87
   
88
89
--end of chain:
90
 dummy_out_ff  <=  ff_chain_q(G_NUMBER_FF) when G_NUMBER_FF /= 0 else '0'; 
91
92
end behave;


Einzelne Gatter wird schwierig, da im FPGA das meiste aus LUT's 
gebastelt wird.

MfG,

von Peter F. (widlarizer)


Lesenswert?

Hallo Fpga Kuechle,

wooow, Danke für das wirklich sehr ausführliche Beispiel...ich äh...muss 
das erstmal verstehen :-)
Könnte ich anstatt der Basis-Gatter auch einfach Volladdierer nehmen? 
Der VHDL Code eines Volladdierers ist für mich zu diesem Zeitpunkt etwas 
einfacher zu verstehen als der des oben genannten shiftregisters (so 
froh ich auch darüber bin, dass du das freundlicherweise hier gepostet 
hast).

von Fpgakuechle K. (Gast)


Lesenswert?

Peter Falk schrieb:
> Hallo Fpga Kuechle,
>
> wooow, Danke für das wirklich sehr ausführliche Beispiel...ich äh...muss
> das erstmal verstehen :-)

Danke, danke hat ich noch in der Schublade, wurde mal gebraucht um die 
Entwärmung eines Virtex zu testen.


> Könnte ich anstatt der Basis-Gatter auch einfach Volladdierer nehmen?

Im Prinzip ja, counter wäre auch eine Möglichkeit, einfach einen langen 
std_logic_vector definiieren (zb. 9999 downto 0) und immer eins 
addieren.


MfG,

von Peter F. (widlarizer)


Lesenswert?

Wenn ich irgendwann soweit bin, sowas in der Schublade zu haben, dann 
klope ich mir auf die Schulter und mache mir ein Bier auf :-)

Die Implementierung eines Counters mit dem von dir vorgeschlagenen 
std_logic_vector würde schon reichen (um den FPGA zu füllen)? Verstehe 
an dieser Stelle aber noch nicht ganz, warum es nötig wäre immer 1 zu 
addieren?
Diese Addition würde ich in meiner naiven Vorstellung eher in einen 
process einer Testbench packen und nicht in den Code des Counters an 
sich...? (denn der soll ja nur rein "statisch" in den FPGA geladen 
werden und es sich dort gemütlich machen :-) )

von Falk B. (falk)


Lesenswert?


von Peter F. (widlarizer)


Lesenswert?

Hallo Falk,

habe mir den Code angeschaut und den Artikel dazu gelesen. Nehme mal an, 
dass du den Link hier gepostet hast, um die dort beschriebene 
Implementierung als gutes Beispiel fürs "FPGA-füllen" nutzen zu können? 
:-)

Schaue ich mir diesen Codeschnipsel an

-- BUFG (Global Clock buffer), a Virtex primitive

component BUFG

   port (  I   : in    std_logic;
           O   : out   std_logic);

so macht mir der Hinweis im Kommentar "a Virtex primitive" ein wenig 
Sorgen, denn ich habe nur einen Spartan 3A. Ist das an dieser Stelle 
unerheblich?

von Peter F. (widlarizer)


Lesenswert?

Hi Falk,

habe noch einen kleinen Nachtrag zum VHDL Code im besagten Link:
Nachdem ich im ISE ein neues Projekt erzeugt und beide VHDL Codes in je 
eine separate Datei kopiert habe, erzeugt der Check Syntax Befehl leider 
ein paar Fehlermeldungen:
Undefined symbol 'drive_ar'.
Undefined symbol 'dout_ar'.
Formal data of row with no default value must be associated with an 
actual value.
No sensitivity list and no wait in the process
Undefined symbol 'cnt'.

Eigentlich bin ich davon ausgegangen, dass der Sourcecode fehlerfrei 
vorliegt (und tue es nach wie vor), von daher vermute ich den Fehler 
jetzt einfach mal bei mir.

Das row Modul habe ich zu dem Projekt mit dem power Modul korrekt 
hinzugefügt. Hast du eine Idee woran das liegen könnte?

Darüber hinaus werden die Komponenten CLKDLL, BUFG, IBUFG und SRL16 
anscheinend angemeckert, da es sich laut Kommentar um Virtex primitives 
handelt...also kann ich den Code für eine Implementierung auf einem 
Spartan 3A wohl vergessen? :-(

von Peter F. (widlarizer)


Lesenswert?

@Fpga Kuechle:

Ich habe den Code des shiftregisters mal in die ISE gepackt und versucht 
das Alles in den FPGA zu laden. Leider schlägt der Syntaxcheck fehl. 
Offenbar hat er mit dem SRLC32E ein Problem, da genau das rot markiert 
wird.

Starte ich den Syntaxcheck, wirft er zwei Fehlermeldungen raus:

-- synthesis translate_on
       port map (
          clk => clk,
          d   => srl_chain_q(i),

Fehler: parse error, unexpected PORT, expecting OPENPAR or TICK or 
LSQBRACK

und noch

-- synthesis translate_on
       port map (
          c   => clk,
          d   => ff_chain_q(i),

Fehler: parse error, unexpected PORT, expecting OPENPAR or TICK or 
LSQBRACK

Weißt du vielleicht Rat?

von Falk B. (falk)


Lesenswert?

@ Peter Falk (widlarizer) alias Columbo

>Implementierung als gutes Beispiel fürs "FPGA-füllen" nutzen zu können?
>:-)

sicher.

>so macht mir der Hinweis im Kommentar "a Virtex primitive" ein wenig
>Sorgen, denn ich habe nur einen Spartan 3A. Ist das an dieser Stelle
>unerheblich?

Den gibt es auch als Spartan3A Version.

>ein paar Fehlermeldungen:
>Undefined symbol 'drive_ar'.
>Undefined symbol 'dout_ar'.
>Formal data of row with no default value must be associated with an
>actual value.
>No sensitivity list and no wait in the process
>Undefined symbol 'cnt'.

Mann muss ZWEI Dateien anlegen, in die 2. Kommt die entity row.

>Eigentlich bin ich davon ausgegangen, dass der Sourcecode fehlerfrei
>vorliegt

Ist er auch.

>Das row Modul habe ich zu dem Projekt mit dem power Modul korrekt
>hinzugefügt. Hast du eine Idee woran das liegen könnte?

Hmm?

>Darüber hinaus werden die Komponenten CLKDLL, BUFG, IBUFG und SRL16
>anscheinend angemeckert, da es sich laut Kommentar um Virtex primitives
>handelt...also kann ich den Code für eine Implementierung auf einem
>Spartan 3A wohl vergessen? :-(

Man muss in der Doku vom Spartan3 nachschauen, wie die Dinger dort 
heißen. Ähnlich, aber anders.

von Christoph Z. (christophz)


Lesenswert?

Peter Falk schrieb:
> Dabei habe ich das Ziel mindestens 50% des FPGA "voll zu kriegen".

Hatte mir sowas auch schon gebastelt, mit dem Ziel möglichst viele 
Flip-Flops zu toggeln (Test der Speisung). Das war am Schluss eine 
Pipeline aus sehr breiten Registern.

Eine Lektion die ich damals gelernt habe:
Der Synthesizer ist recht schlau, der merkt sofort wenn deine Logik nur 
rumsitzt und nichts nützliches (= Das Ergebnis wird verwendet) tut. Dann 
ist dein Füllgrad immer 0% :-)

Also darauf achten, dass deine Dummy-Logik am Schluss ein Ergebnis auf 
FPGA Pins ausgibt, sonst wird sie wegoptimiert.

von Falk B. (falk)


Lesenswert?

Hmpf, das "Problem" sind eni paar zerschossene Zeilen im Quelltext, da 
ist die Wiki(de)formatierung schuld. Siehe Anhang, kompiliert problemos 
durch.
Auch mit S3A.

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
6
entity power is
7
8
   Port ( clk_in  : in std_logic;                      -- clock input
9
          sel     : in std_logic_vector(1 downto 0);   -- select modulation ON/OFF
10
          gnd     : out std_logic_vector(5 downto 0);  -- artificial gnd
11
          mod_out : out std_logic;                     -- modulation signal
12
          reset   : in std_logic;                      -- reset for DLL
13
          dummy   : out std_logic);                    -- dummy out, to fool the synthesizer
14
          
15
16
end power;
17
18
architecture Behavioral of power is
19
20
COMPONENT row
21
22
   PORT(
23
       clk  : IN std_logic;
24
       data : IN std_logic;    
25
       dout : OUT std_logic
26
       );
27
28
END COMPONENT;
29
30
-- DLL (Delay Locked Loop), a Virtex primitive
31
32
component CLKDLL
33
34
   port (  
35
       CLKIN   : in    std_logic;
36
       CLKFB   : in    std_logic;
37
       RST     : in    std_logic;
38
       CLK0    : out   std_logic;
39
       CLK90   : out   std_logic;
40
       CLK180  : out   std_logic;
41
       CLK270  : out   std_logic;
42
       CLK2X   : out   std_logic;
43
       CLKDV   : out   std_logic;
44
       LOCKED  : out   std_logic);
45
46
end component;
47
48
-- BUFG (Global Clock buffer), a Virtex primitive
49
50
component BUFG
51
52
   port (  I   : in    std_logic;
53
           O   : out   std_logic);
54
55
end component;
56
57
-- IBUFG (Global Clock input buffer ), aa Virtex primitive
58
59
component IBUFG
60
61
   port (  I   : in    std_logic;
62
           O   : out   std_logic);
63
64
end component;
65
66
component SRL16 -- virtex primitive
67
68
 port (
69
       D    : in std_logic;        
70
       CLK  : in std_logic;
71
       A0   : in std_logic;
72
       A1   : in std_logic;
73
       A2   : in std_logic;
74
       A3   : in std_logic;        
75
       Q    : out std_logic
76
      ); 
77
78
end component;
79
80
constant rows: integer:=30;
81
82
type flop_array is array (rows-1 downto 0) of std_logic_vector(49 downto 0);
83
84
signal toggle  : std_logic; -- a toggle flipflop
85
signal ff_ar  : flop_array;
86
signal drive_ar : std_logic_vector (rows-1 downto 0); -- driver array for toggeling rows 
87
signal dout_ar  : std_logic_vector (rows-1 downto 0); -- driver array for toggeling rows 
88
signal or_ar  : std_logic_vector (rows-1 downto 0); -- driver array for toggeling rows 
89
signal cnt  : std_logic_vector (15 downto 0); -- modulation divider
90
91
signal CLKIN_w, RESET_w, CLK2X_dll, CLK2X_g, CLK4X_dll, CLK4X_g, CLK8X_dll, CLK8X_g: std_logic; 
92
signal LOCKED2X, LOCKED2X_delay, RESET4X, RESET8X, LOCKED4X, LOCKED4X_delay, LOCKED8X : std_logic;
93
94
signal logic1,clk : std_logic;
95
96
signal clk2x,clk4x,clk8x, clkmux: std_logic;
97
98
begin
99
100
-- use two DLL to get 147 MHz
101
102
logic1<='1';
103
104
clkpad : IBUFG port map (I=>CLK_IN, O=>CLKIN_w);
105
106
107
dll2x  : CLKDLL port map (CLKIN=>CLKIN_w, CLKFB=>CLK2X_g, RST=>RESET,
108
109
                         CLK0=>open,   CLK90=>open, CLK180=>open, CLK270=>open,
110
                         CLK2X=>CLK2X_dll, CLKDV=>open, LOCKED=>LOCKED2X);
111
112
clk2xg : BUFG port map (I=>CLK2X_dll, O=>CLK2X_g);
113
114
rstsrl : SRL16 port map (D=>LOCKED2X, CLK=>CLK2X_g, Q=>LOCKED2X_delay,
115
116
                         A3=>logic1, A2=>logic1, A1=>logic1, A0=>logic1);
117
118
RESET4X <= not LOCKED2X_delay;
119
120
dll4x  : CLKDLL port map (CLKIN=>CLK2X_g, CLKFB=>CLK4X_g, RST=>RESET4X,
121
122
                         CLK0=>open,   CLK90=>open, CLK180=>open, CLK270=>open,
123
                         CLK2X=>CLK4X_dll, CLKDV=>open, LOCKED=>LOCKED4X);
124
125
126
clk4xg : BUFG port map (I=>CLK4X_dll, O=>CLK4X_g);
127
128
clk<=clk4x_g;
129
130
-- the toggeling array
131
132
l_rows: for i in 0 to rows-1 generate
133
134
   Inst_row: row PORT MAP(
135
       clk  => clk,
136
       data => drive_ar(i),
137
       dout => dout_ar(i)
138
   );
139
 end generate;
140
141
-- combine all douts via a BIG or-gate
142
143
 process(dout_ar)
144
 variable tmp: std_logic;
145
 begin
146
   tmp:='0';
147
   l_or: for i in 0 to rows-1 loop
148
     tmp:=tmp or dout_ar(i);
149
   end loop;
150
   dummy<=tmp;
151
 end process;
152
153
-- prescaler
154
155
 process(clk)
156
 begin
157
   if clk='1' and clk'event then
158
     cnt<=cnt+1;
159
   end if;
160
 end process;
161
162
-- toggle fliplop and distribution
163
164
 process(clk)
165
 begin
166
   if clk='1' and clk'event then
167
     case sel is
168
       when "00"       => toggle <= '0';
169
       when "01"       => toggle <= not toggle;
170
       when "10"       => if cnt(15)='1' then toggle <= not toggle; else toggle<='0'; end if;
171
       when others     => null;
172
     end case;
173
     drive_ar<=(others=>toggle);
174
   end if;
175
 end process;
176
177
gnd<=(others=>'0'); 
178
mod_out<=cnt(15);
179
180
end Behavioral;

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
6
entity row is
7
8
   Port ( clk  : in std_logic;
9
          data : in std_logic;
10
          dout : out std_logic);
11
12
end row;
13
14
architecture Behavioral of row is
15
16
signal my_array: std_logic_vector (49 downto 0);
17
18
begin
19
20
-- generate 50 FFs with clock enable
21
22
 process (clk)
23
 begin
24
   if clk='1' and clK'event then
25
     my_array<=(others=>data);     
26
   end if;
27
 end process;
28
29
-- combine all into a BIG OR
30
31
 process(my_array)
32
 variable tmp: std_logic;
33
 begin
34
   tmp:='0';
35
   l: for i in 0 to 49 loop
36
     tmp:=tmp or my_array(i);
37
   end loop;
38
   dout<=tmp;
39
 end process;
40
41
end Behavioral;

von Leonard Lebewohl (Gast)


Lesenswert?

>Ich habe den Code des shiftregisters mal in die ISE gepackt und versucht
>das Alles in den FPGA zu laden. Leider schlägt der Syntaxcheck fehl.
>Offenbar hat er mit dem SRLC32E ein Problem, da genau das rot markiert
>wird.

Da fehlt das semicolon nach der schliessenden Klammer der generic map.

Das synthese tool sollt die generic map eigentlich garnicht sehen, 
deshalb ist da ein synthesis off/on drum. Dein synthesetool ignoriert 
aber diese als kommentare getarnten Compile-schalter. Am besten du 
löschts den block
zwischen -- synthesis translate_off und -- synthesis translate_on samt 
den beiden Zeilen -- synthesis translate_off und -- synthesis 
translate_on.

MfG,

von Peter F. (widlarizer)


Lesenswert?

Hallo zusammen,

bitte entschuldigt, dass ich bislang auf eure Vorschläge nicht reagiert 
habe. Bin noch im Büro und kann das leider erst am späten Nachmittag 
ausprobieren :-(
Sorry! Werde dann auf eure Postings einzeln antworten.

von Peter F. (widlarizer)


Lesenswert?

Hallo Leute,

bin leider erst heute dazu gekommen einen erneuten Versuch zu starten. 
Zunächst einmal zum shiftregister. Nach den Anmerkungen von Leonard 
Lebewohl sieht der Code wie folgt aus:
1
library ieee;
2
use ieee.std_logic_1164.all;
3
library UNISIM;
4
use UNISIM.VComponents.SRLC32E;
5
use UNISIM.VComponents.FDD;
6
7
entity eThermalLoad is
8
   generic (
9
      G_NUMBER_FF  : integer := 1000;
10
      G_NUMBER_SRL : integer := 1000);
11
   port (
12
      rst           : in  std_logic;
13
      clk           : in  std_logic;
14
      onoff_ff      : in  std_logic;
15
      onoff_srl     : in  std_logic;
16
      dummy_out_ff  : out std_logic;
17
      dummy_out_srl : out std_logic);
18
19
end eThermalLoad;
20
21
architecture behave of eThermalLoad is
22
attribute BOX_TYPE : string;
23
24
25
   signal ff_chain_q  : std_logic_vector(G_NUMBER_FF  downto 0);
26
   signal srl_chain_q : std_logic_vector(G_NUMBER_SRL downto 0);
27
   signal head_chain_q,onoff : std_logic_vector(1 downto 0);
28
29
   
30
begin  -- behave
31
   
32
 --toggle FF feeding delay chain
33
onoff <= onoff_srl & onoff_ff;
34
   
35
36
G_chain_head : for i in 1 downto 0 generate
37
   process(clk)
38
   begin
39
      if rising_edge(clk) then
40
         if rst = '1' then
41
            head_chain_q(i) <= '1';
42
         elsif onoff(i) = '1' then
43
            head_chain_q(i) <= not head_chain_q(i);
44
         else
45
            head_chain_q(i) <= head_chain_q(i);
46
         end if;
47
      end if;
48
   end process;
49
end generate G_chain_head;
50
51
 ff_chain_q(0) <= head_chain_q(0);
52
53
 G_srl_chain: for i in 0 to G_NUMBER_SRL - 1  generate
54
    srl_delay:UNISIM.VComponents.SRLC32E
55
56
       port map (
57
          clk => clk,
58
          d   => srl_chain_q(i),
59
          q   => open,
60
          q31 => srl_chain_q(i+1),
61
          A   => "11111",               --32 bit deep
62
          ce  => '1');
63
 end generate G_srl_chain;
64
65
dummy_out_srl <= srl_chain_q(G_NUMBER_SRL) when G_NUMBER_SRL /= 0 else '0';
66
    
67
 srl_chain_q(0) <= head_chain_q(1);
68
69
 G_ff_chain: for i in 0 to G_NUMBER_FF - 1  generate
70
    ff_delay: UNISIM.VComponents.FDCPE
71
 
72
       port map (
73
          c   => clk,
74
          d   => ff_chain_q(i),
75
          q   => ff_chain_q(i+1),
76
          ce  =>  '1',
77
          clr   =>  '0',
78
          pre   =>  '0');
79
    end generate G_ff_chain;
80
   
81
82
--end of chain:
83
 dummy_out_ff  <=  ff_chain_q(G_NUMBER_FF) when G_NUMBER_FF /= 0 else '0'; 
84
85
end behave;

Der Syntaxcheck funktioniert leider noch nicht einwandfrei. Anscheinend 
bereiten die port map Anweisungen noch Probleme, in beiden Fällen kommt 
als Fehlermeldung:
parse error, unexpected PORT, expecting OPENPAR or TICK or LSQBRACK

:-(

EDIT:
Was mir noch auffällt, ist dass das SRLC32E in der Anweisung
1
use UNISIM.VComponents.SRLC32E;
 vom Syntaxhighlighting rot markiert wird. Ist das "normal"? Habe ich so 
bisher noch nicht gesehen...genau das gleiche passiert in der ff_delay:
1
UNISIM.VComponents.FDCPE
 Anweisung mit FDCPE.

: Bearbeitet durch User
von Peter F. (widlarizer)


Lesenswert?

Hallo Falk,

Danke für das Korrigieren des Codes. Dieses Mal fluppte der Syntaxcheck 
anstandslos. Habe das FPGA Board im Moment nicht an dem Rechner, brenne 
aber darauf den Code in den FPGA zu laden :-)

@Christoph:
Oh, das ist ein nützlicher Hinweis, vielen Dank! Würde es dir was 
ausmachen, mir den Quellcode hier aufzulisten, den du damals für dieses 
Vorhaben benutzt hast?
Ich würde das gerne bei mir testen.

von Peter F. (widlarizer)


Lesenswert?

Sooo, grad eben wollte ich über "Implement Design" meinem Ziel ein 
Stückchen näher kommen, doch offenbar gibt es momentan noch ein kleines 
Lizenzproblem. In der Konsole kam folgende Fehlermeldung auf (Auszug):

**********************************************************************
ERROR:Security:9c - No 'ISE' nor 'WebPack' feature version 2013.06 was 
available
for part 'xc3s700a'.
----------------------------------------------------------------------
Cannot connect to license server system.
 The license server manager (lmgrd) has not been started yet,
 the wrong port@host or license file is being used, or the
 port or hostname in the license file has been changed.
Feature:       WebPack
Server name:   localhost
License path:
C:/license.dat;C:/.Xilinx\Xilinx.lic;C:\Xilinx\14.6\ISE_DS\ISE\/coregen/ 
core_lic
enses\Xilinx.lic;C:\Xilinx\14.6\ISE_DS\ISE\/coregen/core_licenses\Xilinx 
Free.lic
;C:\Xilinx\14.6\ISE_DS\EDK/data/core_licenses\Xilinx.lic;@localhost;
FLEXnet Licensing error:-15,570
For further information, refer to the FLEXnet Licensing documentation,
available at "www.flexerasoftware.com".Invalid host.
 The hostid of this system does not match the hostid
 specified in the license file.
Feature:       ISE
Hostid:        000c29c2b75f
License path:
C:/license.dat;C:/.Xilinx\Xilinx.lic;C:\Xilinx\14.6\ISE_DS\ISE\/coregen/ 
core_lic
enses\Xilinx.lic;C:\Xilinx\14.6\ISE_DS\ISE\/coregen/core_licenses\Xilinx 
Free.lic
;C:\Xilinx\14.6\ISE_DS\EDK/data/core_licenses\Xilinx.lic;@localhost;
FLEXnet Licensing error:-9,57
For further information, refer to the FLEXnet Licensing documentation,
available at "www.flexerasoftware.com".
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ERROR:Map:258 - A problem was encountered attempting to get the license 
for this
   architecture.

Design Summary
--------------
Number of errors   :   1
Number of warnings :   0

Process "Map" failed
**********************************************************************

Anscheinend gibt es ein Problem mit dem Lizenzserver bzw. mit der 
Verbindung von meinem Rechner dorthin. Weiß jemand wie man das 
hinkriegen kann? Ich nutze ISE 14.6 unter Win XP per VMWare unter Mac OS 
X.

Danke!

von Christian R. (supachris)


Lesenswert?

Hast du denn ein Lizenzfile generiert und mit dem Lizenzmanager in die 
Installation eingebunden?

von Peter F. (widlarizer)


Lesenswert?

Hallo Christian,

ja das habe ich, genau das ist ja auch das, was mich so stutzig macht 
:-(
Kann man das im Nachhinein noch überprüfen, um sich zu vergewissern, ob 
alles mit dem Einbinden des Lizenzfiles geklappt hat?

von Christian R. (supachris)


Lesenswert?

Ja, einfach den Lizenzmanager starten und dann zeigt der in der Liste ja 
an, für welche Software die Lizenz wie lange gilt.

von Peter F. (widlarizer)


Lesenswert?

Alles klar. Dann probiere ich das nachher mal aus. Also einfach die ISE 
starten und dort den Lizenzmanager suchen, richtig? Ich habe das 
Lizenzfile nämlich während der Installation einmal eingebunden und das 
wars dann auch schon. Habe mich danach nicht mehr weiter darum 
gekümmert.

von Christian R. (supachris)


Lesenswert?

In ISE: Help -> Manage Licences
Oder über das Startmenü: Xilinx Design Tools -> ISE Design Suite -> 
Accessories -> Manage Xilinx Licences

von Peter F. (widlarizer)


Lesenswert?

So, habe jetzt mal einen Blick in den License Configuration Manager 
geworfen. Beim Feature "Implementation" ist nur das Feld unter "Host Id 
Matches" auf rot und beinhaltet ein "No". Liegt das eventuell daran?

von Christian R. (supachris)


Lesenswert?

Jo, dann passt die Lizenz nicht zum Rechner. Du musst beim Generieren 
der Lizenz die Host ID oder MAC Adresse der Maschine angeben, auf der 
das installiert ist.

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


Lesenswert?

Christoph Z. schrieb:
> Eine Lektion die ich damals gelernt habe:
> Der Synthesizer ist recht schlau, der merkt sofort wenn deine Logik nur
> rumsitzt und nichts nützliches (= Das Ergebnis wird verwendet) tut.
>
> Also darauf achten, dass deine Dummy-Logik am Schluss ein Ergebnis auf
> FPGA Pins ausgibt, sonst wird sie wegoptimiert.
Und dann kommt noch dazu, dass die Synthese auch merken (kann), dass du 
eigentlich nichts Snnvolles tust, und dann zwar das "richtige" Ergebnis 
ausgibt, aber dazu das Meiste wegoptimiert. Das ist z.B. bei dem 
Ringoszillator iom 
http://embdev.net/topic/ring-oscillator-timing-simulation#3391429 der 
Fall.

von Peter F. (widlarizer)


Lesenswert?

Hallo zusammen,

nach einer etwas längeren Zeit melde ich mich mal wieder. In der 
Zwischenzeit konnte ich das Problem mit der falschen MAC Adresse beheben 
und kann mich nun den angenehmen Dingen des Lebens widmen ;-)

@Christoph:
Hmmm, das ist für mich natürlich nicht so schön, da meine Dummy-Logik 
von der Synthese dann wahrscheinlich ins digitale Nirvana befördert wird 
:-(

Kann man diese Problematik denn tatsächlich umgehen, indem die Outputs 
der Schaltung an einige PINs des FPGA angeschlossen werden?

von Christoph Z. (christophz)


Lesenswert?

Peter Falk schrieb:
> Kann man diese Problematik denn tatsächlich umgehen, indem die Outputs
> der Schaltung an einige PINs des FPGA angeschlossen werden?

Ja. Der Synthesizer meint dann, du brauchst diese Outputs. Er weiss ja 
nicht, dass du an den Pins nichts anhängst :-)

von Peter F. (widlarizer)


Lesenswert?

Okay :-) Dann werde ich das mal ausprobieren. Ist es vollkommen egal, an 
welche Pins des FPGA die Ausgänge der Schaltung angeschlossen werden?

Eigentlich müsste dann der geschickte Einsatz des GENERATE Befehls in 
Kombination mit dem Anschluss der Schaltung an entsprechende Pins des 
FPGAs zum gewünschten Ziel führen, den Chip gut zu füllen, richtig? :-)

von Duke Scarring (Gast)


Lesenswert?

Peter Falk schrieb:
> Okay :-) Dann werde ich das mal ausprobieren. Ist es vollkommen egal, an
> welche Pins des FPGA die Ausgänge der Schaltung angeschlossen werden?
Nein, nicht vollkommen egal. Dazu schaut man in den Schaltplan und sucht 
sich Pins raus, an denen was dranhängt, was nicht kaputt gehen kann. Es 
bieten sich an: LEDs, Adressbusse zu Speicherchips oder Pinheader an 
denen nichts angeschlossen ist.

Was zu Zerstörung führen kann: Wenn Leitungen zu Tastern, Schaltern, 
Taktquellen oder bidirektionellen Datenleitungen verwendet werden.

Duke

von Peter F. (widlarizer)


Lesenswert?

LEDs und Pinheader klingen schon mal sehr gut, Danke! Ich hoffe, dass 
das alles so hinhauen wird.

Soweit ich das bislang mitbekommen habe, ist der Spartan 3A partiell & 
dynamisch rekonfigurierbar, richtig? Hat jemand von euch dieses Feature 
für ein konkretes Projekt getestet?

von Peter Falk (Gast)


Lesenswert?

Hallo zusammen,

bevor ich einen neuen Thread eröffne, hänge ich mein aktuelles Problem 
mal hier rein.
Ich habe 4x4 (4 Eingänge & 4 Ausgänge) Substitution-Box (Element aus der 
Kryptographie) aus relativ simplen Gattern gebaut. Für die einzelnen 
Gatter habe ich Behavioral-Modelle geschrieben und jeweils in einem 
eigenen Projekt abgespeichert.
Für die S-Box selbst habe ich die Komponenten in einer 
Strukturbeschreibung instanziiert und anschließend den Syntaxcheck 
gestartet. Leider kommen dann etliche Fehlermeldungen und zwar folgender 
Art:

ERROR:HDLParsers:3281 - "C:/Xilinx/Workspace/Sbox_struct/sBox.vhd" Line 
50. Behavioral is not an architecture body for Inverter in library work.

Das dazugehörige Codeschnipsel dazu:
1
begin
2
-- All inverters
3
  INV1 : entity work.Inverter(Behavioral)
4
    PORT MAP(D, S1);

Und hier nochmal der Inverter:
1
entity Inverter is
2
  PORT(
3
    in1  : in  std_logic;
4
    out1 : out std_logic);
5
end Inverter;
6
7
architecture Behavioral of Inverter is
8
9
begin
10
  out1 <= not in1;
11
12
end Behavioral;

Aus der Fehlermeldung entnehme ich, dass es ein Problem mit der 
Bezeichnung der architecture des Inverters gibt...aber warum?
Bitte um Hilfe!

von Duke Scarring (Gast)


Lesenswert?

Peter Falk schrieb:
> bevor ich einen neuen Thread eröffne, hänge ich mein aktuelles Problem
> mal hier rein.
Warum machst Du nicht einen neuen Thread auf? Was hat Dein Problem mit 
dem Spartan 3A zu tun? Du hast ein VHDL-Problem.

> Für die einzelnen
> Gatter habe ich Behavioral-Modelle geschrieben und jeweils in einem
> eigenen Projekt abgespeichert.
Warum? Man muß nicht jedes Gatter in ein eigenes Projekt stecken. Da 
wird man ja nie fertig und hinterher wird wieder behauptet VHDL sei 
geschwätzig...

> Das dazugehörige Codeschnipsel dazu
Mein Schnipsel würde so aussehen:
1
begin
2
  -- All inverters
3
  S1 <= not S1;

Peter Falk schrieb:
> ERROR:HDLParsers:3281 - "C:/Xilinx/Workspace/Sbox_struct/sBox.vhd" Line
> 50. Behavioral is not an architecture body for Inverter in library work.

> Aus der Fehlermeldung entnehme ich, dass es ein Problem mit der
> Bezeichnung der architecture des Inverters gibt...aber warum?
Ist den die Datei mit dem Inverter schon kompiliert worden?
Ist die Datei mit dem Inverter in diesem Projekt enthalten?

Duke

von Peter F. (widlarizer)


Lesenswert?

Hi,

im Grunde genommen hätte ich tatsächlich einen neuen Thread aufmachen 
können. Wollte im Grunde genommen nur nicht das Forum "vollspammen", 
aber nun ja...nächstes Mal mache ich es anders :-)

Ich dachte mir, dass ich einige Gatter in eigene Projekte stecke, damit 
ich diese in anderen Projekten einfach und schnell per 
Komponenteninstanziierung wiederverwenden kann. Das war eigentlich der 
Hintergedanke bei der ganzen Sache.

Die Datei mit dem Inverter wurde einwandfrei kompiliert...sie ist aber 
nicht in diesem Projekt enthalten, sondern befindet sich in einem 
eigenständigen Projekt. Ich ging bisher davon aus, dass das Tool die im 
Quellcode referenzierte entity selbstständig findet, da sich alle 
Projekte in der "library" befinden?
Zumindest hat das bei kleineren Projekte (multiples Logikgatter 
bestehend aus mehreren Invertern, NAND2, OR2, usw. -Gattern) anstandslos 
funktioniert.

von Duke Scarring (Gast)


Lesenswert?

Peter Falk schrieb:
> Ich dachte mir, dass ich einige Gatter in eigene Projekte stecke, damit
> ich diese in anderen Projekten einfach und schnell per
> Komponenteninstanziierung wiederverwenden kann. Das war eigentlich der
> Hintergedanke bei der ganzen Sache.
Prinzipiell ist Deine Idee gut.
Aber wegen ein paar Gattern, Registern, einem Addierer oder 
Multiplizierer lohnt sich dieser Aufwand nicht. Die sind schnell 
hingeschrieben. Auch für Zähler, Multiplexer oder Schieberegister würde 
ich keine eigene Datei mehr anfangen.

Sinnvoll ist das m.E. nur bei Blöcken, die man tatsächlich irgendwann 
mal wieder braucht und die ein gewisse Komplexheit besitzen: FIFO, 
Filter, Logarithmierer, Dividierer u.ä.
Allerdings muß man meist auch beträchtlichen Aufwand betreiben um so 
einen Block allgemein verwendbar zu machen.

> Ich ging bisher davon aus, dass das Tool die im
> Quellcode referenzierte entity selbstständig findet, da sich alle
> Projekte in der "library" befinden?
In jedem Projekt gibt es die Library work. Aber zwischen den Projekten 
kennen sich die Librarys nicht. Es ist allerdings möglich, eine Datei in 
mehreren Projekten zu verwenden. Sie muß dann jeweils hinzugefügt 
werden.

Duke

von Peter F. (widlarizer)


Lesenswert?

Gut, dann werde ich es in Zukunft so machen, bin ja auch für jeden 
Hinweis dankbar! Mittlerweile habe ich das Problem dadurch gelöst, indem 
ich die entsprechenden VHDL Dateien im ISE über "Add Source" hinzugefügt 
habe. Was DANN aber ärgerlich ist, dass man auch zu der hinzugefügten 
Datei wiederrum weitere Dateien hinzufügen muss :-( Hätte das von Anfang 
an anders aufziehen sollen, Mist!

Ich bin jetzt allerdings auf ein anderes Problem gestoßen, dafür mache 
ich jetzt aber wirklich ein neues Thema auf :-)

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.