Hello World – CPLD

Heute möchte ich euch zeigen wie man einen Logikschaltkreis programmiert. Für alle die boolsche Algebra hassen sei gesagt, dafür gibt es doch Computer, die machen das.

Man sieht, dass man jede logische Funktion in Form einer Tabelle in einem Speicher abbilden kann. Da man diesen Speicher frei programmieren kann, kann der IC beliebige Gatter abbilden. Das wurde natürlich immer weiter verfeinert und so gibt es heute umfangreiche Entwicklungsumgebungen die es erlauben in einer Hochsprache (z.B. VHDL oder Verilog) die Aufgabe zu beschreiben. Der Vorteil ist, dass alle Operationen parallel verarbeitet werden, der Nachteil das ist bei komplexten Problemen meist schwer zu verstehen was da alles gleichzeitig passiert und sich beeinflusst. Der Große Bruder des CPLD ist der FPGA dieser hat mehr Logikzellen, fest integrierte Multiplikatoren und interne RAM Blöcke. Als Einstieg reicht jedoch ein CPLD völlig aus.

Das Board hat 5 LEDs. D1 ist die Anzeige für die Versorgunsspannung.

FunktionCPLD – PINFunktion
LED – D1VCC IOEinfache Power LED
LED – D2 P34 I/O oder Tri-State Eingang
LED – D3P33I/O oder Globaler Reset Eingang
LED – D4P32I/O
LED – D4P31I/O
CLK 50MHzP1I/O oder Globaler Tackteingang

Das Hello World soll die LEDs etwas blinken lassen. Das Bord hat einen 50MHz Quarz der an einen der drei Takteingänge angeschlossen ist. Damit das Ganze nun nicht mit 25MHz blikt programmieren wir einen 25 Bit Zähler. Dieser fängt, wenn er überläuft, immer wieder von vorne an. Wir kopieren die obersten Bits des Counters in die LEDs und los gehts.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity HelloWorld is
    Port ( CLK  : in   STD_LOGIC;
           LED1 : out  STD_LOGIC;
           LED2 : out  STD_LOGIC;
           LED3 : out  STD_LOGIC;
           LED4 : out  STD_LOGIC);
end HelloWorld;

architecture Behavioral of HelloWorld is
signal Coutdown : STD_LOGIC_VECTOR(24 downto 0);
begin
  process (CLK)
  begin
    if rising_edge(CLK) then
      Coutdown <= Coutdown + X"000001";
      LED1 <= Coutdown(24);
      LED2 <= Coutdown(23);
      LED3 <= Coutdown(22);
      LED4 <= Coutdown(21); 
    end if;
  end process;
end Behavioral;

Was jetzt noch fehlt ist die Zuweisung der Pins zu den LED Signalen und zum CLK. Das passiert nicht im VHDL Modul sondern ist Teil der Synthese. Dieses Modul kann später ein Teil eines großen Projektes sein oder eben einfach an Pins gedrahtet werden. Die Zuodnung wird in einer UCF Datei festgelegt.

NET "CLK"  LOC = "P1"  ; 
NET "LED1"  LOC = "P34"  ; 
NET "LED2"  LOC = "P33"  ; 
NET "LED3"  LOC = "P32"  ; 
NET "LED4"  LOC = "P31"  ; 

Und hier sehen wir eine Übersicht über die generierte Logik. Ein Zähler und einen Block der um einen Tackt verzögert das Ergebnis an die Ausgänge kopiert.

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.