新千葉 ガーベージ・コレクション

FPGA マガジンやインターフェースで書けなかったこと等をちょぼちょぼ書いてます。@ryos36

再び verilisp

まぁどうでもいいはなしだが、Lisp でつくってるとうれしくなってマクロいっぱい作っちゃうわけですが、(もうちょい生成されるコストを考えた方がいい気がするぞ>自分)、、、、VHDL とか書いていると、またこれか、またこれか、的な似たような記述が繰り返し出てきます。やになりますね。

そこで、verilisp。もう、開発は止まっているみたいですが。

(defun symbol-to-string-to-symbol_or (sym postfix_str)
    (intern (concatenate 'string (string sym) postfix_str)))

(defmacro make-always (rst clk me init_value)
  (let ((counter (symbol-to-string-to-symbol me "_counter"))
        (kick_me (symbol-to-string-to-symbol me "_kick_me"))
        (me_state (symbol-to-string-to-symbol me "_state")))
    `(progn
        (v_always ((posedge ,rst) (posedge ,clk))
          (v_if (v_== ,rst 1)
                (v_= ,counter 0)
                (v_if (v_== ,kick_me 1)
                      (v_= ,counter ,init_value)
                      (v_if (v_== ,me_state 1)
                            (v_= ,counter (v_- ,counter 1))))))
        (v_= ,kick_me 1)
        )))

知らない人から見るとうわーって感じかも。
でもほら本文は次のように簡素になる(めちゃくちゃなので動かないけど)

(module timing_generator
        ((input rst)
         (input vclk)

         (output data_enable_out)
         (output t0out)
         (output t1out))

        (display rst)

        (make-always rst vclk hfp (- 38 1))
        (make-always rst vclk dat (- 1000 1))
        )

山ほど作らなくてよいでしょ。これなら楽(かも)。っていうか verilog はやだな(個人の趣味)。

module timing_generator(rst, vclk, data_enable_out, t0out, t1out);
    input rst;
    input vclk;
    output data_enable_out;
    output t0out;
    output t1out;
    $display(rst);
    always
        @(posedge rst or posedge vclk)
    begin
        if ((rst == 1))
        begin
            hfp_counter = 0;
        end
        else
        begin
            if ((hfp_kick_me == 1))
            begin
                hfp_counter = (38 - 1);
            end
            else
            begin
                if ((hfp_state == 1))
                begin
                    hfp_counter = (hfp_counter - 1);
                end
                else
                begin
                end
            end
        end
    end
    hfp_kick_me = 1;
    always
        @(posedge rst or posedge vclk)
    begin
        if ((rst == 1))
        begin
            dat_counter = 0;
        end
        else
        begin
            if ((dat_kick_me == 1))
            begin
                dat_counter = (1000 - 1);
            end
            else
            begin
                if ((dat_state == 1))
                begin
                    dat_counter = (dat_counter - 1);
                end
                else
                begin
                end
            end
        end
    end
    dat_kick_me = 1;
endmodule

verilisp を chicken に移植しようかな。