2017-04-19 6 views
3

に立ち下がり、立ち上がりの両エッジを使用して、私は次のようにFPGA & VHDLの初心者が..FPGA:同じプロセス

私の開発環境があるんです。

FPGA:スパルタン6 XC6SLX9

コンパイラ:ISE 14.04

シミュレータ:ISIM

私はシンプルなカウンターを作ってるんだが、私は理解できないいくつかのものがあります。

次のコードは私が書いたものです。私が期待したのは、クロックの立ち下がりエッジごとにw_countが増加し、クロックの立ち上がりエッジでw_countがN_dataに達すると0にリセットされたことでした。コンパイルプロセスには問題はなく、シミュレーションも期待通りに機能しました。しかし、本当のFPGAに適用した場合に、w_countは、各トリガのために増分されましたが、N_DATAに達したときにゼロに初期化されませんでした。..

w_state_proc : process(r_clk, reset_n_clean) 
begin 
    if(reset_n_clean = '0') then 
     w_count <= 0; 
    elsif(r_clk'event and r_clk = '0') then 
     if(state = write_state and w_proc = '1') then 
      w_count <= w_count + 1; 
     end if; 
    elsif(r_clk'event and r_clk = '1') then 
     if(w_count = N_data) then 
      w_count <= 0; 
     end if; 
    end if; 
end process w_state_proc; 

私は2つのELSIFステートメントの位置を変更した場合、w_countは全く増加しませんでした..

w_state_proc : process(r_clk, reset_n_clean) 
begin 
    if(reset_n_clean = '0') then 
     w_count <= 0; 
    elsif(r_clk'event and r_clk = '1') then 
     if(w_count = N_data) then 
      w_count <= 0; 
     end if; 
    elsif(r_clk'event and r_clk = '0') then 
     if(state = write_state and w_proc = '1') then 
      w_count <= w_count + 1; 
     end if; 
    end if; 
end process w_state_proc; 

私はこれらの記述は、推奨されていないことを多くのフィードバックを見ることができますが、これらの記述は、この問題を引き起こすなぜ私はを理解していない...

+0

w_procが入力を有効にしていると思われますか? – Staszek

+0

はい。それはfpgaの外から来るトリガーです。 –

答えて

3

あなたのFPGAは、デュアル持っていませんデータ一般的なファブリックではDDR(DDR)フリップフロップを使用しているため、推奨されていません。「そのまま」、目的の機能を実装できません。

また、非同期リセットを使用しています。 FPGAはすでに同期リセット・フリップフロップを備えているため、ASICと異なり、余分なロジックを必要とせず、リセットをかけなくてもすべての信号に既知の値が得られるため、可能ではありません。非同期リセットは、タイミングクロージャを何らかの形で達成する上で問題を引き起こします。

あなたの例では、DDR FFは必要ありません。あなたが持っている振る舞いを持つ理由は、クロックサイクルの間にw_countをクリアできるので、w_countがインクリメントされたときに決してN_dataにならないように思えるでしょう。なぜそれを1つ小さい方の値と比較してみませんか?

それとも、あなたは(非常に慎重に!)の変数を使用することができ非常によく似た動作を実現するために:

w_state_proc : process(r_clk) is 
    variable v_count : integer range 0 to N_data; 
    begin 
    if (rising_edge(r_clk)) then 
     v_count := w_count; 
     if(state = write_state and w_proc = '1') then 
     v_count := v_count + 1; 
     end if; 

     if(reset_n_clean = '0' or v_count = N_data) then 
     w_count <= 0; 
     else 
     w_count <= v_count; 
     end if; 

    end if; 
    end process w_state_proc; 

あなたが本当には半クロックサイクルのためのN_DATAの価値を持っているw_countが必要になります場合は、常にクロックを2倍高速にし、他のクロックサイクルごとにイネーブル信号をアクティブにして、パイプラインの横にそれを伝播することができます。それは他の(非常に教育的な)トラブルの全ホストであなたを得るでしょうが、実行可能です。

+0

ありがとう!!!!!!!!! –

関連する問題