Steuerdatei des Simulations- netzwerkes

# Diese Datei simuliert die vollständige PWM-Logik.
#
# Die externen Ein/Ausgänge für die Simulation sind 
#
# zum muC:
#    I0..I5         In   Zu berechnende Impulsnummer
#    ZRQ    	    In   zycb Anfrage
#    ZACK   	    Out  zycb Zyklus beendet
#
# zum Ausgangsbus:
#    B0..B3  	    Out  Bank Adresse auf dem Ausgangsbus
#    FWD0O..FWD15O  Out  Forward Impulsdaten auf dem Ausgangsbus
#    RVD0O..RVD15O  Out  Backwards Impulsdaten auf dem Ausgangsbus
#
# Zusätzlich kann in den ersten 256 Bytes des RAM-Bausteins die
# Geschwindigkeit der Ausgänge eingestellt werden.
#

# Das CLK Signal taktet die GALs
Sequence( CLK = 0:1:cycle );

# Das ZRQ Signal liefert einen Anfrageimpuls. Die Länge 
# des ZRQ Signals entspricht dem kleinsten Wert der einen
# vollständigen zycb Zyklus erlaubt
Sequence( ZRQ = 10*0:7746*1:10*0 );

Output[..90,420..510,7676..](
    CLK[fast], 

    @for{0..7:,}{C$$}, 
    Ax = @for{0..7}{A$$}, A8, A9, 
    Dx = @for{0..7}{D$$},
    IP, D5O, D6O,
    BANK, DONE, REN,

    ZRQ, ZACK,
    CNCLK, OUTL, ZZ1,
    RRQ, RACK,
    L1EN, L2EN, L2L, SRCLK, RZ1, RZ2,

    FWD, RVD, 

    B0, B1, B2, B3,
    FWDxO = @for{0..15}{FWD$$O}, 
    RVDxO = @for{0..15}{RVD$$O} );

# Festlegen der aktuellen Impulsnummer
Gate(I0=0, I1=1, I2=1, I3=1, I4=0, I5=1);

# RAM Baustein: Am Anfang werden die Geschwindigkeitsdaten für alle
# 256 Ausgänge angegeben
Memory[ enable  => REN, 
	address => @for{0..9}{A$$},
	data    => @for{0..7}{D$$} ](

    0x000: 0x7F 0x2C 0x18 0x05 0x72 0x2B 0x55 0x47
           0x07 0x5E 0x50 0x43 0x6F 0x31 0x2C 0x56
           0x7A 0x58 0x71 0x5F 0x58 0x78 0x2A 0x67
           0x07 0x1C 0x07 0x50 0x72 0x79 0x30 0x62
           0x26 0x49 0x67 0x19 0x75 0x3D 0x61 0x7C
           0x1B 0x31 0x40 0x0B 0x63 0x6C 0x61 0x5D
           0x45 0x53 0x3C 0x1D 0x4B 0x66 0x05 0x53
           0x03 0x0C 0x23 0x75 0x05 0x54 0x57 0x2C
           0x1D 0x3F 0x45 0x12 0x7D 0x27 0x0F 0x18
           0x58 0x4F 0x24 0x3B 0x3C 0x05 0x19 0x01
           0x59 0x56 0x1E 0x24 0x3D 0x24 0x78 0x40
           0x30 0x1B 0x35 0x36 0x70 0x0D 0x62 0x0D
           0x4D 0x28 0x20 0x4A 0x4F 0x2F 0x63 0x28
           0x7F 0x07 0x63 0x3B 0x0C 0x7D 0x3C 0x65
           0x53 0x5B 0x0A 0x10 0x7F 0x02 0x50 0x2F
           0x1E 0x06 0x66 0x0E 0x13 0x48 0x1C 0x60
           0x70 0x3C 0x2A 0x40 0x6C 0x0D 0x68 0x6B
           0x14 0x4C 0x26 0x21 0x49 0x63 0x07 0x1D
           0x3E 0x11 0x2D 0x3E 0x13 0x7E 0x6E 0x32
           0x04 0x54 0x40 0x17 0x1D 0x5C 0x78 0x0E
           0x19 0x23 0x4E 0x05 0x30 0x37 0x70 0x45
           0x03 0x17 0x67 0x4D 0x7A 0x6E 0x6A 0x39
           0x7F 0x18 0x77 0x13 0x16 0x66 0x45 0x1B
           0x3A 0x06 0x33 0x57 0x62 0x2B 0x65 0x7B
           0x4E 0x34 0x01 0x7F 0x6B 0x71 0x45 0x6F
           0x08 0x2C 0x3D 0x02 0x1A 0x27 0x3C 0x1A
           0x40 0x33 0x2D 0x56 0x19 0x73 0x71 0x54
           0x7A 0x24 0x2B 0x5D 0x50 0x11 0x58 0x1E
           0x46 0x5A 0x1E 0x31 0x4B 0x63 0x21 0x54
           0x0F 0x5E 0x57 0x2A 0x05 0x13 0x44 0x46
           0x46 0x72 0x1C 0x60 0x65 0x0E 0x34 0x5F
           0x33 0x60 0x3C 0x04 0x72 0x15 0x23 0x38,

######################################################################
# Jetzt folgen die Impulsdaten. Diese Daten sind statisch.
           
    0x200: @include "../pwmtable.sim" );

######################################################################
# Externe Bauteile

# Zähler
Counter[CNCLK]( @for{0..7:,}{C$$} );

# Latch 1
Gate[L1EN]( A0a = C4, A1a = C5, A2a = C6, A3a = C7,
	    A4a = C0, A5a = C1, A6a = C2, A7a = C3 );

# Latch 2
Register[ type => level, trigger => L2L, enable => L2EN ](
    A0b = I3, A1b = I4, A2b = I5,
    A3b = D0, A4b = D1, A5b = D2, A6b = D3, A7b = D4);

# Speicher für die Datenbits D5 und D6
Register[ type => level, trigger => L2L](
    D5O = pullup(D5),
    D6O = pullup(D6) );

# Joins
Gate( @for{0..7:,}{A$$ = A$$a & A$$b} );

# 8 zu 1 decoder
Gate( IP = @for{n=0..7:+}{ pullup(D${n})*
                           @for{0..2:*}{${${n}&(1<<$_)?'':'/'}I$$} } );

# Ausgans-Schieberegister FWD
Register[SRCLK]( FWD0=FWD, @for{1..15:,}{FWD$$=FWD${$_-1}} );

# Ausgangs-Schieberegister RVD
Register[SRCLK]( RVD0=RVD, @for{n=1..15:,}{RVD${n}=RVD${n:$_-1}} );

# Ausgangslatch
Register[ type => level, trigger => OUTL ](
    @for{0..15:,}{FWD$$O=FWD$$},
    @for{0..15:,}{RVD$$O=RVD$$},
    B0=C4, B1=C5, B2=C6, B3=C7 );

######################################################################
# GAL Bausteine

@pl{`lg2sim -z Z -c CLK zycb.lg.doc`}
@pl{`lg2sim -z R -c CLK readb.lg.doc`}
zurück