Da die Erzeugung von ROM-Beschreibungen in
Hardware-Beschreibungssprachen aus Binärdateien etwas schwierig ist
(Beispiel:
https://www.mikrocontroller.net/articles/Retrocomputing_auf_FPGA#.28P.29ROM-Images),
habe ich ein Hilfsprogramm geschrieben, welche diese Aufgabe
automatisiert. Es ist bewußt so gehalten, das es z.B. nach einem
Assembler- oder Compilerlauf als weiteren Schritt aufgerufen werden
kann.
Momentan werden nur 8-Bit-ROM's und VHDL-Exporte unterstützt, aber es
kann zwischen getakteten und nicht-getakteten Implementierungen mit
wahlweisem "output enable"-Eingang gewählt werden.
Weiterhin werden mehrere Quellen unterstützt, wobei die Quellenangabe
optional einen Byte-Offset, eine Byte-Länge und die Zieladresse im ROM
haben kann. Das Beispiel wurde mit dem Aufruf
Ups... wußte ich noch nicht. Ich wollte mein Minimal-Z80 System in VHDL
nachbauen und fand gerade für die Weiterentwicklung des Monitorprogramms
den hier im Wiki beschriebenen Weg recht umständlich.
Danke für die Anregungen - Endianess-Unterstützung werde ich mit
einbauen, Unterstützung für elf-Dateien wohl auch.
Ich habe es endlich geschafft, eine Win32-Version zu compilieren:
https://sourceforge.net/projects/romgenerator/files/?source=navbar
Könnte mir jemand mit Windows die Funktion bestätigen? Ein Aufruf
"romGenerator -h" würde schon reichen....
Nur so als Bemerkung: So ein simples Tool würde ich in Python
schreiben/portieren, die nötigen Hilfsmittel wie elf.py, intelhex.py,
usw. sind schnell gefunden und es funktioniert dann
plattformübergreifend, zudem hat der Endanwender mehr Nutzen davon.
Rüdiger schrieb:> fand gerade für die Weiterentwicklung des Monitorprogramms> den hier im Wiki beschriebenen Weg recht umständlich.
Auf welche Beschreibung beziehst Du dich?
MfG,
Fpga K. schrieb:> Rüdiger schrieb:>> fand gerade für die Weiterentwicklung des Monitorprogramms>> den hier im Wiki beschriebenen Weg recht umständlich.>> Auf welche Beschreibung beziehst Du dich?>> MfG,https://www.mikrocontroller.net/articles/Retrocomputing_auf_FPGA#.28P.29ROM-Images
Zum Thema Python: sicher wäre dies auch eine potentielle
Implementierungssprache. Nicht umsonst hat sie ja auch viele Anhänger.
Allerdings sprechen auch einige Punkte dagegen:
* Ich bin in Python weniger geübt als in C++
* Beim Endanwender müßte dann auch ein Python-Interpreter installiert
sein.
* Zumindest bei Gentoo habe ich die Erfahrung gemacht, daß die dortigen
in
Python geschriebenen Paketverwaltungsprogramme manchmal recht
empfindlich
auf eine falsche Python-Version reagieren.
Rüdiger schrieb:> Fpga K. schrieb:>> Rüdiger schrieb:>>> fand gerade für die Weiterentwicklung des Monitorprogramms>>> den hier im Wiki beschriebenen Weg recht umständlich.>>>> Auf welche Beschreibung beziehst Du dich?>> https://www.mikrocontroller.net/articles/Retrocomputing_auf_FPGA#.28P.29ROM-Images
OK, ich setz mal an dieser Stelle einen Verweis auf deine Soft. Sinnvoll
scheint mir auch ein Codeschnipsel der zeigt wie aus HEX VHDL wird. Die
Beschreibung ist umständlich geraten da ich zeigen wollte wie man mit
(Linux-)Bordmittel (Editor, Basis-tools wie od) Hexfile convertieren
kann, also ohne Programmiersprache auskommt.
Duke Scarring schrieb:> Danke Rüdiger.> Wenn man sich mit Softcores beschäftigt, findet man eigentlich bei allen> CPUs ein entsprechendes Hilfsprogramm.
Vor der Beschäftigung mit den Xilinx-Hilfstools zur ROM-Initialisierung
nannte man mich der Haare wegen Winnetou, danach Kojak ....
Insbesonders bei der Benutzung des picoblazes hatt man lernen müßen das
die ROM-Initialisierung per VHDL-array noch die Vorgehensweise mit den
wenigsten Problemen ist. Allerdings muß man sich dann selbst um die
Konvertierung Hex->VHDL kümmern. Da kommt dein Tool gerade recht ->
Danke.
MfG,
Deine Beschreibung ist gut, aber gerade wenn man am Assembler-Quelltext
herumspielt, hat man irgendwann keine Lust mehr auf die manuelle
Variante... ;-)
Die Hilfe kann man mit -h aufrufen:
1
./romGenerator-x64-1.0.0 -h
2
./romGenerator-x64-1.0.0 command line switches:
3
-activeClockFlank - Specification of the active clock flank ([RisingEdge|FallingEdge|None]) (Currently: None)
4
-addressBusBitWidth - Width of the address bus interface in number of bits (range [4, 32]) (Currently: 10)
5
-dataBusBitWidth - Width of the data bus interface in number of bits (multiple of 8, range [8, 8]). (Currently: 8)
6
-defaultValue - Value to return for unspecified ROM cells. (Currently: 0x0)
7
-entityName - Name of the generated entity. (Currently: ROM)
8
-h - Help for all or a single command line arguments.
9
-outputEnable - Type of the output enable input ([LowActive|HighActive|None]) (Currently: LowActive)
10
-outputFile - Name of the output file.
11
-outputFormat - Output format (one of [VHDL] (Currently: VHDL)
12
-sources - pathToFile{::mapTo[ROM base byte addr]}{::offset[byte offset in file]}{::length[byte length]},... (e.g. file.bin::offset0x20::length1024::mapTo0x8000,file2.bin)
Will man aus der Datei "prog.bin" die VHDL-Datei eines ungetakteten
ROM's mit L-aktiven OE (Standard-Vorgabe) und 12 Addressbits generieren
und dabei die ersten 5 Bytes überspringen, dann lautet der Aufruf
> architecture BEHAVIOR of ROM is> type romtable_t is array(0 to 4095) of std_logic_vector(7 downto 0);> signal Dint : std_logic_vector(7 downto 0);> constant ROMdata : romtable_t := (
x"05", x"06", x"07", x"08", x"0a", x"0b", x"0c", x"0d", x"0e", x"0f"
x"10",
x"11", x"12", others => x"00");
>
Du kannst es auch etwas kürzer Schreiben. Das mach die Datei etwas
übersichtlicher.
Es geht auch mit Freebasic wunderbar oder Purebasic.
Ich habe ein Tool für mich enwickelt für :
1Bit : "0" , "1".....
8Bit(Byte) : "01010101" ,"10101010"......
2Hex : x"fd" , x"34".....
4Hex : x"1fe3" , x"1234"......
und Deci : "255" , "111"....
Und Nibble für die Textausgabe auf dem VGA vom DE0, DE1 welches ich
brauche.
Davor der Kopf für das RAM , Constant usw und den Körper für die
Ausführung.
Es ist nicht schwer so etwas.
Gruss
@Rene: das Programm kann auch mehrere Datenblöcke einlesen, etwa für
Font- oder andere Datenbereiche. Dann braucht man schon die Adressen.
@Peter: Der Gedanke ist ja, diesen Prozeß vollautomatisch in die
Übersetzung einzubinden, also Compiler/Assembler, VHDL-Generator, ja
evtl. sogar die FPGA-Übersetzung.
Ich habe das Programm erfolgreich für ein Z80-Projekt einsetzen können.
Per Makefile kann ich das ROM direkt nach dem Assembler-Lauf generieren
lassen.
Funktionieren tut es, der Z80 zählt brav die Binärwerte hoch.
Allerdings zeigt mit Quartus in der Zusammenfassung "Total memory bits:
0".
Bedeuted dies, daß kein Block-RAM zur Implementierung verwendet wurde?
Wie müßte (wenn überhaupt sinnvoll) der Quelltext abgeändert werden?
1
-- Creation time: Sun Jul 12 20:15:04 2015
2
-- Address bits: 10
3
-- Data bus bits: 8
4
-- Endianess: BigEndian
5
-- Active clock flank: None
6
-- Output enable type: LowActive
7
-- Source mapping:
8
-- program.bin bytes [0x0, 0x13] -> ROM byte range [0x0, 0x13]
Rüdiger schrieb:>> Allerdings zeigt mit Quartus in der Zusammenfassung "Total memory bits:> 0".> Bedeuted dies, daß kein Block-RAM zur Implementierung verwendet wurde?> Wie müßte (wenn überhaupt sinnvoll) der Quelltext abgeändert werden?>
Damit er Blockram verwendet, braucht es mit hoher Wahrscheinlichkeit
eine Clock. Näheres findet man in den Coding Rules des Synthese Tools.
Noch etwas: innerhalb eines FPGAs gibt es kein 'Z', das OE macht also
nicht das was du dir vorstellst.
Richtig, wenn ich das ROM getaktet erzeuge, dann wird das Block-RAM
verwendet (Option: --activeClockFlank=FallingEdge).
Das mit dem "Z"-Zustand verstehe ich allerdings nicht; dieser müßte doch
durch Ausgangstreiber bereit gestellt werden?
Ansonsten macht std_logic ja auch kaum Sinn, denn die Motivation lag ja
gerade im Zugriff auf gemeinsam genutzte Leitungen wie es hier durch den
Datenbus notwendig geworden ist!
Und soweit ich mich erinnern kann, hat auch die SPI-Implementierung von
OpenCores einige Leitungen mit 'Z' betrieben.