備忘録を兼ねて,DE0-NanoでのFFTの実装手順をまとめておきます.
プロジェクトファイルは下記のリンクからダウンロードできます.
http://www.sensorcomm.co.jp/osqzss/fpga/fft/DE0_Nano_QSYS_FFT.zip (3.08MB)
(1) FFTのMegaCore FunctionはQsysではサポートされていないため,
MegaWizard Plug-In ManagerをQuartus IIのToolメニューから起動します.
![](https://blogimg.goo.ne.jp/user_image/62/1f/14ff12f1926a658f9d46c15df3e615bf.png)
(2) MegaWizard Plug-In ManagerのPage 1で,Create a new custom megafunction variationを
選択します.
(クリックで拡大)
(3) 次のページでFFTのmegafunctionを選択します.
(クリックで拡大)
(4) FFT MegaCore Functionの画面から,Parameterizeをクリックします.
(クリックで拡大)
(5) Parametersタブで,Target Device FamilyとFFTのサイズを指定します.
(クリックで拡大)
(6) Architectureタブで,I/O Data Flowの指定します.今回はStreamingを選んでいます.
(クリックで拡大)
(7) 設定が終了したら,FFT MegaCore Functionの画面でGenerateをクリックします.
(8) MegaCore Functionが生成されると,Quartus IIのFilesにfft.qipが追加されます.
![](https://blogimg.goo.ne.jp/user_image/01/15/7603a9ff03be0194ecc5432caa21ca0b.png)
(9) MegaWizardによって生成されたFFT MegaCore FunctionをQsysに取り込むために,
wrapperモジュールを作成します.wrapperの中身は,ダウンロードファイルの中の
fft_avalon_wraper.vを参照してください.(typoだ…)
![](https://blogimg.goo.ne.jp/user_image/48/cb/8ce64e7e4d581dee4f692b4092a81c53.png)
(10) Qsysを起動したら,まずはいつも通りにNios IIを実装します.
(クリックで拡大)
(11) FFT MegaCore FunctionをQsysの新しいコンポーネントとして追加するために,
Component LibraryタブからNew component...をクリックします.
(12) Component EditorのHDL Filesタグで,Top Level Moduleとして(9)で作成した
wrapperを追加します.
(クリックで拡大)
(13) 次にSignalsタブで,InterfaceとSignal Typeを設定します.
(クリックで拡大)
(14) 次にInterfacesタブを開きます.Master has no read or write interfaceのエラーは,
Remove Interfaces With No Signalsボタンをクリックすると解消されます.
Interface must have an associated resetのエラーは,Associated Resetの
プルダウンメニューから適切なリセット信号を選ぶことで解消します.
(クリックで拡大)
(15) コンポーネントが正常に生成されると,Libraryに新たなコンポーネントとして追加されます.
早速これをクリックして,FFTをシステムに追加します.
(クリックで拡大)
(16) FFTの入出力先に,今回はFPGAの内部メモリを使うことにします.Component Linraryから,
On-Chip Memory (RAM or ROM)コンポーネントをシステムに2つ追加します.
(クリックで拡大)
(17) On-Chip Memoryの名前を,それぞれinput_ram_0とoutput_ram_0とします.
(クリックで拡大)
(18) input_ram_0のデータをFFTへstreamingとして入力するために,Scatter-Gather DMA Controllerを
システムに追加します.
![](https://blogimg.goo.ne.jp/user_image/70/95/abe0cab6f55b6b579a42faea86e0c061.png)
(19) Transfer modeにMemory to Streamを選択し,sgdma_m2s_0という名前にします.
(クリックで拡大)
(20) 同様に,FFTからのstreamingの出力をoutput_ram_0に書き込むために,SGDMAを
もう一つ追加します.こちらのTransfer modeはStream to Memoryとなり,名前は
sgdma_s2m_0とします.
(クリックで拡大)
(21) FFTとSGDMA,SGDMAとOn-Chip Memoryを接続します.
(クリックで拡大)
(22) これでFFTとNios IIが接続されました.システムをGenerateしてからQuartus IIに戻り,
論理合成をします.
![](https://blogimg.goo.ne.jp/user_image/31/05/5aa260acd6ab3323edfdf0109766b80c.png)
(23) ソフトウェアの開発は,これまでと同じようにNios II Software Build Tools for Eclipseの
ファイルメニューからNios II Application and BSP from Templateを選び,BSPを生成します.
(24) Nios IIからのFFTの実行は,ダウンロードファイルの中のMain.cを参照してください.
基本的な動作としては,まずinput_ram_0とoutput_ram_0の先頭アドレスをそれぞれのSGDMAに
登録.次に入力データとしてサイン波をinput_ram_0に書き込み,FFTを実行,出力データを
output_ram_0から読みだしてJTAG UARTにプリントアウトという流れになっています.
SGDMAで転送されるデータのバイト単位での順番に注意してください.
プロジェクトファイルは下記のリンクからダウンロードできます.
http://www.sensorcomm.co.jp/osqzss/fpga/fft/DE0_Nano_QSYS_FFT.zip (3.08MB)
(1) FFTのMegaCore FunctionはQsysではサポートされていないため,
MegaWizard Plug-In ManagerをQuartus IIのToolメニューから起動します.
![](https://blogimg.goo.ne.jp/user_image/62/1f/14ff12f1926a658f9d46c15df3e615bf.png)
(2) MegaWizard Plug-In ManagerのPage 1で,Create a new custom megafunction variationを
選択します.
![](https://blogimg.goo.ne.jp/user_image/1d/32/8568137e39bf90e0f6da45728d7d2081.png)
(3) 次のページでFFTのmegafunctionを選択します.
![](https://blogimg.goo.ne.jp/user_image/01/da/c289f6300f9fc63617cd6d412274ddd5.png)
(4) FFT MegaCore Functionの画面から,Parameterizeをクリックします.
![](https://blogimg.goo.ne.jp/user_image/19/9c/7ab13fd5a5973ae0145a5c6bad110946.png)
(5) Parametersタブで,Target Device FamilyとFFTのサイズを指定します.
![](https://blogimg.goo.ne.jp/user_image/06/78/f34f48e6feeca22c0341868419f3d0f6.png)
(6) Architectureタブで,I/O Data Flowの指定します.今回はStreamingを選んでいます.
![](https://blogimg.goo.ne.jp/user_image/53/ab/6e59f3dbfc27e04c6bfaf61deae40ab7.png)
(7) 設定が終了したら,FFT MegaCore Functionの画面でGenerateをクリックします.
(8) MegaCore Functionが生成されると,Quartus IIのFilesにfft.qipが追加されます.
![](https://blogimg.goo.ne.jp/user_image/01/15/7603a9ff03be0194ecc5432caa21ca0b.png)
(9) MegaWizardによって生成されたFFT MegaCore FunctionをQsysに取り込むために,
wrapperモジュールを作成します.wrapperの中身は,ダウンロードファイルの中の
fft_avalon_wraper.vを参照してください.(typoだ…)
![](https://blogimg.goo.ne.jp/user_image/48/cb/8ce64e7e4d581dee4f692b4092a81c53.png)
(10) Qsysを起動したら,まずはいつも通りにNios IIを実装します.
![](https://blogimg.goo.ne.jp/user_image/27/fd/5b8dd74d69d63e2ad0e8953927ee9260.png)
(11) FFT MegaCore FunctionをQsysの新しいコンポーネントとして追加するために,
Component LibraryタブからNew component...をクリックします.
(12) Component EditorのHDL Filesタグで,Top Level Moduleとして(9)で作成した
wrapperを追加します.
![](https://blogimg.goo.ne.jp/user_image/59/95/fa9d7372b3eb6e8936f6c7a6a7dab8da.png)
(13) 次にSignalsタブで,InterfaceとSignal Typeを設定します.
![](https://blogimg.goo.ne.jp/user_image/08/5e/531f3ffe28baec5cfb71e534e1f20e27.png)
(14) 次にInterfacesタブを開きます.Master has no read or write interfaceのエラーは,
Remove Interfaces With No Signalsボタンをクリックすると解消されます.
Interface must have an associated resetのエラーは,Associated Resetの
プルダウンメニューから適切なリセット信号を選ぶことで解消します.
![](https://blogimg.goo.ne.jp/user_image/22/d0/2f1a4ae2298c14c7466a666a01f1bfb3.png)
(15) コンポーネントが正常に生成されると,Libraryに新たなコンポーネントとして追加されます.
早速これをクリックして,FFTをシステムに追加します.
![](https://blogimg.goo.ne.jp/user_image/0e/ed/ab7e57fa4827529a64a385237a3d7325.png)
(16) FFTの入出力先に,今回はFPGAの内部メモリを使うことにします.Component Linraryから,
On-Chip Memory (RAM or ROM)コンポーネントをシステムに2つ追加します.
![](https://blogimg.goo.ne.jp/user_image/19/51/c77043e037f125c09edc7a4d589bdbde.png)
(17) On-Chip Memoryの名前を,それぞれinput_ram_0とoutput_ram_0とします.
![](https://blogimg.goo.ne.jp/user_image/01/6f/0b05d682e8a49c4d20403c65d966de3b.png)
(18) input_ram_0のデータをFFTへstreamingとして入力するために,Scatter-Gather DMA Controllerを
システムに追加します.
![](https://blogimg.goo.ne.jp/user_image/70/95/abe0cab6f55b6b579a42faea86e0c061.png)
(19) Transfer modeにMemory to Streamを選択し,sgdma_m2s_0という名前にします.
![](https://blogimg.goo.ne.jp/user_image/7a/4c/961da8c8efd4153f0b19a33855ae3d83.png)
(20) 同様に,FFTからのstreamingの出力をoutput_ram_0に書き込むために,SGDMAを
もう一つ追加します.こちらのTransfer modeはStream to Memoryとなり,名前は
sgdma_s2m_0とします.
![](https://blogimg.goo.ne.jp/user_image/7b/a0/131a1c2a47c3570a5846a76c984f9b78.png)
(21) FFTとSGDMA,SGDMAとOn-Chip Memoryを接続します.
![](https://blogimg.goo.ne.jp/user_image/26/6a/ffa29792bbf7c088c5393ee7be43952d.png)
(22) これでFFTとNios IIが接続されました.システムをGenerateしてからQuartus IIに戻り,
論理合成をします.
![](https://blogimg.goo.ne.jp/user_image/31/05/5aa260acd6ab3323edfdf0109766b80c.png)
(23) ソフトウェアの開発は,これまでと同じようにNios II Software Build Tools for Eclipseの
ファイルメニューからNios II Application and BSP from Templateを選び,BSPを生成します.
(24) Nios IIからのFFTの実行は,ダウンロードファイルの中のMain.cを参照してください.
基本的な動作としては,まずinput_ram_0とoutput_ram_0の先頭アドレスをそれぞれのSGDMAに
登録.次に入力データとしてサイン波をinput_ram_0に書き込み,FFTを実行,出力データを
output_ram_0から読みだしてJTAG UARTにプリントアウトという流れになっています.
SGDMAで転送されるデータのバイト単位での順番に注意してください.