Forum: FPGA, VHDL & Co. Xst:738 - HDL ADVISOR - 768 flip-flops were inferred for signal xxx.


von tomi (Gast)


Lesenswert?

Hallo zusammen,

ich benutze gerade xilinx- spartan 3a xc3s1400a.
Wenn ich ein RAM so beschrieben, kriege ich so eine meldung von XST:

Xst:738 - HDL ADVISOR - 768 flip-flops were inferred for signal 
<dout_tmp>. You may be trying to describe a RAM in a way that is 
incompatible with block and distributed RAM resources available on 
Xilinx devices, or with a specific template that is not supported. 
Please review the Xilinx resources documentation and the XST user manual 
for coding guidelines. Taking advantage of RAM resources will lead to 
improved device usage and reduced synthesis time.
1
ENTITY output_reg_file IS
2
GENERIC (--input Register
3
  INPUT_REG_FILE_ANZAHL      : INTEGER := 1;
4
  --output Register
5
  OUTPUT_REG_FILE_ANZAHL     : INTEGER := 48);
6
  PORT ( sys_clk        : IN  STD_LOGIC;
7
        rd_reg: IN  STD_LOGIC_VECTOR (OUTPUT_REG_FILE_ANZAHL+INPUT_REG_FILE_ANZAHL DOWNTO INPUT_REG_FILE_ANZAHL+1);
8
  reg_file_to_cpu_tmp : IN  reg16         (OUTPUT_REG_FILE_ANZAHL+INPUT_REG_FILE_ANZAHL DOWNTO INPUT_REG_FILE_ANZAHL+1);
9
reg_file_to_cpu      : OUT STD_LOGIC_VECTOR (15 DOWNTO 0));
10
END output_reg_file;
11
12
----------------------------------------------------------------------------------
13
ARCHITECTURE BEHAVIORAL OF output_reg_file IS
14
SIGNAL dout_tmp : reg16 (OUTPUT_REG_FILE_ANZAHL+INPUT_REG_FILE_ANZAHL DOWNTO INPUT_REG_FILE_ANZAHL+1);
15
BEGIN
16
17
---OUTPUT_REG_FILE_ANZAHL >= 1---------------------------------------------------
18
  output_regfile_gen_condition: IF OUTPUT_REG_FILE_ANZAHL >= 1 GENERATE
19
    output_regfile_gen: FOR i IN INPUT_REG_FILE_ANZAHL+1 TO OUTPUT_REG_FILE_ANZAHL+INPUT_REG_FILE_ANZAHL GENERATE
20
      
21
      --output_regfile_process----------------------------------------------
22
      output_regfile_pro: PROCESS
23
      BEGIN
24
        WAIT UNTIL RISING_EDGE(sys_clk);
25
        dout_tmp(i) <= reg_file_to_cpu_tmp(i);
26
      END PROCESS output_regfile_pro;
27
      
28
      --an DATA-bus-Anschließen----------------------------------------------
29
      WITH rd_reg(i) SELECT
30
        reg_file_to_cpu <= dout_tmp(i)  WHEN '1', 
31
                   (OTHERS => 'Z') WHEN OTHERS;
32
                  
33
    END GENERATE output_regfile_gen;
34
  END GENERATE output_regfile_gen_condition;
35
36
---OUTPUT_REG_FILE_ANZAHL = 0---------------------------------------------------
37
  gen_condition: IF OUTPUT_REG_FILE_ANZAHL = 0 GENERATE
38
        reg_file_to_cpu <= (OTHERS => 'Z');                         
39
    END GENERATE gen_condition;
40
  
41
END BEHAVIORAL;

48-Register x 16-bit = 768 flip-flop.
was für ein contraint muss ich vielleicht noch hinzufügen?

vielen dank im vorraus und ciao aus hannover!^^

lg Tom

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


Lesenswert?

tomi schrieb:
> 48-Register x 16-bit = 768 flip-flop.
Ja, passt.

> was für ein contraint muss ich vielleicht noch hinzufügen?
Nichts. Wenn du (aus welchen Gründen auch immer) genau sowas willst, 
dann darfst du den Rat des Ratgebers einfach erst mal ignorieren.
Nur solltest du irgendwann in dich gehen und dich fragen:
warum meint der, das könnte man evtl. anders besser machen?

> Wenn ich ein RAM so beschrieben, kriege ich so eine meldung von XST:
Ja, kennst du denn ein RAM als Baustein, wo du auf alle Speicherzellen 
gleichzeitig zugreifen kannst? So etwa:
>>>  dout_tmp(i) <= reg_file_to_cpu_tmp(i);
Ich nicht...  :-/
Auf die RAMs, die ich kenne, wird immer wortweise zugegriffen (8, 16, 
32, 64-Bit).

Als Tipp: sieh dir mal an, wie RAMs in VHDL beschrieben werden. Für 
Xilinx ist der XST-User-Guide maßgeblich:
1
Please review the Xilinx resources documentation and 
2
the XST user manual for coding guidelines.

von tomi (Gast)


Lesenswert?

hi Lothar,

vielen dank erstmal für die Antwort!^^

Lothar Miller schrieb:
> Ja, kennst du denn ein RAM als Baustein, wo du auf alle Speicherzellen
> gleichzeitig zugreifen kannst? So etwa:
>>>>  dout_tmp(i) <= reg_file_to_cpu_tmp(i);
> Ich nicht...  :-/
> Auf die RAMs, die ich kenne, wird immer wortweise zugegriffen (8, 16,
> 32, 64-Bit).

für die zeile:

>>>>  dout_tmp(i) <= reg_file_to_cpu_tmp(i);

Weil ich so gemacht habe:
1
TYPE reg16  IS ARRAY (NATURAL RANGE <>) OF STD_LOGIC_VECTOR (15 DOWNTO 0);
2
3
SIGNAL dout_tmp : reg16 (OUTPUT_REG_FILE_ANZAHL+INPUT_REG_FILE_ANZAHL DOWNTO INPUT_REG_FILE_ANZAHL+1);
4
5
--
6
--
7
dout_tmp(i) <= reg_file_to_cpu_tmp(i);
meine ich, das ist schon 16-bit-register, also nicht einzelnen 
Speocherzelle.

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


Lesenswert?

tomi schrieb:
> meine ich, das ist schon 16-bit-register,
Ja, das sind bis dahin (49 downto 2) = 48 einzelne 16 Bit Register. Die 
dann aber parallel (und gleichzeitig) über ein Generate irgendwoanders 
hin zugewiesen werden:
1
FOR i IN 2 TO 49 GENERATE
2
   :
3
   dout_tmp(i) <= reg_file_to_cpu_tmp(i);
4
   :
5
END GENERATE;

Das ist, was üblicherweise mit "Massive Parallel Processing" umworben 
wird... ;-)


BTW1: wenn du neu im VHDL-Geschäft bist, solltest du für die Synthese 
solche Konstrukte wie Generate und Loop gleich mal vergessen...

BTW2: (49 downto 2)
warum so einen seltsamen Range?

von tomi (Gast)


Lesenswert?

Lothar Miller schrieb:
> Das ist, was üblicherweise mit "Massive Parallel Processing" umworben
> wird... ;-)

macht das dem Syntheser langsamer, oder ist es gefählich wegen der 
xst-meldung? was man besser machen kann?

Lothar Miller schrieb:
> BTW2: (49 downto 2)
> warum so einen seltsamen Range?

ich will also ein bus-interface zwischen FPGA und µC aufbauen, nach 
meiner fantasie:D

Mit diesem Code will ich 48-ADC-Resultregister, je 16-bit, von µC 
auslesen.Hier nenne ich output-resgiter-file, also von FPGA aus.

Und die
>>>> INPUT_REG_FILE_ANZAHL      : INTEGER := 1;

ist die steuerregister. Der µC schreibt Controlword für ADC. Deswegen 
fängt bei mir die outputregister ab INPUT_REG_FILE_ANZAHL + 1 = 2.

Über generic-parameter muss ich für andere Modul nur gewünschte 
input,-output-register anpasssen, dann wird es automatisch generiert.

Lothar Miller schrieb:
> BTW1: wenn du neu im VHDL-Geschäft bist, solltest du für die Synthese
> solche Konstrukte wie Generate und Loop gleich mal vergessen...

ja, nicht so lange beschäftige ich mich mit FPGA.
Ohne Generate ist mir schwer, zumindest meiner Meinung nach...

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


Lesenswert?

tomi schrieb:
> macht das dem Syntheser langsamer, oder ist es gefählich wegen der
> xst-meldung? was man besser machen kann?
Du verbrauchst unendlich viel Ressourcen, weil keine RAMs instantiiert 
werden können. Das ist das Problem...  :-/

> Ohne Generate ist mir schwer, zumindest meiner Meinung nach..
Mit Generate wird das mit garantierter Sicherheit nicht einfacher. Wie 
du hier selber siehst...

> Mit diesem Code will ich 48-ADC-Resultregister, je 16-bit, von µC
> auslesen.
Skizziere für dich selber mal auf einem Blatt Papier, wie du die Daten 
aus dem ADC abholst. Denn das FPGA selber hat ja keinen ADC. Und 
irgenwoher müssen die Daten ja kommen. Hat der ADC auch einen 
16-Bit-Bus? Welcher ADC ist das? Was willst du denn überhaupt machen?

von tomi (Gast)


Lesenswert?

Lothar Miller schrieb:
> Skizziere für dich selber mal auf einem Blatt Papier, wie du die Daten
> aus dem ADC abholst. Denn das FPGA selber hat ja keinen ADC. Und
> irgenwoher müssen die Daten ja kommen. Hat der ADC auch einen
> 16-Bit-Bus? Welcher ADC ist das? Was willst du denn überhaupt machen?

ich benutze 6 x AD7367, der ist 14-bit ADC, aber µC bus ist 16. Für die 
input-reg-file möchte ich read_write-register:
1
ENTITY input_reg_file IS
2
  GENERIC (INPUT_REG_FILE_ANZAHL    : INTEGER:= 1);
3
PORT ( sys_clk        : IN    STD_LOGIC;
4
     wr_reg         : IN    STD_LOGIC_VECTOR (INPUT_REG_FILE_ANZAHL DOWNTO 1);
5
     rd_reg         : IN    STD_LOGIC_VECTOR (INPUT_REG_FILE_ANZAHL DOWNTO 1);
6
     cpu_databus     : INOUT  STD_LOGIC_VECTOR (15 DOWNTO 0);
7
     reg_file_from_cpu       : OUT    reg16         (INPUT_REG_FILE_ANZAHL DOWNTO 1));
8
END input_reg_file;
9
10
----------------------------------------------------------------------------------
11
ARCHITECTURE BEHAVIORAL OF input_reg_file IS
12
--
13
14
SIGNAL input_reg_tmp : reg16            (INPUT_REG_FILE_ANZAHL DOWNTO 1);
15
BEGIN
16
17
--intern wired-----------------------------------------------------------------
18
  reg_file_from_cpu <= input_reg_tmp;
19
  
20
    input_regfile_gen: FOR i IN 1 TO INPUT_REG_FILE_ANZAHL GENERATE
21
      
22
      --Schreiben, Richtung: µC----> FPGA------------------  
23
      wr_input_regfile_pro: PROCESS
24
      BEGIN
25
        WAIT UNTIL RISING_EDGE(sys_clk);
26
        IF wr_reg(i) = '1' THEN
27
          input_reg_tmp(i) <= cpu_databus;
28
        END IF;
29
      END PROCESS wr_input_regfile_pro;
30
      
31
      --Lesen, Richtung: FPGA----> µC-----------------------
32
      WITH rd_reg(i) SELECT
33
        cpu_databus <= input_reg_tmp(i)  WHEN '1', 
34
              (OTHERS => 'Z') WHEN OTHERS;                
35
  
36
    END GENERATE input_regfile_gen;

Lothar Miller schrieb:
> tomi schrieb:
>> macht das dem Syntheser langsamer, oder ist es gefählich wegen der
>> xst-meldung? was man besser machen kann?
> Du verbrauchst unendlich viel Ressourcen, weil keine RAMs instantiiert
> werden können. Das ist das Problem...  :-/
>
>> Ohne Generate ist mir schwer, zumindest meiner Meinung nach..
> Mit Generate wird das mit garantierter Sicherheit nicht einfacher. Wie
> du hier selber siehst...

gibts andere bessere weise?

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


Lesenswert?

Dann kannst du sowieso immer nur auf 16 Bits gleichzeitig zugreifen.

Ergo mußt du "nur" einen Multiplexer bauen, der dir den passenden ADC 
auf deinen uC durchschaltet...
Oder sollen die ADC automon vom FPGA kontrolliert werden?

Aber wie gesagt: zeichne das mal auf ein Blatt Papier, gib den Bauteilen 
Namen und mach ein Foto davon. Und das postest du hier, dann sieht man 
weiter...

> gibts andere bessere weise?
Die Antwort lautet mit Sicherheit: Ja.
Genaueres lässt sich aber erst mit einer genauen Aufgabenstellung sagen.

von tomi (Gast)


Angehängte Dateien:

Lesenswert?

Lothar Miller schrieb:
> Oder sollen die ADC automon vom FPGA kontrolliert werden?

ja genau. Über einen Input_Register definiere ich control-bit(z.b. 
Start/Stop-bit; Synchron mit anderem ADC..) für 6 ADC, und schreibe ich 
über µC.

Am Anhang ist das Blockschlatbild. Oben ist typische Verbindung über 
extern Bus von µC. Dabei gibtd 16-bit Datenbus, 8-bit Addressbus, read 
(rd), write(wr) und chip select (cs).

In FPGA schreibe ich sozusagen businterface mit generic parameter, wie 
vorher gesehen. D.h. für jede Modul muss ich Anzahl der 
input,-output-16bit-register(registerfile), Anfang-address festlegen. In 
diesem Fall hier für Modull AD-Wandler typ 14-bit AD7367(4 kanal) brache 
ich ein Input-register (benutzt aber nur 6 bit für start/stop der 6 ADC) 
und 48 -outputregister für results.

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


Lesenswert?

tomi schrieb:
> Oben ist typische Verbindung über extern Bus von µC.
> Dabei gibtd 16-bit Datenbus, 8-bit Addressbus
Und genau mit diesen Bussen gehst du jetzt richtigerweise erst mal auf 
ein DPRAM. Denn genau so (wie ein RAM) hast du doch auch deine 
Registersätze in der Bildmitte definiert...
Mit der Adresse selektierst du ein bestimmtes 16-Bit Wort, in das dann 
Daten geschrieben werden oder von dem gelesen wird.

Und auf der anderen Seite des DPRAM ist die Verwaltung (FSM) der 
AD-Wandler angeschlossen.

von tomi (Gast)


Lesenswert?

Lothar Miller schrieb:
> Und genau mit diesen Bussen gehst du jetzt richtigerweise erst mal auf
> ein DPRAM. Denn genau so (wie ein RAM) hast du doch auch deine
> Registersätze in der Bildmitte definiert...
> Mit der Adresse selektierst du ein bestimmtes 16-Bit Wort, in das dann
> Daten geschrieben werden oder von dem gelesen wird.
>
> Und auf der anderen Seite des DPRAM ist die Verwaltung (FSM) der
> AD-Wandler angeschlossen.



Alles scheint richtig zu sein, oder? oder problem liegt daran, ob mein 
spartan 3a hat Dual Port RAM (DPRAM) oder nicht?

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


Lesenswert?

tomi schrieb:
> oder problem liegt daran, ob mein
> spartan 3a hat Dual Port RAM (DPRAM) oder nicht?
Der hat das schon.

> Alles scheint richtig zu sein, oder?
Nein. Lies dir den Thread hier nochmal von Anfang an durch: deine 
Beschreibung funktioniert nicht für ein RAM. Man kann nicht ein ganzes 
Ram auf einmal hin- und herkopieren.

>>>> Als Tipp: sieh dir mal an, wie RAMs in VHDL beschrieben werden.
>>>> Für Xilinx ist der XST-User-Guide maßgeblich...
Also: lies dort mal nach, wie denn die Beschreibung für ein RAM 
aussieht. Eines ist klar: ein GENERATE kommt in so einer Beschreibung 
nicht vor.

von tomi (Gast)


Lesenswert?

danke Lothar für die Antwort, lese ich mal user guide^^

best gruß!

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.