NamuruのHDLコードをGPS受信機として動作させるためには,それを制御するための
マイコンが必要になります.そこで,Simさんが公開されているNios IIのサンプルに
新しいコンポーネントとしてGPSを追加します.
Sim's blog:Qsysを使ってみた
サンプルと大きく異なる点は,Namuruと同様にクロック周波数です.
SimさんのNios IIはDE0-Nanoに搭載されている50MHzのクロックで動作していますが,
Namuru-Nanoではフロントエンドの16.368MHzのクロックを入力します.
そこで,まずclk_0をダブルクリックして,Clock Sourceを開き,周波数を変更します.
(クリックで拡大)
次に,ALTPLLを開き,こちらも入力周波数を16.368MHzに変更します.
(クリックで拡大)
さらに,PLLからの出力であるc0のClock multiplication factorを6に設定します.
Nios IIは,16.368MHz*6=98.208MHzで動作することになります.
(クリックで拡大)
SDRAMのクロックとなるc1も,同様にClock multiplication factorを6に設定します.
(クリックで拡大)
サンプルからの変更はこれだけです.
次に,New Componentをクリックして,GPSコンポーネントを追加して行きます.
![](https://blogimg.goo.ne.jp/user_image/76/4c/34f9e3e18518e2021eefd10de925cc40.png)
まず,HDL Filesのタブで,NamuruのHDLファイルをすべて追加します.
Top Levelのモジュールには,gps_baseband.vを選択します.
(クリックで拡大)
次に,Signalsのタブで,信号のインターフェイスやタイプを設定して行きます.
自動に設定された初期状態ではエラーばかりですので,ひとつひとつ消して行きます.
(クリックで拡大)
時々,変更を加えてもエラーや警告が更新されないことがあります.
そんなときは,FileメニューからReanalyze HDL Filesを実行してみてください.
![](https://blogimg.goo.ne.jp/user_image/57/cd/b41e8f000215d4d30755a046602359b4.png)
リセット信号のインターフェイスには,new Reset Inputからreset_sinkを選択します.
プルダウンメニューに表示される名称と,選択後にInterfaceとして表示される名称が
異なるので混乱します.これ,なんとかなりませんか,Alteraさん?
(クリックで拡大)
さらに,Signal Typeにはreset_nを選びます.
実はこれも紛らわしい.コンポーネントによっては,実際のSignal TypeとSystem Contentsの
画面で表示される名称が異なるものがあります.表示はresetなのに,Signal Typeはreset_nだったり.
これもなんとかして欲しい…
(クリックで拡大)
フロントエンドと接続され,外部からの入力となるsample_clk,sign_in,mag_inには
Interfaceとしてnew Conduitからconduit_endを選びます.Signal Typeはexportです.
(クリックで拡大)
Nios IIへの割り込み信号となるaccum_intにはInterfaceとしてinterrupt_senderを
選びます.Signal Typeはirqです.
(クリックで拡大)
最終的なSignalsのタブは,以下のようになります.これでエラーが2つまで減りました.
(クリックで拡大)
次に,Interfacesタブに移り,残りのエラーを解消して行きます.
まず1つめのエラーであるavalon_slave_0のAssociated Resetにreset_sinkを選びます.
(クリックで拡大)
続いて,interrupt_senderのAssociated addressable interfaceにavalon_slave_0を選択します.
(クリックで拡大)
これでエラーがすべて消えましたので,Library Infoタブでコンポーネントの名称を入力して,
Finishをクリックします.
(クリックで拡大)
Component Libraryには,新たにgps_basebandが追加されました.これをダブルクリックして
System Contentsに追加します.
![](https://blogimg.goo.ne.jp/user_image/21/ba/84195c775bffdbe64eeb6d6aefb7d01e.png)
他のコンポーネントと同様に,gps_0.clockはaltpll_0.c0に,gps_0.avalon_slave_0は
nios2_qsys_0.data_masterに,gps_0.reset_sinkはclk_0.clk_resetに接続します.
gps_0.conduit_endには,Exportの欄をクリックしてgps_0_conduit_endに設定します.
さらに,gps_0.avalon_slave_0のirqをnios2_qsys_0に接続します.割り込みの優先度は
jtag_uart_0より高く設定します.ここでは0を選びました.
Base adressは0x06000000としています.
(クリックで拡大)
これでシステムの生成ができます.GenerationタブでGenerationボタンをクリックしてください.
次に,GPSコンポーネントを追加したQsysモジュールを呼び出すように,DE0_Nano.vを修正します.
Simさんのサンプルとは異なり,.clk_clkにはフロントエンドのサンプリング信号であるGPIO_0_IN[0]が
接続されます.また,GPSモジュールの外部インターフェイスであるgps_0_conduit_endが追加されています.
sample_clk,sign_in,mag_inをそれぞれGPIO_0_IN[0],GPIO_0[1],GPIO_0[0]に接続します.
フロントエンド基板の回路図はこちら.
(クリックで拡大)
以上で作業は終了です.あとは論理合成をするだけ.
論理合成の結果を見ると,ロジックエレメントがまだ半分近く余っています.
![](https://blogimg.goo.ne.jp/user_image/11/7d/916962446461e479cca66bdc7a9f390f.png)
GPSモジュールのチャンネルを倍近く増やすことができそうです.すばらしい!
GPS+GLONASS受信機が作れると良いけれど,まだまだ妄想の域だな.
マイコンが必要になります.そこで,Simさんが公開されているNios IIのサンプルに
新しいコンポーネントとしてGPSを追加します.
Sim's blog:Qsysを使ってみた
サンプルと大きく異なる点は,Namuruと同様にクロック周波数です.
SimさんのNios IIはDE0-Nanoに搭載されている50MHzのクロックで動作していますが,
Namuru-Nanoではフロントエンドの16.368MHzのクロックを入力します.
そこで,まずclk_0をダブルクリックして,Clock Sourceを開き,周波数を変更します.
![](https://blogimg.goo.ne.jp/user_image/08/f9/ce6a79d745d0a134d3b194e4266d85b4.png)
次に,ALTPLLを開き,こちらも入力周波数を16.368MHzに変更します.
![](https://blogimg.goo.ne.jp/user_image/56/0b/742f446c487d50c4ac59f47e1c700b1b.png)
さらに,PLLからの出力であるc0のClock multiplication factorを6に設定します.
Nios IIは,16.368MHz*6=98.208MHzで動作することになります.
![](https://blogimg.goo.ne.jp/user_image/19/92/b762edddfe6434d774a7f90ea3b00fef.png)
SDRAMのクロックとなるc1も,同様にClock multiplication factorを6に設定します.
![](https://blogimg.goo.ne.jp/user_image/6e/29/51ef7a022892273484aa76486261bf27.png)
サンプルからの変更はこれだけです.
次に,New Componentをクリックして,GPSコンポーネントを追加して行きます.
![](https://blogimg.goo.ne.jp/user_image/76/4c/34f9e3e18518e2021eefd10de925cc40.png)
まず,HDL Filesのタブで,NamuruのHDLファイルをすべて追加します.
Top Levelのモジュールには,gps_baseband.vを選択します.
![](https://blogimg.goo.ne.jp/user_image/54/29/24db596759464059247595255c63625e.png)
次に,Signalsのタブで,信号のインターフェイスやタイプを設定して行きます.
自動に設定された初期状態ではエラーばかりですので,ひとつひとつ消して行きます.
![](https://blogimg.goo.ne.jp/user_image/59/8c/bfd5a636ba80ce5d3dc306fdfcf9d52a.png)
時々,変更を加えてもエラーや警告が更新されないことがあります.
そんなときは,FileメニューからReanalyze HDL Filesを実行してみてください.
![](https://blogimg.goo.ne.jp/user_image/57/cd/b41e8f000215d4d30755a046602359b4.png)
リセット信号のインターフェイスには,new Reset Inputからreset_sinkを選択します.
プルダウンメニューに表示される名称と,選択後にInterfaceとして表示される名称が
異なるので混乱します.これ,なんとかなりませんか,Alteraさん?
![](https://blogimg.goo.ne.jp/user_image/3f/fa/bb7253067dce27fedd7e7f5eb7c4cd3a.png)
さらに,Signal Typeにはreset_nを選びます.
実はこれも紛らわしい.コンポーネントによっては,実際のSignal TypeとSystem Contentsの
画面で表示される名称が異なるものがあります.表示はresetなのに,Signal Typeはreset_nだったり.
これもなんとかして欲しい…
![](https://blogimg.goo.ne.jp/user_image/72/94/7ec4f5625a413bbf1275b65e41d18b0b.png)
フロントエンドと接続され,外部からの入力となるsample_clk,sign_in,mag_inには
Interfaceとしてnew Conduitからconduit_endを選びます.Signal Typeはexportです.
![](https://blogimg.goo.ne.jp/user_image/7b/10/af9ef3972826cc757fa5b3c915e35768.png)
Nios IIへの割り込み信号となるaccum_intにはInterfaceとしてinterrupt_senderを
選びます.Signal Typeはirqです.
![](https://blogimg.goo.ne.jp/user_image/01/92/587c40aac5d292c0c99881afe218f76f.png)
最終的なSignalsのタブは,以下のようになります.これでエラーが2つまで減りました.
![](https://blogimg.goo.ne.jp/user_image/49/bc/5efa26b8f3c9cc31ba73f01ab99fc26a.png)
次に,Interfacesタブに移り,残りのエラーを解消して行きます.
まず1つめのエラーであるavalon_slave_0のAssociated Resetにreset_sinkを選びます.
![](https://blogimg.goo.ne.jp/user_image/64/79/3328d24853d9a4d819902f9e3550bd96.png)
続いて,interrupt_senderのAssociated addressable interfaceにavalon_slave_0を選択します.
![](https://blogimg.goo.ne.jp/user_image/29/e5/5432c10a19aec8d2f8ef1c1831a64ffc.png)
これでエラーがすべて消えましたので,Library Infoタブでコンポーネントの名称を入力して,
Finishをクリックします.
![](https://blogimg.goo.ne.jp/user_image/6e/76/5097dff64534683eda7ff51970c7a277.png)
Component Libraryには,新たにgps_basebandが追加されました.これをダブルクリックして
System Contentsに追加します.
![](https://blogimg.goo.ne.jp/user_image/21/ba/84195c775bffdbe64eeb6d6aefb7d01e.png)
他のコンポーネントと同様に,gps_0.clockはaltpll_0.c0に,gps_0.avalon_slave_0は
nios2_qsys_0.data_masterに,gps_0.reset_sinkはclk_0.clk_resetに接続します.
gps_0.conduit_endには,Exportの欄をクリックしてgps_0_conduit_endに設定します.
さらに,gps_0.avalon_slave_0のirqをnios2_qsys_0に接続します.割り込みの優先度は
jtag_uart_0より高く設定します.ここでは0を選びました.
Base adressは0x06000000としています.
![](https://blogimg.goo.ne.jp/user_image/39/ee/307a3fcd201b116e006f4ff846f6b0af.png)
これでシステムの生成ができます.GenerationタブでGenerationボタンをクリックしてください.
次に,GPSコンポーネントを追加したQsysモジュールを呼び出すように,DE0_Nano.vを修正します.
Simさんのサンプルとは異なり,.clk_clkにはフロントエンドのサンプリング信号であるGPIO_0_IN[0]が
接続されます.また,GPSモジュールの外部インターフェイスであるgps_0_conduit_endが追加されています.
sample_clk,sign_in,mag_inをそれぞれGPIO_0_IN[0],GPIO_0[1],GPIO_0[0]に接続します.
フロントエンド基板の回路図はこちら.
![](https://blogimg.goo.ne.jp/user_image/0a/0b/6b51948539abb6c358b8fb668bc079e3.png)
以上で作業は終了です.あとは論理合成をするだけ.
論理合成の結果を見ると,ロジックエレメントがまだ半分近く余っています.
![](https://blogimg.goo.ne.jp/user_image/11/7d/916962446461e479cca66bdc7a9f390f.png)
GPSモジュールのチャンネルを倍近く増やすことができそうです.すばらしい!
GPS+GLONASS受信機が作れると良いけれど,まだまだ妄想の域だな.
※コメント投稿者のブログIDはブログ作成者のみに通知されます