2016-11-22 10 views
0

私は比較的単純なメモリアービターを設計していますが、2つの状態があります。VHDL - 論理合成可能にする

  • 状態1:ポート1は、メモリに接続されている(デフォルト状態)
  • 状態2:ポート2は、メモリに接続されている(要求がある場合のみ)

シミュレーションのModelSimで私のアービタが必要に応じて動作することを証明しています。しかし、私が書いたコードは合成できないと言われました。関連するプロセスのコードを以下に示します。

要求に応じてイネーブル信号がハイになり、イネーブル信号をローに設定すると、そのポートがサービスされたことが確認されます。要件は、2つの同時要求がある場合、ポート2を接続する必要があるということです。しかし、以前の要求のためにポート1がすでに接続されている場合、ポート2はポート1がサービスされるまで待機する必要があります。

私の質問は以下のとおりです。

  1. 私が書いたコード(およびその理由)での問題は何ですか?私はこのためポストのコード部分をフォーマットに問題が

the relevant process' code

(最終溶液のため、うまくいけば便利なヒントをaksingない)、このコードの論理合成を行うためのアプローチだろう何

  • 画像としてもコードが含まれています。

    transition: process (clk) 
    begin 
         if rising_edge(clk) then 
    
          if reset = '1' then  
           state <= port1; 
          else 
           if (state = port1) and (req_p2.enable='1') and 
            (req_p1.enable='0' or rising_edge(req_p1.enable)) then 
            state <= port2; 
    
           elsif(state = port2) and (req_p2.enable='0') then 
            state <= port1; 
           end if; 
          end if; 
    
         end if; 
    end process; 
    
  • +1

    私に合成可能に見えます。それを合成し、実際の問題を報告してください。私は実際に何かが*状態を使用していると仮定しています。そうでなければ、合成後には、何も最適化されません。 –

    答えて

    2

    あなたのコードのこの行は合成可能ではありません。

    rising_edge(req_p1.enable) 
    

    は、それはあなたが立ち上がりエッジを検出し、いくつかの実際のロジックとrising_edge機能を交換する必要が合成可能にするために - 上昇同期エッジ検出器。この線に沿って何か動作するはずです(私はあなたの要件を知らない):それはクロック駆動プロセス内の従来の方法で使用されているが場合

    sync_rising_edge: process (clk) 
    begin 
        if rising_edge(clk) then 
        if reset = '1' then  
         req_p1_enable_d <= '0'; 
        else 
         req_p1_enable_d <= req_p1.enable; 
        end if; 
        end if; 
    end process; 
    
    transition: process (clk) 
    begin 
         if rising_edge(clk) then 
    
          if reset = '1' then  
           state <= port1; 
          else 
           if (state = port1) and (req_p2.enable='1') and 
            (req_p1.enable='0' or (req_p1_enable_d = '0' and req_p1.enable = '1')) then 
            state <= port2; 
    
           elsif(state = port2) and (req_p2.enable='0') then 
            state <= port1; 
           end if; 
          end if; 
    
         end if; 
    end process; 
    

    rising_edge機能が合成可能です。 my answer hereを参照してください。

    +1

    'rising_edge(req_p1.enable)'はそれ自身で合成可能ですが、 'rising_edge(clk)then if(rising_edge(req_p1.enable)) 'という2つのネストされたエッジセンシティブなケースこれは合成可能ではありません(質問者のためにコメントします) –

    +0

    ありがとう@scary_jeff。私は私の答えを明確にします。 –