マイコン入りのFPGAの設計についていろいろ話をしていて、
FPGAのロジックからマイコンに割り込み信号を入れようと思うが、
果たしてどういう設計にするのがよいかという話をしていた。
割り込み信号は大きくレベルトリガとエッジトリガの2方式がある。
レベルトリガは、例えば割り込み信号がHiであるうちは割り込みが発生し続けるというもの。
通常は割り込み処理の中で割り込み要因を消す処理を行う。
エッジトリガは、割り込み信号の立ち上がり・立ち下がりで割り込みが発生するもの。
こちらは一度割り込みが発生すると、次に信号が変化するまで割り込みは発生しない。
想定していた ロジック部→マイコン部 の割り込み信号について、
担当者はエッジトリガだと思っていたみたいなのだが、
テストプログラムを書いてみるとレベルトリガであることが判明した。
ロジック部→マイコン部の接続方法によってはエッジトリガも可能なのだが、
おそらくレベルトリガを前提とした構成になるのではないかと言っている。
- FPGA部で割り込み要因を検出する
- レジスタの割り込み要因のビットを1にして、割り込み信号をHiにする
- マイコンの割り込みハンドラで要因レジスタをリードする
- 要因レジスタの確認したビットをクリアする
(全ての割り込み要因がクリアされれば割り込み信号はLoになる) - 要因レジスタにリード結果に応じて処理を行う
- (未確認の割り込み要因が残っていれば再度割り込みが入る)
実際のところ、エッジトリガとしても似たような構成になるんだよな。
割り込みコントローラでエッジを検出して、コアに割り込みを発生させ、
割り込みハンドラでは、割り込みコントローラから割り込み番号を取得して、
その番号の割り込みを消化したことを割り込みコントローラに伝え……
やってることは上と同じですよね。
マイコンで持っている割り込みコントローラでやるか、マイコン部の外側でやるかの違いで、
マイコン入りFPGAなので、こういう処理をFPGA部に作り込めるって話。
わりとマイコン内部ではレベルトリガの割り込みが多いんですよね。
そちらの方が取扱が便利だからだと思うけど。
一方で外部ピンからの割り込みはエッジトリガになることが多いかな。
外部からの入力信号が変化したときに割り込みが欲しいですからね。
FPGAのロジック部から与えられる割り込み信号の中には、
元々は別のICからエッジトリガで入っていたものもあるので、
それをロジック部でレベルトリガに改めるのか、割り込みコントローラにエッジトリガとして処理させるのか。
ここは意見が分かれるかも知れませんけどね。