Sonntag, 23. März 2014

Eine neue Programmiersprache: Verilog

Nun habe ich also ein CPLD-Experimentiersystem, aber absolut noch keine Idee, wie ich damit etwas anfangen soll. Nach kurzem Googlen weiß ich nun, dass es drei Wege gibt, dem CPLD beizubringen, wie er sich zu verhalten hat: Zum einen kann man einen Schaltplan aus TTL-Bausteinen zeichnen und das ganze beliebig kompliziert verschalten. Zum anderen kann man in entweder Verilog oder VHDL die Struktur und die Arbeitsweise des Chips beschreiben.
In allen Publikationen habe ich gelesen, dass die programmierte Variante wohl auch die übersichtlichste sei, da man hier auch einfacher Module und Baugruppen definieren könne. Zwischen VHDL und Verilog gibt es funktional keinen großen Unterschied. VHDL ist wohl eher die europäische Sprache der Wahl, während man über'm Teich eher Verilog den Vorzug gibt. Ich hatte mich vor Jahren schon mal mit VHDL bemüht, aber das war irgendwie nicht meine Welt. Nun habe ich mich ein wenig mit Verilog beschäftigt und muss sagen, dass mir das alles irgendwie logischer und einfacher erscheint.
Zum Probieren und Zusammenstöpseln von kleinen Beispielen muss man nun auch keine Gigabytes auf die Platte schaufeln, denn es gibt einen kleinen Mini-Simulator mit Namen "Icarus Verilog" oder auch "IVerilog". Er erzeugt ein Präcompilat, welches wiederum einen Interpreter bedarf. Dieser kann die Test-Ausgaben dann entweder per Print-Ausgabe tabellarisch darstellen oder aber, was mir sehr gut gefällt, die Daten auf die Platte schreiben, um sie mit GtkWave darzustellen.
Hier habe ich mal ein Beispiel eines Vergleichers, also ein Gatter mit zwei Eingängen und einem Ausgang. Der Ausgang soll genau dann 1 sein, wenn beide Eingänge 1 oder beide 0 sind. Das ganze sieht dann in Verilog so aus:
module comparator(
    input x,
    input y,
    output z
    );
assign z = (~x & ~y) |(x & y);
endmodule
Alles in Verilog spielt sich in Modulen ab. Sie haben Parameter, die über eine externe Datei später den physikalischen Pins des CPLD (oder auch des FPGA) zugeordnet werden. Dann haben sie natürlich eine Anweisung, was denn alles so passieren soll, wenn sich die Signale ändern, hier die Assign-Anweisung. Das war's auch schon. Mit einem weiteren Test-Modul, dass periodisch die Eingänge ändert, sieht das dann in GtkWave so aus:

Es gibt übrigens eine interessante Internetseite mit dem Namen opencores.org. Dort findet man hunderte fix und fertige Verilog- oder VHDL-Module. Da gibt es (hauptsächlich für FPGAs, weil die viel mächtiger als CPLDs sind) Gigabit-Ethernetcontroller, CRC32 Rechner, Video-Chips, 200 MHz RISC CPUs, Nachbauten von 6502, Z80, 68000, usw., ja, sogar ganze Rechner wie z. B. ein C64 zum Herunterladen in einen FPGA findet man dort.
Interessant. Ich frage mich gerade, warum ich einen Z8 mit einem CPLD erweitere, anstatt einen FPGA zu nehmen und dort ein CP/M-Plus System mit 200 MHz aufzubauen... :-)
Nun, immer erst einmal einen Schritt nach dem anderen. Jetzt lerne ich erst mal Verilog und versuche darin meinen SD-Karten Treiber zu entwickeln.

Keine Kommentare:

Kommentar veröffentlichen