部品(クロック載せ替え) [HDL]
信号のクロック載せ替えを行うモジュールです。
こういうモジュールでは非同期リセットを使ってます。
i_clkに同期したi_sigを、o_clkに同期したo_sigにつなぎます。sigwパラメーターは信号の本数です。i→oへ載せ替えた信号(fwd)を、o→iへ載せ替え返して戻します(ret)。相手が信号を受け取ったことを確認するためです。ハンドシェイクを行っているので、双方のクロックの周波数がどんな関係でも使えます。
fwd、retの[1]は必ずメタステーブル状態になるので使えません。[2]以降も可能性はありますが確率は下がるのでこれを使います。できれば[1]~[2]以降の距離(遅延時間)に制約をかけます。
modeでそのまま、立ち上がり、立ち下がりを切り替えてます。
複数本数の信号が載せ替えられますが、当然データのやりとりには使えません。それぞれ独立した信号として扱います。
回路図追加。リセットとかエッジの記述は省いてます。仕組みはわかりやすいですが、AND-ORの部分は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の方がわかりやすそうです。
2012-04-18 00:29
nice!(0)
コメント(0)
トラックバック(0)
コメント 0