Dies ist ein einfaches Design, mit dem die FPGA-Nutzung von Spannung getestet werden kann, indem alle verfügbaren Logikressourcen (LUTS + FFS) konsumiert werden. Das Design implementiert ein modifiziertes Galois LFSR, um eine Menge "chaotischer" Schaltaktivität / dynamischer Stromverbrauch zu erzeugen, um auch FPGA-Stromversorgungen zu belasten.
Die meisten Konzepte zum Testen der maximalen Auslastung / Leistungsanforderungen verwenden ein einfaches Schaltregister, in dem jeder FF (Flip Flop / Register) in jedem Zyklus umschaltet. Diese Art von Konzepten basieren ausschließlich auf FFS, bieten aber auch eine maximale Schaltaktivität (nur in der FFS). fpga_torture basiert auch auf dem Verzehr aller verfügbaren FFS. Darüber hinaus enthält es auch alle verfügbaren LUTS (Nachschlagtabellen), um alle allgemeinen Logikressourcen der FPGA zu verwenden, um einen realistischeren Anwendungsfall zu erstellen. Darüber hinaus ist die resultierende Schaltaktivität chaotischer (kein monotones Umschalten), das auch ein stärkeres Verhalten im wirklichen Leben sorgt.
Der VHDL-Code enthält eine technologisch-agnostische Beschreibung, die keine Primitiven, Attribute oder andere Geräte-/Plattform-spezifische Elemente verwendet. Es wurde auf Gitter (strahlend, sinplifypro) und Intel (Quartus prime) fpgas getestet.
Das fpga_torture -Design basiert auf einer Registerkette, die im Grunde genommen ein "kreisförmiges" modifiziertes Galois LFSR (Linear Feedback Shift Register) implementiert. Die Größe der Kette wird durch die Designs NUM_CELLS generic definiert. Jede Zelle besteht aus einem FF und einer LUT. Die LUT an der Kettenposition I verwendet die Ausgänge aus den drei vorherigen FFS, um den nächsten Wert für das FF der Zelle zu berechnen:
chain(i) <= combine_f(chain(i-3), chain(i-2), chain(i-1));
Ein logisches XOR aller Eingänge wird als Kombinationsfunktion verwendet ( combine_f() ).
Technologieansicht (Ausschnitt, Quartus Prime): Berechnung des nächsten Wertes für die chain[6] über eine LUT unter Verwendung der Zustände der vorherigen drei Registerkette chain[3] , chain[4] und chain[5] und kombiniert sie über XOR:
Der Beginn der Kette verwendet einen zusätzlichen FF, der jeden Taktzyklus umschaltet, um die Kette zu "starten". Nach einer kurzen "Initialisierungszeit" oszilliert die Kette in einer pseudo-randomischen Weise, die eine sehr hohe chaotische Schaltaktivität und einen dynamischen Stromverbrauch erzeugt.
Die obere Entität ist rtl/fpga_torture.vhd :
entity fpga_torture is
generic (
NUM_CELLS : positive -- number of LUT3+FF elements
);
port (
clk_i : in std_ulogic ; -- clock input
rstn_i : in std_ulogic ; -- low-active async reset
out_o : out std_ulogic -- dummy output (LED or unconnected FPGA pin)
);
end fpga_torture ; Das Reset -Signal rstn_i ist optional, wenn das Ziel FPGA die FF -Initialisierung über Bitstream unterstützt. In diesem Fall kann das rstn_i -Signal an 1 gebunden werden. Das out_o -Ausgangssignal ist erforderlich, um zu verhindern, dass das Synthese -Tool die gesamte Designlogik beseitigt. Schließen Sie dieses Signal an einen unkritischen FPGA -Ausgangsstift wie eine LED oder einen nicht verbundenen FPGA -Stift an.
Simulieren/testen Sie die Konfiguration von NUM_CELLS mit der Testbench, bevor Sie die Synthese ausführen. Einige NUM_CELLS -Werte (wie 32) führen zu einer maximalen Schaltaktivität (alle FFS -Umschaltungen in jedem Zyklus).
Die Projekte bieten eine einfache TestBench ( sim/fpga_torture_tb.vhd ), die von GHDL über das Skript ( sim/ghdl.sh ) von GHDL simuliert werden kann:
fpga_torture/sim$ sh ghdl.sh
Die Simulation wird 1 ms mit einem 100 -MHz -Takt ausgeführt. Die Wellenformdaten werden in sim/fpga_torture.vcd gespeichert, sodass sie mit GTKWAVE angezeigt werden können:
fpga_torture/sim$ gtkwave fpga_torture.vcd
Die Gesamtgröße der Kette wird durch die generischen NUM_CELLS definiert. Das Design erfordert NUM_CELLS+1 ffs (Register) und NUM_CELLS+2 lut3s (Nachschlagtabellen, jeweils 3-Eingänge). Einige FPGAs/Toolchains führen möglicherweise auch einige zusätzliche Routenluts ein.
Beispiel zum Zuordnen: Gitter iCE40UP5K-UWG30ITR FPGA, Sinplifypro, NUM_CELLS = 5278
Number of slice registers: 5279 out of 5280 (100%)
Number of I/O registers: 0 out of 63 (0%)
Number of LUT4s: 5280 out of 5280 (100%)
Number of logic LUT4s: 5280
Number of ripple logic: 0 (0 LUT4s)
Number of IO sites used: 3 out of 21 (14%)
Number of Clocks: 1
Net clk_i_c: 5279 loads, 5279 rising, 0 falling (Driver: Port clk_i)
Number of LSRs: 1
Net rstn_i_c_i: 5279 loads, 5279 SLICEs