ゲーム日記

ゲームの記録

fpga ゲームをはじめました

fpga あそびをはじめた

ちょっとまえに色々あって大学の方から Digilent の BASYS3 を貸してもらえることになったので、vivado と格闘してました。

vga出力してる画像が来るはずだった場所
vga出力
もともとすこし高級言語を触ったことがあったので、その感覚で書いていたんですが、回路&シミュレーション記述言語を書くのにそんな感覚だと当然死にます。 

ステートマシンの実装

verilog HDL 触る人間はプロセッサを作りたくなって始めたか、そうでなければ途中でプロセッサを作りたくなります。プロセッサは要は非同期信号である割り込みに対応できて、クロックに同期してメモリを書き換え続けるステートマシンです。なのでステートマシンの実装から試しに始めてみたのですが、最初は僕はこんな感じに書いていました。

module statemachine(clk, rst);
input clk, rst;

parameter idle = 6'd0;
parameter A = 6'd1;
parameter B = 6'd2;
parameter C = 6'd2;

reg[5:0] state_reg;

initial begin
    state = idle;
end

task automatic idle;
    state <= A;
endtask

task automatic A;
    state <= B;
endtask

task automatic B;
    state <= C;
endtask

task automatic C;
    state <= A;
endtask


always@(posedge clk, negedge rst)begin
    if(rst == 1'b0) state <= idle;
    else begin
        case(state)begin
            idle: idle();
            A: A();
            B: B();
            C: C();
        end
    end
end
endmodule

勿論これはだめなやつです。
ハードに触れたことが全然なかったのでわかりませんでしたが、ハード的には複数の回路からの入力が1つの FF につながっているようなものは実現できないっぽいです。
状態の管理と状態ごとの処理がまとまっていていいと思ったんですけどね、
vivado に multi-driver net on なんちゃら~とかいって怒られました。
これでかなり困ったんですが、
nodamushi.hatenablog.com
この記事にお世話になりました。

inout の扱い

RAM の実装はネット上にたくさん転がっているので困らなかったんですが、
僕はモジュールの接続時にワイヤーを接続しまくるのが嫌いだったので信号をまとめようと思いました。書き/読み enable, 書き/読みアドレス, 書き/読みデータをすべて一つの inout ポートにまとめました。
あるきまった部分を enable の信号として扱って、ハイインピーダンスとか使ってごちゃごちゃしてたら、ここでもvivadoに multi driver net うんちゃら~とか ~~ is connected at least one constant driver, which has been preserved, so others are ignored. みたいなことも言われました。
これはバスのデータ部分をハイインピーダンスに切り替えるかどうかのフラグにそのままバスの線をひっぱてきちゃったから起きたことっぽいですね。当然ではあるんですが、inout と input, output を直接繋がない。大事です。

このゲームおもしろいです

そんな感じでこのゲームやってます。楽しいですよ。みなさんもやりましょう。

注意

僕は日本語も英語も当然 verilog も怪しいのでこのブログの内容は参考にするべきではありません。これはゲーム日記です。
指摘などは是非ください、いただけると泣いて喜びます。でも誹謗中傷がきたら普通に泣きます。