TangNanoDCJ11MEM
Memory system and UART implemented on Tang Nano 20K for DEC DCJ11 PDP-11 Processor
Install / Use
/learn @ryomuk/TangNanoDCJ11MEMREADME
TangNanoDCJ11MEM
Memory system and UART implemented on Tang Nano 20K for DEC DCJ11 PDP-11 Processor
This document is written mostly in Japanese. If necessary, please use a translation service such as DeepL (I recommend this) or Google.
- 本プロジェクトはTang Console 138Kを用いた続編TangConsoleDCJ11MEMがあります.
- このREADMEおよびhdl.oldフォルダ配下のREADMEに書かれている不安定である旨の記述は2024年に作成したrev1.1基板のものです.rev.2.2になってかなり安定しましたが,記録として残しておきます.
概要
- PDP-11の命令セットを持つCPU「DEC DCJ11」のメモリシステムとUARTをFPGA(TangNano20K)上に実装する試みです.信号のインターフェース部分にtangNano-5Vを使用しています.(rev.3.1基板では不要)
- FPGAに実装するのはメモリやUARTなどの周辺回路部分だけで,CPU自体は本物を使用します.ソフトウェアやFPGAによるシミュレータやエミュレータではなく,本物のCPUを動かします.
- "TangNanoDCJ11"だとTangNano上にDCJ11を実装したみたいな名前になってしまうので,"MEM"を付けて"TangNanoDCJ11MEM"という名前になっています.
- まずベアメタルで動かしたところ安定して動きました.
- 次に,PC-11(Paper-Tape Reader/Punch)エミュレータでPaper-Tape BASICをロードして実行することができました.
- さらに,UNIX first edition (UNIX V1)を動かすために,ディスク(RF11, RK11)や外部演算装置(KE11)のエミュレータを実装したところ,それなりに動くようになりました.
最近の話題
- 2025/09/03: 本プロジェクトの続編TangConsoleDCJ11MEMを公開
- 2025/09/05: rev2.2基板公開
- 2025/09/22: レベル変換ICを搭載した基板rev3.1を公開
- 2025/09/29: RT-11 v4用のHDLを公開
- 最新版は下記の通り
- レベル変換外付け版(rev2.2).(別途TangNano5Vが必要です.)
- レベル変換搭載版(rev3.1)
- 上記のどちらもHDLコードは共通です.
- UNIX用のHDLコード(unix-v1, unix-v6 共通)
- tapebasic用のHDLコード
- RT11v4用のHDLコード
主なファイル一覧
.
├── diskimage : SDメモリ用データ
│ ├── Caldera-license.pdf : UNIXのライセンス条項
│ ├── sd-unix-v1.dsk : unix v1用disk image
│ └── sd-unix-v6.dsk : unix v6用disk image
├── hdl : rev2.2, rev3.1基板用HDLコード
│ ├── rt11v4
│ ├── tapebasic
│ └── unix
├── hdl.old : rev1.1基板用HDLコード
│ ├── baremetal
│ ├── tapebasic
│ ├── unix-v1
│ └── unix-v6
├── pcb
│ ├── rev1.1 : rev1.1基板
│ ├── rev2.2 : rev2.2基板
│ └── rev3.1 : rev3.1基板
└── README.md : このファイル
- diskimageフォルダ内にあるSDメモリ用のイメージファイルはUNIXのオリジナルソースからの派生物なので,ライセンス条件は Caldera-license.pdf (昔のBSD?)に従います.
- その他の部分についてはMITライセンスです.
Gowin FPGA Designerの設定について
- implフォルダをgitから除外したら設定ファイルも除外されてしまったのでコンパイル時にエラーが出るかもしれません.Configuration->Dual-Purpose Pin で"Use SSPI as regular IO"をチェックし下さい.

基板のバージョンについて
- TangConsole138Kを用いたプロジェクトを開始した際に,CLK2に同期させるとかなり安定するという知見が得られたので,アップデートするついでに各種パッチを反映させた基板(rev2.2)を作成しました.
- ついでに,レベル変換を搭載した基板(rev3.1)も作成しました.
- それぞれの基板は下記のような関係にあります.
rev1.1
↓ unix v1, v6用パターンカット,ジャンパ, HALTのダイオード追加, CLK2同期化
rev2.2
↓ レベル変換(TangNano5V相当)を基板上に搭載(CPUの入力信号(FPGA→CPU)については省略)
rev3.1
- rev1.1基板に「unix-v1, v6用のパターンカット,ジャンパ線」,「CLK2とGPIO_RXを33Ωで接続」,「HALTのダイオード」を追加することでrev2.2基板と同じ回路になり,rev2.2基板用のHDLコードで動作します.
- rev3.1基板はrev2.2基板にレベル変換を搭載しただけなので同じHDLコードが動きます.
- rev1.1基板用のHDLコードはrev2.2, rev3.1基板では動きません.
ハードウェア
FPGAに実装した機能
- Initialization Sequence時のPower-Up Configuration Register設定
- メモリ 32K×16bit
- UART.TangNanoのUSB経由およびGPIO経由の2系統.シリアルの設定は基本的には115200bps,8N1Nにしています.(UNIX V6だと7N1Nにしないと文字化けする現象あり.)
- BS0, BS1は見ていません.TangNano20Kではピンが足りなかったのと,DAL[15:0]とAIO[3:0]を見ればとりあえず十分だったので.
- DAL[21:16]も見ていません.
- PC-11(Paper-Tape Reader/Punch)エミュレータを実装しました.(Paper tape BASICを実行する用で,UNIXでは動きません.)
- ディスクドライブ(RF11, RK11),外部演算装置(KE11-A),クロック(KW11-L)等,UNIX V1の動作に必要な装置のエミュレータを実装しました.
rev3.1基板 (PCB rev3.1)
- レベル変換ICを基板上に実装しました.これによりTang Nano 20KをTangNano5Vを使わずに直接搭載できます.
- ピンアサインはrev2.2基板と同じなので,FPGA用のコードはrev2.2用のものを使用します.
- WS2812のアレイを接続するための端子を用意しました.
- レベル変換ICのOE_nをdisableにしてCPUとTangNanoを切り離すためのジャンパ端子を用意しました.(初めて搭載するときなど,FPGAに別の回路が書かれているようなとき用.)

BOM (PCB rev3.1)
|Reference |Qty| Value |Size |Memo | |-------------------|---|----------------|-----|-----| |C1,C2|2|68pF||| |C3,C4, C5, C6|4|0.1uF||| |C7,C8|2|0.33uF||| |C9 |1|47uF||| |D1 |1|1N4148||| |J1 |1|IC socket |40pin DIP 800mil|TangNano20K用.幅800milなので1x20のpin socketを2列実装.| |J2,J3|2 |pin header or socket|1x30|任意.テストや観測,実験用.| |J4 |1 |pin header |1x02|任意.OE_nをdisableにする用| |J5 |1 |pin socket |1x04 L字|WS2812アレイ用| |J6 |1 |pin header |1x06 L字|UART用| |LED1 |1|||| |R1 |1|1M||| |R2 |1|33||| |R3,R4,R5,R6,R7,R8,R9,R10,R11,R12,R13,R14,R15|13|10k| |R16|1|100k || 値はLEDに合わせて任意.| |SW1,SW2 |2 |tactile SW |6mmxH4.3mm|例: https://akizukidenshi.com/catalog/g/g103647/ | |U1 |1 |DCJ11 |60pin DIP 1300mil| 1x30 の丸ピンソケット2列| |U2,U3,U4,U5 |4 |SN74CB3T3245DWR(又は DW) | SOIC-20| パッケージサイズに注意|
|Y1 |1 |18MHz |HC49|例: https://mou.sr/3WcWExh , 周波数を変えられるようにソケットの使用をお勧めします.|
- SN74CB3T3245はパッケージサイズに注意.SOIC-20はDWかDWRです.PWやPWRではありません.
- R2は"33k"ではなく"33"です.ダンピング抵抗なので.
- R12,最近のLEDは明るいので100kぐらいでちょうど良かったりします.使うLEDに応じて適切な値を選んで下さい.
rev2.2基板 (PCB rev2.2)
- rev1.1基板でunixを動かすために必要だったパターンカットとジャンパ配線を反映させました.
- CLK2をGPIO_RXだったピンに入力して,回路をCPUのクロックと同期させました.
- 上記に伴い,基板のUART端子はデバッグログ用のTXだけになりました.
- 電源供給をTangNanoからだけにしてDCジャックを廃止しました.
- HALTスイッチのところの抵抗をダイオードに変更しました.
- unix(v1, v6)を動作させるためのプロジェクトはhdl/unixを使用して下さい.
- SDメモリ用のイメージファイルは./diskimageにあるものがそのまま使えます.

BOM (PCB rev2.2)
|Reference |Qty| Value |Size |Memo | |-------------------|---|----------------|-----|-----| |C1, C2|2|68pF||| |C3, C4|2|0.33uF||| |C5 |1|47uF||| |D1 |1|1N4148||| |J1 |1|IC socket |40pin DIP 600mil|TangNano5V用.1x20のpin socket 2列でも可.| |J2,J3 |2|pin header or socket|1x20|任意.テストや観測,実験用.| |J4,J5 |2 |pin header or socket|1x30|任意.テストや観測,実験用.| |J6 |1 |pin header |1x06 L字|UART用| |LED1 |1|||| |R1 |1|1M||| |R2 |1|33||| |R3,R4,R5,R6,R7,R8,R9,R10,R11,R12,R13,R14|12|10k| |R15|1|100k || 値はLEDに合わせて任意.| |SW1,SW2 |2 |tactile SW |6mmxH4.3mm|例: https://akizukidenshi.com/catalog/g/g103647/ | |U1 |1 |DCJ11 |60pin DIP 1300mil| 1x30 の丸ピンソケット2列| |Y1 |1 |18MHz |HC49|例: https://mou.sr/3WcWExh , 周波数を変えられるようにソケットの使用をお勧めします.|
rev1.1基板 (PCB rev1.1)
- rev1.0はいくつか修正箇所があったので修正しました.
- CPUが白いので基板も白くしてみました.
- CPUおよびTangNanoの電源をどこから供給するかを2箇所のジャンパで切り替えられるようにしました.詳細は回路図と基板上のシルクを見て下さい.
- プルダウン抵抗(R2〜R6)を100kから10kに変更しました.(rev1.1a)
- UNIXを動かすにはJP1のパターンのカット,数本のジャンパ配線が必要です.詳細はUNIX V1参照.

BOM (PCB rev1.1)
|Reference |Qty| Value |Size |Memo | |-------------------|---|----------------|-----|-----| |C1,C2 |2 |0.33uF ||DECのプロセッサボードで0.33uFを使っていたので.0.1uFでもいいかもしれない.| |C3 |1 |47uF ||| |C4,C5 |2 |68pF ||| |D1 |1 |LED || | |J1 |1 |DC Jack ||例: https://akizukidenshi.com/catalog/g/g106568/ | |J2 |1 |pin header |1x02|DC Jackからの5VをTangNanoに供給するとき用.(そのときはTangNanoのUSBは外すこと).| |J3 |1 |pin header |1x03|CPUへの5VをDC JackからにするかUSB(TangNano)からにするかの選択用.| |J4 |1 |IC socket |40pin DIP 600mil|TangNano5V用.1x20のpin socket 2列でも可.| |J5,J6 |2 |pin header or socket|1x20|任意.テストや観測,実験用.| |J7 |1 |pin header |1x06 L字|UART用| |J8,J9 |2 |pin header or socket|1x30|任意.テストや観測,実験用.| |JP1 | | ||任意.sctl_nとcont_nを切断したときにpin headerを立てる用.実装する場合は先にパターンをカットして下さい.(unix-v1では切断して使います)| |R1 |1 |100k || 値はLEDに合わせて任意.| |R2~R6 |5 |10k || プルダウン用.入力電流がmax10μAなので大きめでいいかと思ったら意外にノイズが大きいので100kから10kに変更しました.| |R7~R16 |10 |100k || プルアップ用.10k〜100kぐらいで任意.| |R17 |1 |1M ||| |SW1 |1 |toggle SW ||例: https://akizukidenshi.com/catalog/g/g100300/ | |SW2,SW3 |2 |tactile SW |6mmxH4.3mm|例: https://akizukidenshi.com/catalog/g/g103647/ | |U1 |1 |DCJ11 |60pin DIP 1300mil| 1x30 の丸ピンソケット2列| |Y1 |1 |18MHz |HC49|例: https://mou.sr/3WcWExh , 低速(2MHzで確認済み,もっと遅くても動きそう)でも動きます.周波数を変えられるようにソケットの使用をお勧めします.|
応用例(hdl.old/)
ベアメタル(hdl.old/baremetal)
- クロス環境で作成したプログラムを実行します.
- HDLは小規模なので,いろいろ試すベースラインに最適です.
tape basic(hdl.old/tapebasic)
- 二次記憶をエミュレートするために手始めに作った習作です.
- PC11(tape reader/pucnch)エミュレータで,tape BASICを読み込んで起動します.
- SDメモリを使う練習用に作ったものなのでとりあえず動きます程度のものです.
- PDP11GUIに,console ODT経由でpaper tape softwareをロードする機能があるようなので,いろいろなpaper tape softwareを試すという目的であればベアメタルでPDP11GUIを使うことをお勧めします.
UNIX V1(hdl.old/unix-v1)
- SDメモリを使ったdiskエミュレータを作成し,UNIX V1を動かしてみました.
- 最初はかなり不安定でしたが,だいぶ安定して動くようになってきました.
UNIX V6(hdl.old/unix-v6)(実験用)
- unix-v1用をベースにUNIX V6に必要な機能を逐次追加中です.修正のたびにV1の動作確認をするのは面倒なのでV1用と分けることにしました.
動画
旧版
ブレッドボード版
- console ODT(Octal Debug Technique)の動作確認をするところから始めて,豊四季タイニーBASICを軽微な修正で動かせるところまで確認しました.
- クロックは18MHzで動きました.遅い方は2MHzでも動きました.

PCB版 rev1.0
最初に作った基板です.とりあえず動きました.

関連情報
データシート等
bitsavers
- DCJ11 Microprocessor User's Guide, DEC, EK-DCJ11-UG-PRE(Preliminary)
- Index of /pdf/dec/pdp11/j11
- Index of /pdf/dec/pdp11/1173
先行事例,先駆者たち
- PDP-11/HACK, Brent Hilpert
- My PDP-11 Projects, Peter Schranz
- [PDP11 on a
