スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

SystemC-AMSのExample(filter)

ここに書いてある一例を書いてみました。
http://www.systemc-ams.org/documents/SystemC_AMS_Tutorial_DATE_2010.rar

周りのテストベンチ?含めたソースコードがこちらになります。
○サンプルコード
 1|#include "systemc-ams.h"
 2|
 3|// Signal Sin Waves
 4|SCA_TDF_MODULE(sine) {
 5|  sca_tdf::sca_out<double> out; // output port
 6|
 7|  void processing() { // our workhorse method
 8|    out.write( sin( sc_time_stamp().to_seconds()*(1.0e4*2.*M_PI))) ;
 9|  }
10|
11|  SCA_CTOR(sine) {} // constructor does nothing here
12|};
13|
14|// TDF Module LTF
15|SCA_TDF_MODULE(prefi_ac) // TDF primitive module definition
16|{
17|  sca_tdf::sca_in<double> in;
18|  sca_tdf::sca_out<double> out;
19|
20|  //control / DE signal from SystemC
21|  //(connected to sc_signal<bool>)
22|  sca_tdf::sc_in<bool> fc_high;
23|
24|  double fc0, fc1, v_max;
25|
26|  //filter equation objects
27|  sca_tdf::sca_ltf_nd ltf_0, ltf_1;
28|  sca_util::sca_vector<double> a0,a1,b;
29|  sca_util::sca_vector<double> s;
30|
31|  void initialize() {
32|    const double r2pi = M_1_PI * 0.5;
33|    b(0) = 1.0; a1(0)=a0(0)= 1.0;
34|    a0(1)= r2pi/fc0; a1(1) = r2pi/fc1;
35|  }
36|
37|  void processing()
38|  {
39|    double tmp; //high or low cut-off freq.
40|    if(fc_high) tmp = ltf_1(b,a1,s,in);
41|    else        tmp = ltf_0(b,a0,s,in);
42|
43|    //output value limitation
44|    if      (tmp > v_max) tmp = v_max;
45|    else if (tmp < -v_max) tmp = -v_max;
46|
47|    out.write(tmp);
48|  }
49|
50|  SCA_CTOR(prefi_ac)
51|  { //default parameter values
52|    fc0 = 1.0e3; fc1=1.0e5; v_max=1.0;
53|  }
54|
55|};
56|
57|// sc_main
58|int sc_main(int argc, char* argv[]) {
59|  sca_tdf::sca_signal<double> sig_sine;
60|  sca_tdf::sca_signal<double> sig_out;
61|  sc_core::sc_signal<bool>    sig_fcctrl;
62|
63|  // Make sin waves
64|  sine sine("sine"); sine.out(sig_sine);
65|
66|  // Prefi_ac
67|  prefi_ac tprefi_ac("tprefi_ac");
68|  tprefi_ac.in(sig_sine);
69|  tprefi_ac.out(sig_out);
70|  tprefi_ac.fc_high(sig_fcctrl);
71|
72|  // Set TimeStep
73|  sine.set_timestep(      100.0,SC_NS);
74|  tprefi_ac.set_timestep( 100.0,SC_NS);
75|
76|  // tracing ...
77|  sca_util::sca_trace_file *tfp =
78|    sca_util::sca_create_vcd_trace_file("ams_waves");
79|
80|  sca_util::sca_trace(tfp, sig_sine,   "sig_sine");
81|  sca_util::sca_trace(tfp, sig_out,    "sig_out");
82|  sca_util::sca_trace(tfp, sig_fcctrl, "sig_fcctrl");
83|
84|  // Start fc_high = Low
85|  sc_core::sc_start(5sc_core::SC_MS);
86|
87|  // Control fc_high
88|  sig_fcctrl = true;
89|  sc_core::sc_start(5sc_core::SC_MS);
90|
91|  sca_util::sca_close_vcd_trace_file(tfp);
92|  return 0;
93|}

○実行結果
20120717_systecams_filter.png

フィルタとして、fc0=1kHz/fc1=100kHzとしているので、
5ms付近にて、in=10kHzが通る領域が異なるのがわかると思います。

というような、SystemC-AMSの記述でした。
関連記事

コメントの投稿

非公開コメント

プロフィール

Kocha

Author:Kocha
なんでもチャレンジ!(^o^)/
E-mail
github:Kocha
イベントカレンダー

カレンダー
09 | 2017/10 | 11
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -
カテゴリ
OVP (4)
最新記事
最新コメント
アーカイブ
リンク
Twitter
アクセス人数
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。