0

プロジェクトに OR1200 を使用しており、FPGA ボードの 8 番目のボタンに割り込みを割り当てたいと考えています。割り込みを生成するコードは次のとおりです。

   inrpt: process(CLK_I, RST_I)
   begin
      if RST_I = '1' then
         butt_int_pul <= '0';
         butt_int_tmp <= '0';
      elsif rising_edge(CLK_I) then
         if(DATA_I(8) = '1' and butt_int_tmp = '0') then
            butt_int_pul <= '1';
         else 
                butt_int_pul <= '0';
         end if;

         butt_int_tmp <= DATA_I(8);
      end if;

   end process inrpt;

   process(CLK_I, RST_I)
   begin
     if RST_I = '1' then
            butt_int <= '0';
     elsif butt_int_pul = '1' then
            butt_int <= '1';
     elsif clear_int = '1' then
        butt_int <= '0';
     end if;

   end process;

この割り込みを 1 回だけ処理する必要があるため (ボタンを押したままにすると、再度割り込みが呼び出されないようにする必要があります)、これをチェックするフラグを含めたのはそのためです ( butt_int_tmp)。

問題は、割り込み呼び出しが安定していないことです。ボタンを押すたびに呼び出されるわけではありません。フラグを外すと動作するのですが、この場合はボタンを押している回数だけ処理されます。

私たちは何を間違っていますか?

4

2 に答える 2

-1

割り込みについて考えないのが最善です。FPGA をターゲットにしているため、ソフトウェア プロセッサではなく、デジタル ロジックを記述しています。

必要な動作を備えた回路を構築する方法は多数あります。最も単純なのは、おそらく再タイミングされたラッチです

signal latched_button : std_logic;
signal meta_chain     : std_logic_vector(2 downto 0);

p_async_latch: process(rst_i,data(8))
begin
   if rst_i = '1' then
      latched_button <= '0';
   elsif data(8) = '1' then
      latched_button <= '1';
   end if;
end process;

p_meta_chain: process(rst_i,clk_i)
begin
   if rst_i = '1' then
      meta_chain <= (others => '0');
   elsif rising_edge(clk_i) then
      meta_chain <= meta_chain(1 downto 0) & latched_button;
   end if;
end process;

button_int <= '1' when meta_chain(2 downto 1) = "01" else '0';

これにより、ボタンの押下が非同期にラッチされます。ラッチされた信号はシフト レジスタに沿ってクロックされ、割り込みは 1 サイクルのみ有効です。これは、クロック ドメインでラッチが検出された最初のクロック サイクルです。

于 2013-07-21T13:02:25.320 に答える