8bit-CPU: bo8

Wechseln zu: Navigation, Suche

von:   Josef Gnadl (bome)

Doku und VHDL-Code der von mir entwickelten CPU bo8 werden hiermit
unter der hier im Wiki geltenden Creative-Commons-Lizenz veröffentlicht.
http://creativecommons.org/licenses/by-sa/2.0/de

Die CPU ist Teil eines Gesamt-Projekts: 8bit-Computer: bo8h.
Der Artikel enthält auch eine erläuternde Beschreibung der CPU.

Meine Website zum Projekt: http://www.bo8h.de

Beitrag im Forum: Befehlssatz der bo8-CPU
Dort findet sich auch einiges zur Wortbedeutung der Mnemonics.

06.Jun.16  Befehle neu angeordnet.
11.Sep.18  Der Reset ist jetzt synchron realisiert.
25.Okt.18  Das Timing wurde verbessert.

Download Version 1 (25.Okt.18): Datei:CPU.vhd.txt.zip
Download Version 2 (25.Okt.18): Datei:FCPU.vhd.txt.zip

Der VHDL-Code gilt in dieser Form für RAM-konfiguriertes FPGA.

Im folgenden Text steht der Punkt in den Mnemonics für einen
hier nicht darstellbaren auf der Grundlinie liegenden Bindestrich.

================================================================

P  Q R S  X Y Z    K     V            Bezeichnung:  A7 = U
|  | | |  | | |    |A                               AB = K
|  | | |  | | |    |B


P Programmzähler      Q Rückkehradresse
X Adressregister      R Schleifenstartadresse
Y Adressregister      S Schleifenzähler
Z Adressregister      A Akku   B Erweiterung   V Carry

----------------------------------------------------------------
a0 .. af    Adressleitungen   - Tristate
d0 .. d7    Datenleitungen    - Tristate
N0 .. N3    Typleitungen      - permanente Ausgänge
RES  REP    Reset Repeat      - Eingänge

C0   C1     Takt Takt         - Eingänge, Version 1
clk  ena    Takt Enable       - Eingänge, Version 2


    0     1 2     3 0     1 2     3 0
    [     [ [     [ [     [ [     [ [
====----====----====----====----====----  C0
--====----====----====----====----====--  C1
--==------==------==------==------==----  clk2
    [  tA   [  tB   [  tA   [  tB   [

An Eingängen C0 C1 darf  clk2  statt C0 C1 anliegen


    0     1 2     3 0     1 2     3 0
    [     [ [     [ [     [ [     [ [
--==--==--==--==--==--==--==--==--==--==  clk
====----====----====----====----====----  ena
--==------==------==------==------==----  clk2
    [  tA   [  tB   [  tA   [  tB   [

Am Eingang  clk  darf  clk2  statt  clk  anliegen
In diesem Fall darf  ena  konstant = 1  sein


Die Halbzyklen tA und tB bilden einen Vollzyklus  (tA/tB).

Typleitungen ändern ihren Zustand zu Zeitpunkten   0 und 2
Adressen und Write-Daten sind gültig von Zeitpunkt 0 bis 2
                   Einlesen von Read-Daten zum Zeitpunkt 2
                   Einlesen von REP zu Zeitpunkten 1 und 3
                   REP muß rechtzeitig davor stabil werden

Reset muss enden ab Zeitpunkt 0 bis rechtzeitig vor Zeitpunkt 1.
Danach startet die CPU mit BN.      Bei laufendem Betrieb muss
Reset rechtzeitig vor Zeitpunkt 1 oder Zeitpunkt 3 beginnen.

Bei Reset:
    input P von Adressbus (erster Zeitpunkt 1 nach Reset-Ende)
    input A von Datenbus  (erster Zeitpunkt 1 nach Reset-Ende)
    Das eingelesene P wird auch nach R kopiert.

----------------------------------------------------------------

Typ   Name Funktion              REP bewirkt Einfügen von

0/tB  BN   normal tB   inaktiv                         BN
1/tA  AR   repeat tA   inaktiv   - wiederhole input    AR
2/tA  KA   Adressbus gibt K aus  - Datenbus inaktiv    AR
3/tA  HA   Adressbus gibt K aus  - input A             AR
4/tB  BP   memory-page-Umschaltung für P               BN
5/tB  BX   memory-page-Umschaltung für X               BN
6/tB  BY   memory-page-Umschaltung für Y               BN
7/tB  BZ   memory-page-Umschaltung für Z               BN
8/tA  FE   read  / Adresse ist P / OP-Code             AR
9/tA  WX   write / Adresse ist X                       AR
a/tA  WY   write / Adresse ist Y                       AR
b/tA  WZ   write / Adresse ist Z                       AR
c/tA  RP   read  / Adresse ist P                       AR
d/tA  RX   read  / Adresse ist X                       AR
e/tA  RY   read  / Adresse ist Y                       AR
f/tA  RZ   read  / Adresse ist Z                       AR

----------------------------------------------------------------


      +0     +1     +2     +3     +4     +5     +6     +7

00-   H..    ST.S   SS.X   ST.X   SS.Y   ST.Y   SS.Z   ST.Z
08-   IX0    IX1    IX2    IX3    IX4    IX5    IX6    IX7
10-   IY0    IY1    IY2    IY3    IY4    IY5    IY6    IY7
18-   IZ0    IZ1    IZ2    IZ3    IZ4    IZ5    IZ6    IZ7
20-   ZO.S   SL.S   ZO.X   SL.X   ZO.Y   SL.Y   ZO.Z   SL.Z
28-   DX0    DX1    DX2    DX3    DX4    DX5    DX6    DX7
30-   DY0    DY1    DY2    DY3    DY4    DY5    DY6    DY7
38-   DZ0    DZ1    DZ2    DZ3    DZ4    DZ5    DZ6    DZ7
40-   O.VZ   O.VS   B.VZ   B.VS   O.UZ   O.US   B.UZ   B.US
48-   O.AZ   O.AS   B.AZ   B.AS   O.KZ   O.KS   B.KZ   B.KS
50-   O.WY   O.RP   B.WY   B.CN   GTR    ADR    GTA    NON
58-   IKL    DKL    IXL    DXL    IYL    DYL    IZL    DZL
60-   AD.    LV.    AV.    SV.    GT.    AN.    XR.    NR.
68-   STMX   LVMX   AVMX   SVMX   GTMX   ANMX   XRMX   NRMX
70-   STMY   LVMY   AVMY   SVMY   GTMY   ANMY   XRMY   NRMY
78-   STMZ   LVMZ   AVMZ   SVMZ   GTMZ   ANMZ   XRMZ   NRMZ
80-   ST.B   LV.B   AV.B   SV.B   GT.B   AN.B   XR.B   NR.B
88-   SL.K   TA1    TA2    TA3    TA4    TA5    TA6    TA7
90-   NO1    TK1    TK2    TK3    TK4    TK5    TK6    TK7
98-   TK8    TK9    TKa    TKb    TKc    TKd    TKe    TKf
a0-   EX.S   LV.S   AV.S   SV.S   GT.S   LD.S   AD.S   SD.S
a8-   EX.X   ES.X   SW.X   RS.X   GT.X   LD.X   AD.X   SD.X
b0-   EX.Y   ES.Y   SW.Y   RS.Y   GT.Y   LD.Y   AD.Y   SD.Y
b8-   EX.Z   ES.Z   SW.Z   RS.Z   GT.Z   LD.Z   AD.Z   SD.Z
c0-   R.VZ   R.VS   R.UZ   R.US   R.AZ   R.AS   R.KZ   R.KS
c8-   R.WY   R.CN   R.IX   R.DX   R.IY   R.DY   R.IZ   R.DZ
d0-   GH.S   GL.S   GH.X   GL.X   GH.Y   GL.Y   GH.Z   GL.Z
d8-   IC.S   DC.S   IXE    DXE    IYE    DYE    IZE    DZE
e0-   PV.B   TZ.B   PV.A   TZ.A   SE.U   NE.U   ZO.U   CP.V
e8-   RD.B   RU.B   RD.A   RU.A   SE.V   NE.V   ZO.V   CR.V
f0-   ZO.B   NE.B   ZO.A   NE.A   IV.A   DV.A   NO2    S.RP
f8-   IC.K   DC.K   ZO.K   NE.K   IC.A   DC.A   GT.Q   J..


00 .. 3f     1 Byte
40 .. 67     2 Byte
68 .. ff     1 Byte

00 .. 3f     1 Zyklus   / Sonderfall 00
40 .. 53   2|3 Zyklen
54 .. 7f     2 Zyklen   / Sonderfall 57
80 .. ff     1 Zyklus   / Sonderfall f6

Während der Ausführung eines Befehls
wird der nachfolgende OpCode geladen.

----------------------------------------------------------------
nn  ist zweites Byte eines 2-Byte-Befehls ,    %  ist  X|Y|Z

AN.B      A <=  A and B
NR.B      A <=  A nor B
XR.B      A <=  A xor B
AV.B      A <=  A+B+V            V <= Carry
SV.B      A <=  A-B-V            V <= Carry
LV.B      A <=  B-A-V            V <= Carry
GT.B      A <=  B
ST.B      B <=  A

AN. nn    A <=  A and nn
NR. nn    A <=  A nor nn
XR. nn    A <=  A xor nn
AV. nn    A <=  A+nn+V           V <= Carry
SV. nn    A <=  A-nn-V           V <= Carry
LV. nn    A <=  nn-A-V           V <= Carry
GT. nn    A <=  nn
AD. nn    A <=  A+nn

ANM%      A <=  A and (%)
NRM%      A <=  A nor (%)
XRM%      A <=  A xor (%)
AVM%      A <=  A+(%)+V          V <= Carry
SVM%      A <=  A-(%)-V          V <= Carry
LVM%      A <=  (%)-A-V          V <= Carry
GTM%      A <=  (%)
STM%     (%) <=  A

AV.S      K <=  K+S+V            V <= Carry
SV.S      K <=  K-S-V            V <= Carry
LV.S      K <=  S-K-V            V <= Carry

AD.S      K <=  K+S
SD.S      K <=  K-S
LD.S      K <=  S-K

AD.%      K <=  K+%
SD.%      K <=  K-%
LD.%      K <=  %-K

GT.S      K <=  S
ST.S      S <=  K
GT.%      K <=  %
ST.%      % <=  K

RS.%      S <=  %
SS.%      % <=  S

SL.K      B <=  A ,    A <= 0

SL.S      S LowByte <= A ,  S HighByte <= 0
SL.%      % LowByte <= A ,  % HighByte <= 0

GL.S      A <= LowByte  von S
GH.S      A <= HighByte von S
GL.%      A <= LowByte  von %
GH.%      A <= HighByte von %

EX.S      Austausch  K <> S
EX.%      Austausch  K <> %
ES.%      Austausch  S <> %

ZO.S      S <= 0
ZO.%      % <= 0

NE.V      V  wird logisch negiert
NE.U      U  wird logisch negiert
NE.A      A  wird logisch negiert
NE.B      B  wird logisch negiert
NE.K      K  wird logisch negiert

ZO.V      V <= 0
ZO.U      U <= 0
ZO.A      A <= 0
ZO.B      B <= 0
ZO.K      K <= 0

SE.V      V <= 1
SE.U      U <= 1

IV.A      A <=  A+V              V <= Carry
DV.A      A <=  A-V              V <= Carry

IC.A      A <=  A+1
IC.K      K <=  K+1
IC.S      S <=  S+1

DC.A      A <=  A-1
DC.K      K <=  K-1
DC.S      S <=  S-1

PV.A      A <=  8-fache Kopie von V ,  V <= 0
PV.B      B <=  8-fache Kopie von V ,  V <= 0

TZ.A      wenn nicht  A=0   dann   ( V <= 1 )
TZ.B      wenn nicht  B=0   dann   ( V <= 1 )

RD.A      A wird nach unten durch V rotiert
           Resultat V7654321      V <= Bit0
RD.B      B wird nach unten durch V rotiert
           Resultat V7654321      V <= Bit0

RU.A      A wird nach oben  durch V rotiert
           Resultat 6543210V      V <= Bit7
RU.B      B wird nach oben  durch V rotiert
           Resultat 6543210V      V <= Bit7

CP.V      V <=  V xor U
CR.V      U <=  V xor U , dann wird ein RU.A ausgeführt

TAs  mit s= 1..7      A wird s Bitstellen nach oben verdreht
                      Resultat von TA3 ist 43210765

TKs  mit s= 1..f      K wird s Bitstellen nach oben verdreht

I%s  mit s= 0..7      % <=  %+s+1
D%s  mit s= 0..7      % <=  %-s-1

I%E       % <= %+1 ,  und Austausch  A <> B
D%E       % <= %-1 ,  und Austausch  A <> B

IKL nn    K <=  K+nn+1
DKL nn    K <=  K-nn-1
I%L nn    % <=  %+nn+1
D%L nn    % <=  %-nn-1

GTA nn    K <=     00nn
GTR nn    K <=     P+nn+3
ADR nn    K <=   K+P+nn+3

NO1       no operation       1 Zyklus
NO2       no operation       2 Zyklen

NON nn    no operation    2+nn Zyklen   falls nn > 0
NON 00    K <=  R            2 Zyklen

GT.Q      K <=  Q

S.RP        R <= P+1
O.RP nn     R <= P+2 ,   P <= P+nn+3

Bedingung cc ist    WY   always
                    VZ   V ist 0
                    VS   V ist nicht 0
                    UZ   U ist 0
                    US   U ist nicht 0
                    AZ   A ist 0
                    AS   A ist nicht 0
                    KZ   K ist 0
                    KS   K ist nicht 0

O.cc nn    wenn cc         dann ( P <= P+nn+3 )
B.cc nn    wenn cc         dann ( P <= P-nn-1 )
B.CN nn    wenn nicht S=0  dann ( P <= P-nn-1 , S <= S-1 )

R.cc    wenn cc         dann ( P <= R )
R.CN    wenn nicht S=0  dann ( P <= R , S <= S-1 )
R.I%    wenn nicht S=0  dann ( P <= R , S <= S-1 , % <= %+1 )
R.D%    wenn nicht S=0  dann ( P <= R , S <= S-1 , % <= %-1 )

Bei  O.VZ, O.VS, B.VZ, B.VS, R.VZ, R.VS   wird   V <= 0

Alle O-,B- Operationen dauern  3 Zyklen | 2 Zyklen
           wenn der Sprung erfolgt | nicht erfolgt

J..     P <= K ,  R <= K ,    Q <= P+1 ,  K <= P+1

SW.%    Nach dem Einlesen des folgenden OpCodes mit FE wird
        statt eines BN ein B% ausgegeben.  Das soll extern
        eine memory-page-Umschaltung für %  bewirken.  Das
        Resultat muss schon beim folgenden tA bereitstehen.

H..     Nach dem Einlesen des folgenden OpCodes mit FE wird
        statt eines BN ein BP ausgegeben.  Das soll extern
        eine memory-page-Umschaltung für P  bewirken.  Das
        Resultat muss schon beim folgenden tA bereitstehen.

        Wenn der eingelesene folgende OpCode ein J.. ist,
        ist H.. damit beendet. Dauer von H.. ist 1 Zyklus.

        Wenn der OpCode kein J.. ist, folgt ein IO-Zyklus
        (HA/BP). Das BP  soll die memory-page-Umschaltung
        für P wieder aufheben. Dauer von H.. ist 2 Zyklen.

        Ausnahme:  Wenn der OpCode wieder ein H.. ist,
        folgt (KA/BP) statt (HA/BP). Danach bleibt die
        CPU im Zustand BN bis ein Reset erfolgt.