SSブログ

部品(クロック載せ替え) [HDL]

信号のクロック載せ替えを行うモジュールです。
こういうモジュールでは非同期リセットを使ってます。

i_clkに同期したi_sigを、o_clkに同期したo_sigにつなぎます。sigwパラメーターは信号の本数です。i→oへ載せ替えた信号(fwd)を、o→iへ載せ替え返して戻します(ret)。相手が信号を受け取ったことを確認するためです。ハンドシェイクを行っているので、双方のクロックの周波数がどんな関係でも使えます。
fwd、retの[1]は必ずメタステーブル状態になるので使えません。[2]以降も可能性はありますが確率は下がるのでこれを使います。できれば[1]~[2]以降の距離(遅延時間)に制約をかけます。
modeでそのまま、立ち上がり、立ち下がりを切り替えてます。

`timescale 1ns / 1ps
`default_nettype none

module  signal_transit
#(
  parameter  sigw  = 1,  // signal width
  parameter  mode  = ""  // mode, "","UP","DOWN"
)
(
  // common
  input   wire             a_rst,  // Async Reset
  // input
  input   wire             i_clk,  // clock
  input   wire [sigw-1:0]  i_sig,  // signal
  // output
  input   wire             o_clk,  // clock
  output  reg  [sigw-1:0]  o_sig   // signal
);
  generate
    genvar i;
    for (i = 0; i < sigw; i = i+1) begin  : sigwL
      reg    [3:1]  fwd;    // [1] may have meta-state
      reg    [2:1]  ret;    // [1] may have meta-state
      reg           i_trg;  

      always @(posedge a_rst or posedge i_clk) begin
        if (a_rst) begin
          i_trg  <= 'b0;
          ret    <= 'b0;
        end
        else begin
          if      (i_sig[i] )  i_trg  <= 1'b1;
          else if (ret[2])     i_trg  <= 1'b0;

          ret    <= {ret[  1], fwd[2]};  // return
        end
      end

      always @(posedge a_rst or posedge o_clk) begin
        if (a_rst) begin
          fwd       <= 'b0;
          o_sig[i]  <= 'b0;
        end
        else begin
          fwd    <= {fwd[2:1], i_trg };  // forward

          if      (mode == "UP")    o_sig[i]  <= (fwd[3:2] == 2'b01);  // Up-Edge
          else if (mode == "DOWN")  o_sig[i]  <= (fwd[3:2] == 2'b10);  // Down-Edge
          else                      o_sig[i]  <= fwd[2];               // Normal
        end
      end
    end
  endgenerate

endmodule

`default_nettype wire

複数本数の信号が載せ替えられますが、当然データのやりとりには使えません。それぞれ独立した信号として扱います。

回路図追加。リセットとかエッジの記述は省いてます。仕組みはわかりやすいですが、AND-ORの部分はHDLの方がわかりやすそうです。
signal_transit.png
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

Facebook コメント

トラックバック 0

OpenIndiana 151a導入メモ念のため ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。