まぁどうでもいいはなしだが、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 に移植しようかな。