Cyclone V HPSへのインタラプト入力(Qsys部分)

FPGA

DE0-Nano-SoCに搭載されているCyclone Vで、ユーザー回路からHPSにインタラプト信号を接続する手順です。Quartus IIではQsysでHPSの設定などを行いますが、

  • インタラプト信号はどうやってQsysに入力すれば良いのか
  • HPSのどこに接続すれば良いのか
  • インタラプト・ハンドラはどうすれば良いのか

という部分で少し悩みました。今回は、次のような方法でインタラプトを接続しました。

  • Qsysで1ビットのPIO(入力)モジュールをインスタンス化する。ユーザー回路からのインタラプトはそこに入力する
  • PIOからのインタラプト出力をQsysでHPSのIRQ入力に接続する。

インタラプト信号をQsysに入力する方法はこれ以外にもあるかも知れません。今回の具体的な手順は次の通りです。

Qsysの設定

PIOのインスタンス

インタラプトを接続するためのPIOをインスタンス化します。この例ではpio_extという名前でインスタンス化しています。external_connectionのExport部分をダブル・クリックするとPIOの入力信号が外部端子になります。名前はpio_ext_intとしました。

PIOのインスタンス化

PIOのインスタンス化

次にpio_extをダブル・クリックして詳細を設定します。具体的には、次のように設定します。

  • ビット幅1
  • 入力方向
  • Output Registerなし
  • Edge captureなし
  • Interruptを生成、タイプはLEVEL
PIOの詳細設定

PIOの詳細設定

PIOモジュールは、レジスタの初期設定を行う必要があります。このため、s1をHPSのAXIマスタに接続します。今回は、Lightweight AXI Master (h2f_lw_axi_master)に接続しました。アドレス領域は0x0000_0010 – 0x0000_001fとしました。

PIOの接続

PIOの接続

インタラプト信号について

Cyclone V Hard Processor System Technical Reference Manual」によると、HPSへのユーザー回路からのインタラプト入力は32本x2 = 64本が用意されています。

FPGA-to-HPS Interrupts
You can configure the HPS component to provide 64 general purpose FPGA-to-HPS interrupts, allowing soft IP in the FPGA fabric to trigger interrupts to the MPU’s generic interrupt controller (GIC). The interrupts are implemented through the following 32-bit interfaces:
• f2h_irq0—FPGA-to-HPS interrupts 0 through 31
• f2h_irq1—FPGA-to-HPS interrupts 32 through 63
The FPGA-to-HPS interrupts are asynchronous on the FPGA interface. Inside the HPS, the interrupts are synchronized to the MPU’s internal peripheral clock (periphclk)
Cyclone V Hard Processor System Technical Reference Manual 28-8 HPS Component Interfaces

Qsysでのインタラプト信号の接続

pio_extのirq出力を、HPSのf2h_irq0またはf2h_irq1に接続します。この例ではf2h_irq0に接続しています。マニュアルに記載されている通り、f2h_irq0とf2h_irq1はそれぞれ32本(32ビット)です。今回のpio_extのインタラプトは1ビットなので、どのビットに割り当てるかを指定する必要があります。この設定はIRQの列に表示されている番号で行います。今回は”0″を設定しています。つまり、pio_extのインタラプトをf2h_irq0[0]に接続しています。

HPSへのインタラプト接続

HPSへのインタラプト接続

トップモジュールでの信号接続

QsysでHDLを生成後、手作業でユーザー回路からのインタラプト信号を接続します。この例ではw_intがインタラプト信号です。

module ghrd(
   (省略)
);
wire w_int;
soc_system u0 (
  .pio_led_external_connection_export    (LED), //Clock&Reset
   (省略)
   :
  .pio_ext_int_export(w_int)  // HPSへのインタラプト入力
 );

pp_top u_pp_top (
  // system
  .clk_core(FPGA_CLK1_50),
  .rst_x(w_pll_locked),
  .o_int(w_int),   //ユーザー回路からのインタラプト出力
   (省略)

インタラプト・ハンドラについて

今回、ユーザー回路からのインタラプト信号をf2h_irq0[0]に接続しました。では、これは何を意味するのかというと、GIC(General Interrupt Controller)のInterreupt Number 72に対応するようです。つまり、Interrupt Number 72に反応するようにインタラプト・ハンドラを書けば、ユーザー回路からのインタラプトが認識できるということです。Cyclone V Hard Processor System Technical Reference Manualの”9-14 GIC Interrupt Map for the Cyclone V SoC HPS”という表にはFPGA_IRQ0 – FPGA-IRQ63が定義されていますが、これがf2h_irq0[31:0]とf2h_irq1[31:0]にそのまま対応しているようです。この表ではFPGA_IRQ0がGIC Interrupt Number 72、それから順にFPGA_IRQ63がGIC Intrrupt Number 135という対応が記載されています。

タイトルとURLをコピーしました