散歩師・漫画居士のくだらなクラブ日記

ども、散歩師・漫画居士っす。散歩したり実働模型作ったりが趣味なんで、その時に思いついたこととか書くッス

1bit CPU BPU ふつーのVerilogで書くと

昨日の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