Forum: FPGA, VHDL & Co. Lookuptable in Quartus


von Jens (Gast)


Lesenswert?

Hallo,

Da ich gerade anfange mich mit VHDL zu beschäftigen probiere ich
gerade viel mit dem Xilinx-Webpack und Altera Quartus herum. Dabei
ist mir neben vielen anderen Eigenheiten aufgefallen das Quartus
offensichtlich deutlich anderen RTL-Kode erzeugt. Aus dem folgenden
Kode erzeugt das Xilinx Webpack eine Lookuptable in einem Blockram,
Quartus dagegen eine Kette von 16 Multiplexern.
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
4
5
entity BinTo7Seg is
6
  port(InBin   : in  std_logic_vector(3 downto 0);
7
     Out7Seg : out std_logic_vector(6 downto 0) );
8
end BinTo7Seg;
9
10
architecture behavioral of BinTo7Seg is
11
begin
12
  Out7Seg <= "1000000" when InBin = "0000" else 
13
          "1111001" when InBin = "0001" else 
14
          "0100100" when InBin = "0010" else 
15
              "0110000" when InBin = "0011" else
16
              "0011001" when InBin = "0100" else
17
          "0010010" when InBin = "0101" else
18
          "0000010" when InBin = "0110" else
19
          "1111000" when InBin = "0111" else
20
          "0000000" when InBin = "1000" else
21
          "0010000" when InBin = "1001" else
22
          "0001000" when InBin = "1010" else
23
          "0000011" when InBin = "1011" else
24
          "1000110" when InBin = "1100" else
25
          "0100001" when InBin = "1101" else
26
          "0000110" when InBin = "1110" else
27
             "0001110";
28
end behavioral;

Die derzeitigen Entwürfe sind sicher unkritisch, aber irgenwie kommt
mir diese Variante mit den Multiplexern ziemlich ineffizient
hinsichtlich Ressourcen und Geschwindigkeit vor. Wenn die Logikelemente
eh aus Lookuptables bestehen könnte man die doch zusammenfassen,
oder übersehe ich da etwas?

An einer anderen Stelle fügt Quartus 3 Multiplexer mit identischen
Eingängen ein anstatt die Selectsignale miteinander zu verknüpfen.
Überhaupt scheint Quartus nur Multiplexer, Adder, Fli-Flops und
Vergleicher zu kennen. Ich habe im RTL-View noch keine aufgelöste
Logik gefunden. Gibt es irgendwelche Schalter wo ich die
Synthesergebnisse beeinflußen kann?

Jens

von Xenu (Gast)


Lesenswert?

Xilinx erzeugt bei mir keine Lookup-Table in einem BlockRam, sondern ein 
16x7-Bit ROM, welches aus sieben gewöhnlichen 4-Bit-LUTs aufgebaut ist
(aus "Design Summary": Number of 4 input LUTs : 7).

Quartus benutzt dafür auch sieben 4-Bit-LUTs (aus "Flow Summary": Total 
Logic Elements: 7).

Das was Du in den RTL-Viewern siehst, ist nicht die niedrigste Ebene.

Was mir bei Quartus aufgefallen ist, ist dass es Deine when-else-Kaskade 
wohl tatsächlich als Prioritätslogik umsetzt und nicht optimiert.
Du kannst stattdessen ein "select ... with" benutzen oder eine 
case-Anweisung.

von FPGAküchle (Gast)


Lesenswert?

Das Grundelement für logik ist bei Xilinx eine LUT mit 4 Eingängen, bei 
Altera mit 6 Eingängen. In einem Altera kann man also breite Logik bauen 
ohne BRAM's zu "verschwenden". Ob die erwähnten Muxer wirklich Muxer im 
Silizium sind oder nur Library elemente die in die 6-LUT abgebildet 
werden kann ich nicht sagen.

Schalter für das mapping (ob das mit BRAM,Muxer oder anderen Primitiven 
gemacht wird) findest du bei Xilinx beim synthesetool (XST) und 
teilweise beim Mapping. Bei Qartus sollte der interessierende prozeß 
auch Mapping heissen.

von Xenu (Gast)


Lesenswert?

6-Bit-LUTs haben bei Altera nur die Stratix III.
Und Muxer werden immer nur auf LUTs abgebildet.

von Jens (Gast)


Lesenswert?

Zunächst danke für die Antworten.

Meine Frage bei der ganzen Sache ist ja weniger wie ein Muxer dann
im FPGA realisiert ist. Ich hätte (als VHDL-Anfänger) halt erwartet
das die Software eine Lookuptable irgenwie cleverer hinbekommt als
in Form von 16 verketteten Multiplexern, wo dann jeweils der ausgewählte
Wert in die Kette 'eingespeist' wird.

Jens

von Xenu (Gast)


Lesenswert?

Wie gesagt, wenn Du statt when-else ein with-select benutzt, macht er 
Dir eine ideale Implementierung daraus: sieben 4-Bit-LUTs.
Im RTL-Viewer werden diese dann als MUX bezeichnet.

von Jens (Gast)


Lesenswert?

@Xenu:

Das werde ich heute Abend mal probieren.

Jens

von FPGAküchle (Gast)


Lesenswert?

"Lookuptable irgenwie cleverer hinbekommt"

Es wird wie beschrieben umgesetzt, VHDL als Beschreibungssprache 
überläßt die Optimierung zu großen teil dem Designer. Was ja auch 
verständlich ist, das es im FPGA Entwurf mehrere, zum teil 
widersprechende Optimierungsziele gibt (Taktung,Verbrauch an den 
jeweiligen FPGA resourcen,Stromaufnahme etc). Z.B. wird sich der 
designer mächtig ärgern, wenn er nach der Synthese
einen IP-Core einbindet der 2 BRAM's einbinden will, aber die synthese 
alles BRAM's für FSM oder Muxer verbraten hat um slices zu sparen.

von Jens (Gast)


Lesenswert?

@FPGAküchle:

Das klingt plausibel, nur tue ich mich im Moment sehr schwer
vorherzusehen was die Tools aus den jeweiligen VHDL-Konstrukten
erzeugen. Deshalb ja auch der blick in RTL-Darstellung. Bis
jetzt habe ich leider auch kein Buch gefunden, welches bei
dieser Frage weiterhilft. Wobei, die Frage nach einem guten
Buch ist sowieso ein anderes Kapitel.

Im Moment habe ich einfach das Gefühl das es nicht genügt VHDL
zu können, man sollte auch noch für eine ganze Reihe von
typischen Konstrukten wissen was die Tools dann daraus erzeugen.

Jens

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Sowas steht für Xilinx im XST User Guide, für Quartus gibt es sicher 
etwas ähnliches.

von Stefan (Gast)


Lesenswert?

Hallo Jens,

baue das ganze mal mit dem CASE Befehl auf. Dann sieht die Sache 
bestimmt besser aus und du bekommst keine prioritaeten hinein.

Stefan

von Jens (Gast)


Lesenswert?

@All:

Ich habs gestern Abend mit with...select probiert und da
sieht das Ergebniss gut aus. Ich habe dann noch eine Weile
herumprobiert und dabei ist mir aufgefallen das Quartus
im RTL-View mit Vorliebe Vergleicher einbaut, auch wenn
ein UND über den Vector reichen würde. Ist das nur um
die Übersicht im RTL-View zu erhöhen oder wird dann am
Ende wirklich ein Vergleicher implementiert?

Jens

von Ulf (Gast)


Lesenswert?

Wie Quartus die MUX am Ende realisiert, lässt sich mit den 
setup-Einstellungen beeinflussen. "Restruture Multiplexers" z.B. 
optimiert die auf Fläche / Resourcen.

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.