FPGA Praktikum WS 00/01 Linear Rückgekoppelte Schieberegister und Tristate Treiber Gewöhnlicher Zähler Ripple-Carry Zähler werden mit zunehmender Größe langsamer. 1 & ≠ DFF & ≠ DFF & ≠ DFF & ≠ DFF Alternative Manchmal gibt es eine Alternative zu RippleCarry Zählern LFSR: Linear Feedback Schift Register Linear Rückgekoppelte Schieberegister Bestimmte Bits eines Schieberegisters werden über ein XNOR an den Eingang Rückgekoppelt Beispiel 4-Bit LFSR = DFF 0 1 3 7 14 13 11 6 12 9 2 5 10 4 8 0 0 0 0 0 1 1 1 0 1 1 0 0 1 0 1 0 DFF 0 0 0 1 1 1 0 1 1 0 0 1 0 1 0 0 DFF 0 0 1 1 1 0 1 1 0 0 1 0 1 0 0 0 DFF 0 1 1 1 0 1 1 0 0 1 0 1 0 0 0 0 1 1 1 0 1 1 0 0 1 0 1 0 0 0 0 0 Nachteile LFSR Durchläuft nur 2n-1 Zustände Verschiedene Schrittgrößen sind nicht möglich (+3, etc) Die Reihenfolge ist ziemlich zufällig Kein effizienter Vergleich „>“ möglich. Vorteile LFSR Extrem schnell und klein Nur ein LUT auch bei 168-Bit Zählern Rückwärts zählen ist möglich Mit Zusatzaufwand ist eine Erweiterung auf 2n Zustände möglich Die Reihenfolge ist ziemlich zufällig Rauschgenerator (z.B. C64 SID) Zufallsmuster z.B. für Selbsttest (BIST) Paramter Es gibt keine geschlossene Form, um auszurechnen, welche Bits rückgekoppelt werden müssen. Es gibt Tabellen z.B. von Xilinx Bits 3 4 5 6 7 8 XNOR from 3,2 4,3 5,3 6,5 7,6 8,6,5,4 Bits 9 10 11 12 13 14 XNOR from 9,5 10,7 11,9 12,6,4,1 13,4,3,1 14,5,3,1 Tristate Treiber Ein normales Gatter treibt an seinen Ausgang immer entweder 0 oder 1. Der Zustand ‘X‘ in der Simulation bedeutet nur, daß der Simulator nicht weis, welchen Wert der Ausgang hat. Tristate Treiber können zusätzlich als dritten Zustand den Ausgang ausschalten. Diesen Zustand nennt man „hochohmig“, „tristated“ oder „high impedance“ Abgekürzt wird er mit ‘Z‘ Tristate Treiber Eigenschaften So sieht ein Tristate Treiber im Schaltplan aus: Enable Out In Die Wertetabelle sieht so aus: Enable 1 1 0 0 In 0 1 0 1 Out 0 1 Z Z Vorsicht: Es gibt auch Treiber mit invertiertem Enable Anwendung 1: Bidirektionale Signale Write/notRead output output input input So werden beispielsweise RAMs an Prozessoren angeschlossen Das selbe Signal wird zum lesen und Schreiben von Daten verwenden. Der Prozessor teilt dem RAM mit einem zusätzlichen Signal die Richtung der Datenübertragung mit. Anwendung 2: Große Multiplexer Standard N-zu-1 Multiplexer aus 2-zu-1 Muxes Kosten: N-1 LUTs N-2 zusätzliche Signale Signallaufzeit O(log(N)) Kodierte Eingänge Anwendung 2: Große Multiplexer In1 Sel1 InN SelN In2 Sel2 ... N-zu-1 Multiplexer aus Tristate Treibern Kosten: 0 LUTs N Tristate Treiber (Bei Xilinx praktisch gratis) 0 zusätzliche Signale Signallaufzeit O(1), bei kleinen Muxes jedoch größer als die LUT Variante. Dekodierte Eingänge Anwendung 2: Wired-OR (Open Collector) out b R a gnd Die Eingänge treiben den Ausgang auf 1 oder Z, nie jedoch auf 0. Wenn beide Eingänge auf Z treiben, kann der schwache Widerstand das Signal auf 0 ziehen. Die Schaltung berechnet also ein ODER aus allen Eingängen. Sie ist relativ langsam und wird vor allem auf Platinen verwendet, wenn die Anzahl der Eingänge nicht im Voraus bekannt ist. (z.B. Steckkarten) Im FPGA macht diese Technik Sinn, wenn ein ODER aus sehr vielen Eingängen berechnet werden soll. Wired-AND geht über die DeMorgan Regel Tristate in VHDL In VHDL könnt ihr einem IEEE.STD_LOGIC Signal den Wert ‘Z‘ zuweisen. Ein Tristate Treiber sieht dann z.B. so aus: if enable=‘1‘ then out <= in; else out <= ‘Z‘; end if; Bidirektionale Ports werden als „inout“ deklariert.