« Artix-7ボード用のHDMI/CSI入出力ボード | トップページ | ZYNQでQSPI ROMを使う方法 »

2016.08.30

大量のコントロール・ステータス・レジスタをVivadoで作る方法

FPGAの中に機能をコントロールするためのレジスタを作り、そのレジスタをCPU(PL)から操作するようなシステムを効率的に作るにはどうしたらよいでしょうか。

つまり、

if(wr_en(0) = '1') then
    reg0 <= axi_wdata;
end if;
if(wr_en(1) = '1') then
    reg1 <= axi_wdata;
end if;
if(wr_en(2) = '1') then
    reg2 <= axi_wdata;
end if;
if(wr_en(3) = '1') then
    reg3 <= axi_wdata;
end if;
・・・

こういう場合です。

作られたレジスタの値をIPインテグレータの別のモジュールで使いたい場合、IPIのブロックから大量のレジスタの線が出ていくことになり、ごちゃごちゃになってしまいます。

書き込みだけではなく、読み出し用のステータスレジスタもたくさんある場合を考えてみてください。

こういうレジスタがたくさんある場合、VivadoのIPインテグレータではどうするのがベストでしょうか。

AXI Liteのバスを作って、各モジュールのコントロールレジスタはモジュール内に作るというのも一つの手段だと思います。

別の解決方法としては、インタフェースを作って、その中にすべてのレジスタを放り込むこむというのも良いのではないかと思います。

sun

次の図は、Cosmo-Zの内部回路のものです。

Csr1

CSRと書かれたバスが、このようなレジスタをまとめたインタフェースとなっています。
※CSRはControl Status Registerの意味

広げてみると・・

Csr2

と、画面に収まりきらないほどのレジスタが含まれています。

Cosmo-Zは、32bit×64本のコントロール・ステータス・レジスタがあるので、128個のポートが存在しているわけです。

これらのたくさんのレジスタを纏めて「インタフェース」化して、ADCやCAPTURE、DSPなどの各モジュールに分配しようというわけです。

sun

ただ、Vivadoでポート数の多いインタフェースを作るのはとても面倒です。標準的なInterface Editor(下の画面。File→Open IP-XACT Fileで開ける)で編集するのはしんどいし、テキストエディタで編集しようにもXMLなので、かえって面倒になります。

Csr3

特電のアルバイトさんが、64種32bit×2のレジスタをインタフェースとして登録してくれました。

実際にやってみたところ、Vivadoのインタフェースは単一の信号とは違って分岐できないという問題に当たりましたが、CSR InterconnectというIPコアを作ってこのCSRバスを分岐させるようにして解決してくれました。

Csr4

これで、Cosmo-ZデザインをVivado化する上での困難がすべて解消できました。

感謝感謝です。

|

« Artix-7ボード用のHDMI/CSI入出力ボード | トップページ | ZYNQでQSPI ROMを使う方法 »

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



« Artix-7ボード用のHDMI/CSI入出力ボード | トップページ | ZYNQでQSPI ROMを使う方法 »