2016-07-01 11 views
0

私は基本的に以下のように動作しなければならないモジュールをSystemCに書いています:それはポートp_inとポートhを通して制御信号を介してバイト列を受け取ります。モジュールはh信号がtrueの場合にだけ、matrixのバイト内にバイトを保存する必要があります。私が持っている問題はhがfalseの場合でも、カウンタijをインクリメントしていきますが、反復がhfalseときに停止したときに継続しなければならないということですSystemCで制御信号を使ってforループ内のカウンタを管理する方法は?

void MY_MODULE::my_method(){ 

    if(!rst){ 
     //put all the output ports to 0 
    } 

    while(1){ 

     //The module waits while the signal h is false 
     while(!h) wait(); 

     //The iterations to fill in the matrix begin 
     //The iterations must work just if h = true 
     for(i=0; i<100; i++){ 
      for(j=0; j<100; j++){ 
       wait(); 
       matrix.nmmatrix[i*matrix.width+j] = p_in;    
      } 
     } 
    } 
} 

SC_THREADの中で私は、私はこれを実装し使用しています再びtrueです。私が間違っていることのヒントを教えてください。

更新

次のように私は無限ループを変更した:

while(1){ 

     //The module waits while the signal h is false 
     while(!h) wait(); 

     //The iterations to fill in the matrix begin 
     //The iterations must work just if h = true 
     for(i=0; i<100; i++){ 
      //Wait for a positive event of control signal h 
      wait(h.posedge_event()); 
      for(j=0; j<100; j++){ 
       wait(); 
       matrix.nmmatrix[i*matrix.width+j] = p_in;    
      } 
     } 
    } 

今カウンタは、信号hfalseている間増加を停止します。それにもかかわらず、私が持っている問題は、hが初めてtrueのときにカウントが開始しないことですが、htrueのときに開始されます。どちらが問題だろうか?

答えて

0

問題が@mrboneによって提案されたコードに若干の修正を行うことによって解決される:htrueた後

while(1){ 
     while(!h) wait(h.posedge_event()); //wait for a positive edge of h 

     for(i=0; i<100; i++){ 
      for(j=0; j<100; j++){ 
       matrix.nmmatrix[i*matrix.width+j] = p_in; // h is true in this clock from the first while(!h) 
       wait();         // one wait for next clock 
       while(!h) wait();       // wait further if h is not true 
      } 
     } 
    } 

使用してちょうどwait()カウントは1つのクロック・サイクルを開始します。このステートメントを追加すると、正のエッジhが検出されるとカウントが開始されます。

0

外側のループと同じように、内側のループの内側に配置してみませんか?

while(!h) wait(); 

このように、あなたのij増分はhfalseを行うことによって一時停止することができます。

+0

私はすでにそれを試しています。 – Marco

+0

スレッドの機密性リストには何がありますか? –

+0

"シミュレーション"とは何ですか?あなたが「シミュレーション」について言及したのはこれが初めてです。 –

0

あなたのコードの流れが近いですが、hが真である最初のクロックの見逃し捕獲を避けるために、これを試してください:あなたが使用しているので、

while(1){ 
    while(!h) wait(); 

    for(i=0; i<100; i++){ 
     for(j=0; j<100; j++){ 
      matrix.nmmatrix[i*matrix.width+j] = p_in; // h is true in this clock from the first while(!h) 
      wait();         // one wait for next clock 
      while(!h) wait();       // wait further if h is not true 
     } 
    } 
} 

唯一のclk.pos()感度などを使用することで十分ですSC_THREAD

+0

この方法ではほとんど動作しますが、この実装の唯一の問題は、何らかの理由で 'j'が' i'の後にクロックサイクルをインクリメントし始めるということです。両方とも同時に増分を開始する必要があります。 – Marco

+0

実装しようとしている機能を理解しているとは思いません。あなたはこのシーケンスを探していませんか? (1,0)、(0,1)、(0,2)、..(0,99)、 (1,0)、(1,1)、(1,2,3) –

+0

はい、そうですが、私は(i、j)=(0,0)、(0,0)、(0,1) )、...(0,98)、(1,0)、(1,0)、(1,1)、...(1,98) – Marco

関連する問題