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.
Meine Website zum Projekt: http://www.bo8h.de

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

25.Dez.13  Es gibt nun eine zur Verwendung als Softcore innerhalb eines
FPGA optimierte Version der CPU, welche mit nur 1 Taktsignal auskommt.

04.Jan.14  Die 2-Taktsignal-Version wurde nun auch für FPGA optimiert.
Beide Versionen sind jetzt bis auf die unterschiedliche Taktung gleich.

06.Jun.16  Befehle neu angeordnet.

11.Sep.18  Der Reset ist jetzt synchron realisiert.
Die Wirkung der Codefolge H.. H.. wurde geändert.

Download Version 1 (11.Sep.18): Datei:CPU.vhd.txt.zip
Download Version 2 (11.Sep.18): Datei:FCPU.vhd.txt.zip

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

Der Punkt in den Mnemonics steht 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


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


----------------------------------------------------------------
nn sei das zweite Byte eines 2-Byte-Befehls
& stehe für A|B    % stehe für X|Y|Z    $ stehe für S|X|Y|Z

AN. nn         A wird   A and nn
NR. nn         A wird   A nor nn
XR. nn         A wird   A xor nn
AV. nn         A wird   A+nn+V          V erhält Übertrag
SV. nn         A wird   A-nn-V          V erhält Übertrag
LV. nn         A wird   nn-A-V          V erhält Übertrag
GT. nn         A wird   nn
AD. nn         A wird   A+nn

ANM% | AN.B    A wird   A and op
NRM% | NR.B    A wird   A nor op
XRM% | XR.B    A wird   A xor op
AVM% | AV.B    A wird   A+op+V          V erhält Übertrag
SVM% | SV.B    A wird   A-op-V          V erhält Übertrag
LVM% | LV.B    A wird   op-A-V          V erhält Übertrag
GTM% | GT.B    A wird   op
STM% | ST.B   op wird   A               op steht für (%) | B

AD.$ | SD.$ | LD.$   K wird K+$  |K-$  |$-K
AV.S | SV.S | LV.S   K wird K+S+V|K-S-V|S-K-V  V erhält übertrag

GT.$ | ST.$          K erhält $  |  $ erhält K
RS.% | SS.%          S erhält %  |  % erhält S

ZO.$          $ wird 0
SL.K          B erhält A ,  A wird 0
SL.$          $ LowByte erhält A ,  $ HighByte wird 0
GL.$ | GH.$   A erhält LowByte|HighByte von $

EX.$ | ES.%   Austausch von   K<>$ | S<>%

NE.V | NE.U | NE.& | NE.K     V|U|&|K   wird logisch negiert
ZO.V | ZO.U | ZO.& | ZO.K     V|U|&|K   wird 0
SE.V | SE.U                   V|U       wird 1

IV.A | DV.A           A wird  A+V | A-V        V erhält Übertrag

IC.A | IC.K | IC.S    Operand wird Operand+1
DC.A | DC.K | DC.S    Operand wird Operand-1

PV.&     & wird 8-fache Kopie von V ,  V wird 0
TZ.&     wenn nicht ( &=0 )   dann   ( V wird 1 )

RD.&     & wird abwärts  durch V rotiert
          Resultat V7654321    V erhält Bit0
RU.&     & wird aufwärts durch V rotiert
          Resultat 6543210V    V erhält Bit7

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

TAs  mit s= 1..7      A wird s Bitstellen aufwärts verdreht
                      Resultat von TA3 ist 43210765
TKs  mit s= 1..f      K wird s Bitstellen aufwärts verdreht

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

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

IKL nn  |  DKL nn     K wird  K+nn+1|K-nn-1
I%L nn  |  D%L nn     % wird  %+nn+1|%-nn-1

GTA nn      B erhält nn     A wird 0
GTR nn      K wird     P+nn+3
ADR nn      K wird   K+P+nn+3

NO1 | NO2   no operation    1|2  Zyklen
NON nn      no operation    2+nn Zyklen   falls nn > 0
NON 00      K erhält R      2    Zyklen

GT.Q        K erhält Q
S.RP        R erhält P+1

O.RP nn     R erhält P+2   P wird P+nn+3
B.CN nn   wenn S >0 dann ( P wird P-nn-1 , S wird S-1 )

Bedingung cc sei
WY: always | VZ: V =0 | VS: V >0 | ebenso UZ|US|AZ|AS|KZ|KS

O.cc nn   wenn cc   dann ( P wird P+nn+3 )
B.cc nn   wenn cc   dann ( P wird P-nn-1 )

R.cc      wenn cc   dann ( P wird R )
R.CN      wenn S >0 dann ( P wird R , S wird S-1 )
R.I%      wenn S >0 dann ( P wird R , S wird S-1 , % wird %+1 )
R.D%      wenn S >0 dann ( P wird R , S wird S-1 , % wird %-1 )

Bei O|B|R.VZ und O|B|R.VS   wird stets  V = 0

Alle O,B -Operationen dauern 3 Zyklen | 2 Zyklen   wenn der
             Sprung ausgeführt wird | nicht ausgeführt wird

J..     P und R erhalten K ,  Q und K erhalten P+1

SW.%    nach dem folgenden FE-Halbzyklus wird statt eines BN
        ein B% ausgegeben. Dies soll extern eine memory-page-
        Umschaltung für % auslösen. Das Resultat muß bereits
        beim folgenden tA zur Verfügung stehen

H..     wenn ein J.. folgt: J.. wird modifiziert, indem nach
           dem FE des J..-Codes statt eines BN ein BP ausge-
           geben wird.  Siehe SW.% .    Gesamtdauer 2 Zyklen

        sonst:   nach diesem folgenden (FE/BN) wird ein (HA/BN)
           eingefügt.  Anzurechnen sind 2 Zyklen allein für H..

           Ausnahme: Wenn die auf H.. folgende Operation wieder
           ein H.. ist, wird (KA/BN) statt (HA/BN) ausgeführt,
           und die CPU bleibt im Zustand BN bis Reset erfolgt.