- 締切済み
verilogである信号の数クロック遅れの信号を生成させる記述方法をお
verilogである信号の数クロック遅れの信号を生成させる記述方法をお伺いします。 動作記述でOKです。 通常、「sig_a」 から2クロック遅れの「sig_b」を生成させるのなら: > sig_a - 2clockおくれ -> sig_b ----------------------------------- reg [2:0] regs; assign sig_b = regs[2]; asisgn regs[0] = sig_a; always @(posedge CLK) regs[2:0] <= {regs[1:0], sig_a}; ----------------------------------- のように、パイプラインに信号を通すことで実現できるですが、 何クロック遅れるかを可変(動的に設定する)としたいのです。 動作モデル的な記述で簡単にかけないのでしょうか? ------------------------------------ [NGの例]: これだとNcycle_delayがSIM途中で更新されたとき、反映できない。。。 initial begin sig_b <= #D 1'b0; while(1) begin repeat(Ncycyle_delay) @(posedge CLK); while(1) begin sig_b <= sig_a; repeat(1) @(posedge CLK); end end end ------------------------------------ 宜しくお願い致します。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- P0O9I
- ベストアンサー率32% (693/2146)
最大シフト数までのシフト回路をつくり、それをマルチプレクサで切り替える、という方法はどうでしょう。
お礼
ありがとうございます。いや、もっと汎用的な方法がを望んでいました。 ちょっと考えてみましたが、sig_aとそれを遅らせるsig_b、同じモジュールで生成するのなら容易ですね。 逆に別のモジュールで遅らせるのは難しい。。。 ということで、「根元で遅らせる」というのがおそらく正解なのかな?という気がしています。 +根元で遅らせる例 initial begin fork begin while(1) begin sig_a <= 0; repeat(N) @(posedge CLK); sig_a <= 1; repeat(N) @(posedge CLK); end end begin while(1) begin repeat(M) @(posedge CLK); <-- M遅れ sig_b <= 0; repeat(N) @(posedge CLK); sig_b <= 1; repeat(N-M) @(posedge CLK); end join_none end