こちら有名な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、エライ!