1

この信号は、別の信号 Start = 0 になるまでゼロでなければなりません。どうすればこれを達成できますか? 関連するコードは次のとおりです。

        din<=0;
        wait until falling_edge(start);

    for i in 0 to 63 loop
        wait until clk = '1' and clk'event;
        if i = 0 then
            Start <= '1','0' after clk_period;
        end if;
            if (i < 24) then 
                din <= 255;
            elsif (i > 40) then
                din <= 255;
            else
                din <= 0;
            end if;

        end loop;

    wait;

start の立ち下がりまで din = 0 にすればいいと思ったのですが、start の立ち上がりで止まってしまいます。start = 0 のときに din 値の読み取りを開始したいと考えています。その前は din = 0 です。

ここに写真があります: ここに画像の説明を入力

編集:実際には、正しい信号値で開始するようにしましたが、dout 値には常に必要のない中間値があります。この場合は 78450 です。これがテストベンチ コードに関係していることはわかっていますが、正しい時間に正しい値を計算することはできません。中間値を取り除くために、以下のコードにどのような変更を加えることができますか?

ここに画像の説明を入力

            din<=0;


    for i in 0 to 63 loop
        wait until clk = '1' and clk'event;
        if i = 0 then
            Start <= '1','0' after clk_period;
            elsif (i < 24) then 
                din <= 255;
            elsif (i > 40) then
                din <= 255;
            else
                din <= 0;
        end if;

        end loop;
4

3 に答える 3

4

まず第一に、あなたがテストベンチを書いていると仮定します (そして願っています)。そうでない場合は、合成ツールでのサポートが非常に限られているため、wait ステートメントの使用を避ける必要があります。

テストベンチでも、時間ベースの wait または after ステートメントを使用してクロックを生成し、他のすべての信号をイベントに依存させるのが最善です (例: rising_edge(clk))。これにより、デルタ サイクル 0 中に複数の信号がクロックと共に変化するという問題が回避されます。

典型的なレジスタの次のコードを検討してください。

process(clk) begin
    if(rising_edge(clk)) then
        a <= b;
    end if;
end process;

clkそして、とが次のようにテストベンチで生成されると仮定しbます。

clk <= not clock after 1 ns;

process begin
    b <= '1', '0' after 10 ns;
    wait;
end process;
  • 時間 0 デルタ 0 で、clk'1' に変化し、'1' にb変化します。
  • 時刻 0 デルタ 1 で、変更後に登録プロセスが実行clkされ、a「1」に変更されます。
  • それ以上の感度は存在しないため、時間は 1 ns で次のイベントに更新されます。
  • 時間 1 デルタ 0 で、clk「0」に変わります。
  • 時刻 1 デルタ 1 では、変更後に登録プロセスが実行されますが、 false のclkため何も起こりません。rising_edge(clk)
  • 上記が 2 ~ 9 ns の間繰り返されます。
  • 時間 10 デルタ 0 で、clk「1」にb変化し、「0」に変化します。同じデルタサイクルclkで変化することに注意してください。b
  • 時間 10 デルタ 1 で、登録プロセスが実行されa、「0」に変更されます。結果に関する限り、これはb立ち上がりクロック エッジの前に変化したことを意味します。

この単純なシステムでこの動作が理解できる場合でも、シミュレーションのバグを見つけるのが非常に困難になる可能性があります。したがって、すべての信号を適切なクロックに基づいたものにすることをお勧めします。

process begin
    -- Initialize b to 1.
    b <= '1';
    -- Wait for 5 cycles.
    for i in 1 to 5 loop
        wait for rising_edge(clk);
    end loop;
    -- Set b to 0.
    b <= '0';

    -- Done.
    wait;
end process;

これにより、すべてのシグナルが関連付けられたクロックの少なくとも 1 つのデルタ サイクル後に変更されるため、予期しない動作が回避されます。つまり、すべてのプロセスで因果関係が維持されます。

于 2013-09-03T10:14:08.400 に答える
0

テストベンチまたはRTLコード?

テストベンチの場合、コーディング スタイルはほとんど問題ありませんが、シグナル Start に問題があり、クロックの立ち上がりエッジで「1」になることはありません。クロックの立ち上がりエッジの直後に「1」になり、クロックと同時に、またはクロックの 1 デルタ サイクル前に「0」に戻ります (クロックの設定によって異なります)。いずれにせよ、デザインなど、rising_edge クロックで実行されているものは、それを「1」として認識しません。

これを回避する簡単な方法は、DUT (被試験デバイス) に送られるすべてのテストベンチ出力で公称遅延 (tperiod_Clk の 25%) を使用することです。パルスのパターンは次のとおりです。

wait until clk = '1' ;  -- I recommend using rising_edge(Clk) for readability
Start <= '1' after tpd, '0' after tpd + tperiod_clk ; 

または、波形の割り当てを使用しないことで、この問題を回避できます。以下のような。この場合、tpd は必要ありませんが、本当にテストベンチである場合は、tpd を使用することをお勧めします。

wait until clk = '1' ;  
if i = 0 then 
  Start <= '1' after tpd ; 
else 
  Start <= '0' after tpd ; 
end if ; 

RTL コードの場合は、別のアプローチを検討する必要があります非常に簡単に言えば、それにアプローチする1つの方法は次のとおりです。遅延、波形割り当て、またはループを使用しないでください。

-- Counter to count from 0 to 63.  Use  "+ 1".  Use "mod 64" if using type integer.
-- Start logic = decoder (can be coded separately) 
-- Din Logic = decoder (can be coded separately)
于 2013-09-03T22:29:02.923 に答える
0

I have this signal that should be zero until another signal Start = 0. How can I accomplish this?

おそらく、ハンドシェイク信号を使用して、プロセスの機密リストに入れることができます。リセット信号のように動作します。

process (handshake_s, ...)
begin
  if (handshake_s = '1') then  -- failing edge of start
    din <= 0;
  else
    -- do something
  end if;
end process;

別のプロセスを使用して、 handshake_sを更新します。

process (start, ...)
begin
  if failing_edge(start) then
    handshake_s <= '1', '0' after 10 ns;  -- produce a pulse
  end if;
  -- do something
end process;

波形をよりよく理解できるように、すべてのコードをここに投稿していただけませんか?

于 2013-09-03T09:29:34.570 に答える