昨日の1bit CPU BPU(Bit Processor Unit) ですが
ふつーのVerilogで書くとこんなカンジです。
もっとも、BPUのROM内容次第で変わるんで、サンプルコードを移植するとこんなカンジと言う事で。
Verilogの方が、ずっと読みやすく、FPGA実装すると、BPUのROM分割化のメリットはあまり出ませんね。
ROM分割のメリットは、core部が切り離せるのでインクリメンタル開発が楽。
動作を動的に変更したい時、ROMデータをEEPROMに書いといて、都度読み替える構成が考えられる。くらいでしょうか?
//BPU(Bit Processor Unit) // form 復刻版 ディジタル回路設計ノウハウ【オンデマンド版】CQ出版 // https://shop.cqpub.co.jp/hanbai/books/52/52181.html //write VerilogHDL 2023-10-28sa //普通Verilogだったらどう書くかのサンプル `default_nettype none module BPU_VERILOG ( input wire CLK_H_i ,input wire INIT_L_i ,input wire [31:0] GPIs_i ,output wire[31:0] GPOs_o ) ; reg[31:0]GPOs ; reg[ 7:0]MAs ; always@(posedge CLK_H_i or negedge INIT_L_i) if( ~ INIT_L_i ) begin MAs <= 0 ; GPOs <= 0 ; end else begin MAs <= MAs+1 ; case( MAs ) 7'h00: DATs = GPOs[ 0] <= 1'b1 ; 7'h01: DATs = GPOs[ 1] <= 1'b1 ; 7'h02: DATs = GPOs[ 2] <= 1'b1 ; 7'h03: DATs = GPOs[ 3] <= 1'b1 ; 7'h04: DATs = GPOs[ 4] <= 1'b1 ; 7'h05: DATs = GPOs[ 5] <= 1'b1 ; 7'h06: DATs = GPOs[ 6] <= 1'b1 ; 7'h07: DATs = GPOs[ 7] <= 1'b1 ; 7'h08: DATs = GPOs[ 8] <= 1'b1 ; 7'h09: DATs = GPOs[ 9] <= 1'b1 ; 7'h0A: DATs = GPOs[10] <= 1'b1 ; 7'h0B: DATs = GPOs[11] <= 1'b1 ; 7'h0C: DATs = GPOs[12] <= 1'b1 ; 7'h0D: DATs = GPOs[13] <= 1'b1 ; 7'h0E: DATs = GPOs[14] <= 1'b1 ; 7'h0F: DATs = GPOs[15] <= 1'b1 ; 7'h10: DATs = GPOs[ 0] <= 1'b0 ; 7'h11: DATs = GPOs[ 1] <= 1'b0 ; 7'h12: DATs = GPOs[ 2] <= 1'b0 ; 7'h13: DATs = GPOs[ 3] <= 1'b0 ; 7'h14: DATs = GPOs[ 4] <= 1'b0 ; 7'h15: DATs = GPOs[ 5] <= 1'b0 ; 7'h16: DATs = GPOs[ 6] <= 1'b0 ; 7'h17: DATs = GPOs[ 7] <= 1'b0 ; 7'h18: DATs = GPOs[ 8] <= 1'b0 ; 7'h19: DATs = GPOs[ 9] <= 1'b0 ; 7'h1A: DATs = GPOs[10] <= 1'b0 ; 7'h1B: DATs = GPOs[11] <= 1'b0 ; 7'h1C: DATs = GPOs[12] <= 1'b0 ; 7'h1D: DATs = GPOs[13] <= 1'b0 ; 7'h1E: DATs = GPOs[14] <= 1'b0 ; 7'h1F: DATs = GPOs[15] <= 1'b0 ; 7'h20: if(GPI[0]==1'b1) MAs<=7'h22 ; 7'h21: MAs <= 7'h20 ; 7'h22: MAs <= 7'h00 ; endcase end assign GPOs_o = GPOs ; endmodule