福野泰介の一日一創 - create every day

憧れのCPUづくりが超簡単!あの4bitコンピューターTD4マシン語プログラム on FPGA MAX10

2018/09/17
#FPGA #Verilog 

新たに手に入れた武器、FPGAのMAX10でフラッシュへの書き込み方法がわかったので、半導体レベルからのものづくりができるようになりました。

こちら有名な4bitコンピューターTD4をちょっといじって、マシン語プログラムをROMとして書き込み、ナイトライダー風に動かしたデモ。
CPUの創りかた TD4 を Spartan-3A で - 言語ゲーム


フラッシュへの書き込み方法は、Programmerで、一旦 Delete として、output_filesからpofファイルを選択し、CFM0かUFMのProgram/Configureをチェックして、Startするだけ! ちょっと長い書き込み時間を待てば、あとはパソコンから切り離し、電源投入だけでオリジナルの半導体として使えます!起動時間も十分高速。


TD4は、2006/4/3に購入した2003年発刊の名著「CPUの創りかた」で創られた4bit CPU。

こちらの「CPUの創りかた TD4 を Spartan-3A で - 言語ゲーム」のVerilogでかかれた、td4.v のROMとして書かれたマシン語プログラム部分を変更したものでした。

ROM[0] = 8'b1011_0001; // OUT 0001 ROM[1] = 8'b1011_0010; // OUT 0010 ROM[2] = 8'b1011_0100; // OUT 0100 ROM[3] = 8'b1011_1000; // OUT 1000 ROM[4] = 8'b1011_0100; // OUT 0100 ROM[5] = 8'b1011_0010; // OUT 0010 ROM[6] = 8'b1011_0001; // OUT 0001 ROM[7] = 8'b1111_0000; // JMP 0000

INとRESETは、タクトスイッチが接続されている 120, 124, 127, 130, 131番ピンへ、
OUTは、LEDが接続されている 132, 134, 135, 140, 141番ピンへそれぞれ Pin Designer で設定。

MAX10の内蔵クロック50MHzを100万倍ほど遅くして、I/Oに接続(assign)すれば、できあがり!

`define LEN_CLOCK 50000000 / 10 module top_td4( input CLOCK, input RESET, input [3:0] IN, output [4:0] OUT ); reg [26:0] counter; reg td4_CLOCK; reg [4:0] td4_OUT; initial begin td4_CLOCK <= 0; td4_OUT <= 5'b00000; end always @(posedge CLOCK) begin if (RESET | counter == `LEN_CLOCK - 1) begin counter <= 0; td4_CLOCK <= ~td4_CLOCK; end else counter <= counter + 1'b1; end assign OUT = { td4_CLOCK, ~td4_OUT[3:0] }; td4 td4_0(td4_CLOCK, RESET, IN, td4_OUT[3:0]); endmodule

夢のオレオレCPUづくり、超簡単ですね!


これを手作りでやるとこのような配線か、多量の配線を回路CADでレイアウトするかが必要だったわけです。FPGA、エライ!

links
- FPGAはじめのいっぽ、MAX10 FPGA 評価キットでエルチカ成功!

Tweet
クリエイティブ・コモンズ・ライセンス
この作品は「Creative Commons — CC BY 4.0」の下に提供されています。
CC BY 福野泰介 - Taisuke Fukuno / @taisukef / アイコン画像 / プロフィール画像