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(external link) mit dem Symbol (=) aus dem obigen Bild und den darüber liegenden Decoder. Der Decoder erzeugt drei verschiedene select Signale, reg_select, reg_write und reg_read. Die reg_select Signale werden bei jedem Zugriff auf ein Register des Moduls im 2. Takt des Speicherbefehls aktiv. In die reg_write Signale ist das WE-Signal aus dem Bild bereits eingebunden, so das sie nur noch beim Schreiben eines Registers im 2. Takt des S9 oder S18 Befehls entstehen. In die reg_read Signale wird dagegen das ~WE Signal eingebunden und sie werden um einen Takt verzögert, wodurch sie im 3. Takt des l9 oder l18 Befehls entstehen.

Die Ausgänge aller Datenregister werden über ein 18 Bit breites OR Gatter(external link) zum Eingang des SpartanMC 18 Datenbus geleitet. Diese Funktion realisiert der Block mit der Bezeichnung OR-Gate im obigen Bild. Er befindet sich im SpartanMC und wird automatisch configuriert. Dazu wird jedem I/O-Modul ein 18 Bit breites Leitungsbündel di_peri vom jConfig am OR-Gate bereitgestellt.

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.v

Aufbau 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>



SpartanMC