Xilinx IP-Cores und Netz-Namen?

Gast #2033571
Lesenswert?
• ▲
▼
Hallo!
Ich spiele gerade mit einem Sparten 3e Eval-Board rum und habe eine 
Frage, auf die ich nach intensivem (falschen?) Suchen leider keine 
Antwort gefunden habe.
Undzwar würde ich gerne mehrere von den Xilinx MUL-Cores einbinden. Aber 
die Ein-/Ausgangsnetze haben immer die selben Namen, die ich nicht 
verändern kann wie a,b usw.
Wenn ich jetzt z.B. einen 8-Bit MUL für mein Top-Modul generiere und 2 
16-Bit MULs für diverse untergeordnete Module, dann haben die alle die 
gleichen Netznamen.
Was macht man da denn sinvoller Weise?
War ich bloß nicht in der Lage im CoreGen die Option für die Benennung 
zu finden, oder löst man das anders?

Gruß,
der Hansi
Gast #2033612
Lesenswert?
• ▲
▼
Hallo, vielen Dank schonmal!

Das habe ich soweit aus dem Instanziierungstemplate von Xilinx 
übernommen und unten meine eigenen Signalnamen bei der Instanziierung 
eingefügt.


component mul16
  port (
  clk: in std_logic;
  a: in std_logic_vector(15 downto 0);
  b: in std_logic_vector(15 downto 0);
  p: out std_logic_vector(15 downto 0));
end component;



mul1: mul16
    port map (
      clk => clk,
      a => mul_a,
      b => mul_b,
      p => mul_p);



Ich meine, vielleicht habe ich einfach nur eine falsche Vorstellung von 
dem was hier passiert, aber ich muss doch im Port()-Bereich der Entity 
von dem Modul wo der core eingebunden ist die Ein- und Ausgänge angeben, 
also z.B.

entity Rechner is
Port (


  -- multiplier
        a: in std_logic_vector(15 downto 0);
  b: in std_logic_vector(15 downto 0);
  p: out std_logic_vector(15 downto 0);

und in meinen anderen Modulen sieht dass dann ähnlich aus, weil der 
Core-Generator immer a,b,p vergibt. Meinem Verständnis nach sind die 
dann alle mehr oder weniger verbunden.

@ Lothar

>Aber: warum unbedingt einen Multiplizierer als Core implementieren?
>Eine Multiplikation wird doch ganz einfach synthetisiert..

Also bei mir enthält eine Multiplikation von signed oder unsigned stets 
0.
Mit den Cores geht es dann wunderbar.
Aber selbst wenn ich da was falsch mache würde mich die Sache 
prinzipiell interessieren.


Gruß,
Hansi
#2033614
Lesenswert?
• ▲
▼
Du kannst auch problemlos sowas machen:
1
mul1: mul16
2
    port map (
3
      clk => clk,
4
      a => mul_a1,
5
      b => mul_b1,
6
      p => mul_p1);
7

8
mul2: mul16
9
    port map (
10
      clk => clk,
11
      a => mul_a2,
12
      b => mul_b2,
13
      p => mul_p2);
14

15
mul3: mul16
16
    port map (
17
      clk => clk,
18
      a => mul_a3,
19
      b => mul_b3,
20
      p => mul_p3);

Was links von => in der Port Map steht, ist nur abhängig von der 
Definition im Core in diesem Fall, rechts können deine Signalnamen 
stehen. Verbunden ist dann nix.

Viel sinnvoller ist aber die Multiplikation einfach mit * hinzuschreiben 
und den Rest den Sythesizer machen zu lassen. Man muss natürlich die 
richtigen libs einbinden, und das wäre in dem Fall ausschließlich die 
numeric_std
Gast #2033626
Lesenswert?
• ▲
▼
Vielen Dank!

use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

Die Beiden habe ich eingebunden, sonst nichts.

Also STD_LOGIC dann weglassen?


Wie ist das denn dann: der IP-Core hat je nach Bitbreite eine Latenz von 
ein paar Takten.
Die * Operation ist dann vermutlich auch latenzbehaftet? Wäre ja wichtig 
zu wissen, damit ich in meiner state machine dann im nächsten Takt 
keinen Müll abhole.

>Dann solltest du mal schauen, was der Synthesizer draus macht
>(RTL-Schematics).

Hatte ich mal versucht, aber war leider nicht sehr aufschlussreich für 
mich.
Ich probiere es dann heut Abend nochmal, hab grad kein ISE hier zu 
Verfügung. :-)
Gast #2033652
Lesenswert?
• ▲
▼
Ok, meinen Google-Ergebnissen zufolge (die mich wieder in das Forum hier 
führten g) ist die Multiplikation kombinatorisch und damit nicht 
Latenzbehaftet. Jedenfalls nicht mehrere Takte bei meinen 50MHz. ;-)
Finde ich zwar wunderlich dass der Xilinx-Core dann ~3 Takte pro 
verwendetem 18x18 HW-mul haben will, aber was solls. Vielleicht habe ich 
das im Datenblatt von dem Core auch falsch verstanden. (Was ich aber 
irgendwie nicht glauben mag ^^)

Grüße,
Hansi
#2033684
Lesenswert?
• ▲
▼
Die Signale der Componenten sind nur Local (also in der Componente) 
sichtbar. componenten werden so eingebunden.

[/VHDL]
    port map (
      clk => clk,
      a => mul_a,
      b => mul_b,
      p => mul_p);
[VHDL]

a,b,und p sind innerhalb deines Codes nicht sichtbar.
mul_a, mul_b und mul_p sind sie signale, die du verwenden musst, und die 
kannst du frei umbenennen.

>Finde ich zwar wunderlich dass der Xilinx-Core dann ~3 Takte pro
>verwendetem 18x18 HW-mul haben will
Eine Multiplikation kann in einem Takt gelöst werden, belegt dann aber 
viele resourcen. Der Core Generator kann das Platzsparender umsetzten, 
allesdings dann  mit den 3 Takten Latenz.

EDIT: der S3e hat auch Hardware Multiplizierer, wenn der Core die 
Verwendet, hast du wahrscheinlich "registered" angewählt
#2033723
Lesenswert?
• ▲
▼
Wenn der HW-MUL genommen wird, ist die erreichbare Geschwindigkeit 
abhängig von der Zahl der Register. Beschreibt man die Multiplikation 
rein kombinatorisch, kommt folgende Meldung:
1
Xst:2385 - HDL ADVISOR - You can improve the performance of the multiplier Add16x16/Mmult_Result by adding 3 register level(s).

Achso, die st_logic brauchst du schon auch. Aber keine alten Synopsis 
Libs wie std_logic_unsigned oder std_logic_signed benutzen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren