Memory Mapped I/O
Prinzip der Anbindung von Peripherie-Registern an den Datenbus des SpartanMC
Für die Dekodierung der Adresse des Moduls ist der Block mit dem Symbol (=) im obigen Bild zuständig. Die Basis Adresse für alle I/O Register wird im SpartanMC 18 mit dem Signal access_peri signalisiert. Das Signal wird "1" bei einem Speicherzugriff für alle Adressen >= 0x1A000. Die Dekodierung der Moduladresse erfolgt mit pselect.v im Modul reg_access_decoder.v und realisiert damit den Block

Die Ausgänge aller Datenregister werden über ein 18 Bit breites OR Gatter

Für die Einbindung eines neuen Ein- Ausgabemodul in den SpartanMC 18 muss man sich an die Vorgaben des Konfigurationswerkzeuges halten. Das betrifft vor allem die Reihenfolge und die Namen der Signale des I/O-Busses. Dazu kommen noch einige Parameter und die für die Konfiguration zu erstellende Modulbeschreibungsdatei module.xml.
Aufbau einer Verilog Datei für ein SpartanMC I/O Modul
Ein Beispiel für die Einbindung von Memory-Mapped-Peripherie: io.vAufbau der Modulbeschreibungs-Datei module.xml für dieses SpartanMC I/O Modul
<?xml version="1.0" encoding="UTF-8"?> <peripheral document-type="soc-peripheral-1.0" xmlns="soc-library" xmlns:xi="http://www.w3.org/2001/XInclude"> <header category="Port" label="Muster Port" name="io"> <description>%insert module description here%</description> </header> <hdl lang="verilog" toplevel="io"> <sources toolchain="xilinx"> <modules/> <files>io.v</files> <includes>%Please check whether the includes are correct% </includes> </sources> </hdl> <parameters> <parameter name="PORT_WIDTH" type="int" value="1"> <description>%Insert a parameter description here%</description> </parameter> <parameter name="OD_OUTPUT" type="bool" value="0"> <description>%Insert a parameter description here%</description> </parameter> </parameters> <ports direction="input" group="Processor peripheral interface"/> <xi:include href="../defaults/peripheral.xml"/> <ports direction="output" group="MUSTER-Modul interrupts"> <port descr="%Insert port description here%" name="intr"/> </ports> <ports direction="output" group="Physical MUSTER-Modul interface"> <port descr="%Insert port description here%" name="o_sig1" width="${PORT_WIDTH}"/> <port descr="%Insert port description here%" name="o_sig2" width="${PORT_WIDTH}"/> <port descr="%Insert port description here%" name="o_sig3"/> </ports> <ports direction="input" group="Physical MUSTER-Modul interface"> <port descr="%Insert port description here%" name="i_sig4"/> </ports> <registers> <register access="readwrite" name="PORT1" offset="0"> <description>Specify the ... in PORT1 ... .</description> </register> <register access="write" name="PORT2" offset="1"> <description>Specify the ... in PORT2 ... .</description> </register> <register access="write" name="PORT3" offset="2"> <description>Specify the ... in PORT3 ... .</description> </register> <register access="readwrite" name="PORT4" offset="3"> <description>Specify the ... in PORT4 ... .</description> </register> <register access="write" name="PORT5" offset="4"> <description>Specify the ... in PORT5 ... .</description> </register> </registers> </peripheral>