2017-02-23 4 views
0

だから私は、信号がアサートされていることに問題があるようです。だから基本的に私は2つのfpgaの間でi2cインターフェイスを実装しています。私のマスターは50バイト以上を送るでしょう。私のスレーブ側では、配列に入ってくるバイトを格納したい。だから、バイト全体が読み込まれて利用可能になったときにチェックして、それを配列に入れます。問題は、配列全体を塗りつぶした後、プロセスをアクティブにするシグナルをアサーションしたいということです。私の問題は、シグナルがアサートされ、プロセスがアクティブになってアイドルループに陥っていることです。これはプロセスを入力してフラグ信号のアサーション条件をチェックするという仮定の下にあったためです。高いと思われる。だから、私のシグナルがプロセスを活性化していないという問題、あるいはフラグがすでに0に戻っているという条件付きフラグアサーションをチェックする時間が私の問題なのですか? 私はいくつかのコードを添付しました:シグナルがプロセスを活性化していませんか?

signal i : integer range 0 to 49 := 0; 

    type field_array is array(0 to 49) of std_logic_vector(7 downto 0); 
begin 
process(clk,rst) 
begin 

if(rst = '1') then 

    i <= 0; 

elsif (rising_edge(clk)) then 

    if(data_available = '1') then 

     array_of_data(i) <= Master_Data; 

     i <= i + 1; 

    end if; 

    if(i = 49) then 

     i <= 0; -- reset index back to zero 

    end if; 

end if; 

end process; 

flag <= '1' when i = 49 else '0'; 

process(state,flag) 
begin 

next_state <= state; 

case (state) is 

    when idle => 

     if(flag = '1') then 

      next_state <= Send_data; 

     end if; 

    when Send_data =>... 
+0

あなたのコードスニペットからそれが明確でない 'next_state'(フラグが変更されたときにセットされる)はあなたのステートマシンの次の状態をトリガーするために' state'シグナルを変更するはずです。 – mfro

答えて

0

あなたの割り当て、i <= i+1;上の境界チェックの失敗があります。後で実行されるチェックの前に評価しようとしています(if i=49...)。

変更するには、コードの同期一部:

elsif rising_edge(clk) then 
    if data_available = '1' then 
     array_of_data(i) <= Master_Data; 
     if i = 49 then 
      i <= 0; 
     else 
      i <= i + 1; 
     end if; 
    end if; 
end if; 

EDIT:

あなたはフラグがアサートされていることがわかりますし、状態がhereを変更します。

さらにEDIT:

はあなたの状態マシンが同期することとnext_state信号を削除することを検討してください。例えば。

type state_t is (idle_s, send_s, others_s); 
signal state : state_t := idle_s; 
... 
process(clk,rst) 
begin 
    if rst = '1' then 
     -- rst 
    elsif rising_edge(clk) then 
     case (state) is 
      when idle_s => 
       if flag = '1' then 
        state <= send_s; 
       else 
        state <= idle_s; 
       end if; 
      when send_s => 
      -- Do stuff 
      when others => 
      -- stuff 
     end case; 
    end if; 
end process; 

状態が変わるとすぐに出力を割り当てる場合は、2つのプロセス状態マシンを使用できます。プロセスの1つ(同期)は状態遷移を制御するために使用され、もう1つは出力を制御するために使用されます(組み合わせ)。あなたは効果的に最初に似た別のプロセスを持っているでしょう:

process(state) 
begin 
    case state is 
     when idle_s => 
      my_output <= '0'; 
     when send_s => 
      -- Assign output as necessary 
      my_output <= '1'; 
     when others => 
     --assign output 
    end case; 
end process; 

例がhere示されています。

+0

ありがとうございました。はい、それはシミュレーションで正常に動作しているようだが、私は私のFPGA上でそれを実行するとアイドル状態(ledのを使用して状態を確認する)に固執するようだ。私が間違っているが、フラグがアサートされている場合(0 - > 1)、プロセスがアクティブになり、(フラグ= '1')かどうかを確認するときに条件が真でなければならないのですか? –

+1

修正。さらなる見通しの後、私はおそらくあなたの州のコントローラプロセスも変更するでしょう。それを同期させ、 'next_state'シグナルを取り除いてください – gsm

+0

私はそれをシミュレートしようとするとGHDLからその行に境界チェックエラーを受け取ります – gsm

関連する問題