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>
