2012年8月10日金曜日

FPGA FMトランスミッタ: CICフィルタ

4,864kHzから77.824MHzへサンプルレート変換を行うためCICフィルタを使います。細かいことはわかりませんが、お手軽にCoreGenを使ってみます。

CoreGenの設定
CoreGen画面の中で特性を確認できます。通過域はコンポジット信号、阻止域はサンプルレート4,864kHzへのコンポジット信号の折り返しです。
サンプルレートの変換比16、CIC4段にしてあります。(3段にしたらうまく動かず・・・)

通過域(0~55kHz): 0 ~ 0.001414 [πrad/sample]
阻止域(4,809~4,919kHz): 0.1236 ~ 0.1264 [πrad/sample]

この周波数特性を見ると、阻止域のリップルが0.0066dBになっています。

CICフィルタの周波数特性

CIC Compilerの設定1

CIC Compilerの設定2

CIC Compilerの設定3

CIC Compiler IP Symbol

特性の測定
FIRフィルタと同様に152ksps 10kHzを信号源としてスペクトルを確認します。図で緑色がフィルタなし、黄色がフィルタありです。5MHz付近に向かってフィルタの効果が出ていることがわかります。

CICフィルタ出力(DC-5MHz)

CICフィルタ出力(DC-20MHz)

続いて、32倍オーバサンプリングFIRフィルタとCICフィルタをカスケード接続してみます。図で緑色がFIRフィルタのみ、黄色がFIRフィルタとCICフィルタの組み合わせです。ベースバンドをのぞきサンプルレート77.824MHzの半分の周波数までの信号が除去されていることがわかります。

FIR + CICフィルタ出力(DC-5MHz)

FIR + CICフィルタ出力(DC-20MHz)

FIR + CICフィルタ出力(15-50MHz)

cic16x.v

module cic16x(
  cic16x_i, cic16x_o, clk, reset, cic16x_thru
  );

  input [23:0] cic16x_i;
  output [23:0] cic16x_o;
  input clk;
  input reset;
  input cic16x_thru;

  wire [19:0] din;
  wire [31:0] dout;
  
  assign din = cic16x_i[23:4];
  assign cic16x_o = cic16x_thru ? cic16x_i : dout[31:8];

  // CIC Filter
  cicip cicip (
    .din(din),  // input [19:0] din
    .clk(clk),
    .dout(dout)  // output [31:0] dout
//    .rdy(rdy),  // output rdy
//    .rfd(rfd));  // output rfd
    );

endmodule



0 件のコメント:

コメントを投稿