読者です 読者をやめる 読者になる 読者になる

できないことはできない

ただのメモの置き場所

QsysとNIOS2とuClinux

時間ができたので1年ぐらい前にやろうと思ってたことを再開してる。

 

NiosIIでuClinuxを起動する。Arria10で。

だいたい起動させてる人ってDE0だからCyclone III ばかりでVシリーズがちらほら。

 

 

以前やろうと思って調べたときに、Qsysになってからブートデータを生成するために必要なファイルが生成されなくなってしまった、と目にしたので諦めたけど、よく調べてみると変換ツールがあるらしい。

How to boot uClinux on Altera NIOS II Processor with MMU

 

ということで、やってみることに。

 

必要なファイル類は、

http://gihyo.jp/book/2011/978-4-7741-4839-7/support#supportDownload

 

Qsys用の変換ツール(Sopc2dts)はこちら。

http://ftp://ftp.altera.com/outgoing/nios2-linux/

 

上記のvmwareFedoraをインストールして進めていったら、

uClinux-dit内でmake menuconfigしたらエラーで進めず。同じような内容の解決法を紹介してるブログを発見。

uzusayuu.hatenadiary.jp

うーん。構造体の宣言のコピペする場所が全然わからなくて、自分は解決せず。

 

 

FPGAの部屋 DE0でuClinux 1(uClinxとツールチェーンのダウンロード)

困ったときのFPGAの部屋を覗いたら紹介されてた。

同じくUbuntu11.10をインストール

レポジトリが古くてgit-coreがインストールできなかったので、/etc/apt/source.listファイルを編集。

./checkoutして、uClinux-ditに入ってmake menuconfig

f:id:i8087:20170216102003p:plain

fedoraで3時間ぐらいハマったけど、なんとかできて良かった。

個人的にfedoraで何かやろうと思っても何もうまくいかないので良いイメージが無い。

 

とりあえずやり方がわかったのでQsysをポチポチしようと思う。

つづく。

Arria10でのI2Cのトライステート

動作実績のあるI2Cコントローラで躓いたのでメモ。

全然ackを返してくれなくて苦戦してたら、別件でalterawikiを見てたときに以下のページを発見。

I2C (OpenCores) - Altera Wiki

そしてAlteraのページに飛んだらナンダカ解決方法っぽいものが。

Warning (12620): Input port OE of I/O output buffer is not connected, but the atom is driving a bi-direct

Why does my bidirectional pin drive out '1' instead of 'Z' when the data port is connected to a constant zero in my design?

つまりハイインピーダンス出力'Z'が'1'出力になってしまうというものらしい。

はい、これでした。動かなかったコントローラはackのときに'Z'にしてたので、デバイスが0に引っ張っても、FPGAから'1'をドライブしてしまうので、コントローラはackエラーと認識してしまってました。

ただこれですんなり解決するかと思ったら、AlteraのGPIOモジュールのINOUTシグナルはTOP直下でないとエラーになってしまう・・・。

イライラしながらportmap宣言の部分とかを修正したらやっと動きました。 めでたしめでたし。

VHDLのクロックイベント

会社に入る前はVerilogしか扱ってなかったけど、会社の公用語?がVHDLなので入社して1年間VHDLをずっと使ってきた。
宣言の仕方とか細かな文法は違うけどほとんど違和感無く使えるようになった。

でもその中でもかなり違和感があったのはクロックイベントの書き方。

verilogだとこう。

always @(posedge CLK) begin
 A <= B;
end

でもVHDLだとこう。

process(CLK) begin
 if(CLK'event and CLK = '1')then
  A <= B;
 end if;   
end processs;

長くね・・・?と思ったのが第一印象。でもどこを見てもこう書いているし、こういうものだと思って1年間使ってた。

しかーしAlteraのQuartusの記述テンプレートをたまたま見たところ、

process(CLK) begin
 if(rising_edge(CLK))then
  A <= B;
 end if;   
end processs;

という記述が・・・。知らなかった。

今度からこっちを使おうっと・

MAX10でNiosを動かす

ALTERA MAX10 NIOS

さてNiosを動かします。

AlteraのFPGAは最近触り始めたばかりなので、Niosのことはよくわからないけどいろいろやってたら動いたのでまとめてみます。

XilinxMicroblazeはI2Cを動かすためだけに1度だけ使ったあの経験が役に立ったのか立たなかったかは謎。

今回はNiosでLEDをチカチカさせます。マクニカのブログを見ながらやった時に気になったことなどをちょこっと書きつつ。

Qsys編

QuartusのQsysを起動してポチポチやります。追加するIPはマクニカのOdysseyのブログを参照しましょう。 基本的にデフォルトでだいたいOKなのですが、on chip memoryだけはデフォルトのサイズだとNiosの実行ファイルが入りきらないので適当なサイズにする必要があります。これはクソ仕様だと思う。

f:id:i8087:20160502213410j:plain

XilinxXPS or IP IntegratorでMicroblazeを作ろうとするとある程度の構成を提示してくれて、それを自分でカスタムすることができたけど、 Alteraはイチからポチポチやらないとダメっぽい。意外と面倒だし接続ミスが極稀にあるからやっぱりXilinxの方が好き。

あと割りとイライラしたのは、ポチポチやったけどナンダカエラーが消えないことがたまにある。そんなときはF5を押して更新すると消えることがある。多分再読み込みをするんだと思う。

上図のエラーはそれとは関係なく、単にBase Addressが設定されていないだけ。どうしてもこのアドレスを使いたい、ということがなければ自動的に割り振りましょう。

上のメニューバーの「System」→「Assign base Address」で自動的に割り振ってくれます。 f:id:i8087:20160502214510p:plain

実行後。まだエラーが残っています。 f:id:i8087:20160502214654j:plain

これはNiosの設定でResetがかかったときにどのアドレスから開始するのか指定されていないというエラーメッセージ(だと思う)。

Niosの設定画面を開いてOn Chip Memoryを指定しましょう。 f:id:i8087:20160502214909p:plain

エラーメッセージが無くなってQsysの構成は完了です。Saveしましょう。 f:id:i8087:20160502215158j:plain

この作成したQsysのプロジェクトをインスタンスするためにGenerateします。Qsysウインドウの右下のGenerateをポチッと。ラッパーデザインやSimulationファイルや合成に必要なファイルを生成してくれます。

f:id:i8087:20160502215517j:plain

エラーがでたら残念。どこかで良くないことをしています。エラーメッセージを見ながら頑張りましょう。

Qsysをインスタンス化する場所に書きましょう。

u0 : component nios_m10
port map (
 clk_clk                            => CLK,  -- clk.clk
 pio_in_external_connection_export  => PB0,  -- pio_in_external_connection.export
 pio_out_external_connection_export => LED1  -- pio_out_external_connection.export
);

これでHDL側は終わり。

おまけ:Niosの実行ファイルの埋め込み

順番が前後してしまうのですが、次で説明するNios EDSで作成した実行ファイルのようなもの(メモリの初期値:.hex)をQuartusでコンパイルするときに自動で読み込んでsofファイルに埋め込んでくれるやり方があります。

ネットにごろごろ転がっているNiosの作成方法だと、Quartusの「File」→「Convert Programming file」でhexファイルを指定して・・・という方法が紹介されているけど、これだとコンパイルする度にやらないとダメので面倒。

そんな面倒なことはしたくないので、自動で生成するようにします。 Qsysでon chip memoryの設定画面を開きます。 f:id:i8087:20160502220940p:plain 下の方のMemory Initializationで、Initialize memory contentをチェックします。これでOK! 自動でNiosのプロジェクトの出力ファイルの場所を探してくれるみたいですが、Alteraはまだ全然信用していないので、自分で指定します。Enable non-default initialization fileをチェックしてmemory_initの下にあるhexファイルを指定します。

あとはQuartusでAssemblerをしたときに生成されてるpofファイルを書き込んで上げればOK。これはMAXだけじゃなくてPROMでも使えるはず。

Xilinxはプロジェクトにelfファイルを追加するだけで全部やってくれるんだけどね・・・。Nios周りは本当に残念なところが多い。

Nios EDS側

QsysからでもQuartusからでも直接プログラム一覧からでも良いのでNios EDSを起動します。Nios EDSという名のEclipseが立ち上がります。

File→New→Nios II Board Support Packageを選択。 f:id:i8087:20160502222124p:plain ちなみにBoard Support Package(BSP)が先ほど作成したQsysのIPコアのファイルやBase Addressなどが入ったものになります。そのBSPでこれから作成するアプリケーションが動くイメージです。

後はウィザードを進めていきます。 f:id:i8087:20160502222652p:plain Project neme:適当 SOPC Information file name:先ほど作成したQsysのファイル 後はそのまま。

「SOPC Information file name」に作成したQsysのファイルを指定すると「CPU:」の部分がQsys内で指定したniosの名前になっていると思います。

f:id:i8087:20160502223015p:plain

適当にHello Worldを。 f:id:i8087:20160502223026p:plain

f:id:i8087:20160502223113p:plain

hello_world.cを編集します。詳しくはマクニカのodysseyブログで。 完全にコピペするだけ。で、Shift+F9でビルドします。 f:id:i8087:20160502223316p:plain

するとエラーがでます。よく読んでみると、メモリが足りないっぽい。このブログの最初の方でクソ仕様と言ったデフォルトのon chip memoryのサイズのことはこれです。 f:id:i8087:20160502223414p:plain 3672Byteオーバーフローしてると言っているのでon chip memoryのサイズを4KByte+3672Byte=7672Byte以上にする必要があります。

Qsysに戻って値を修正。 f:id:i8087:20160502223935p:plain ちょーてきとーに1024x10KBにします。 設定したらsaveしてGenerateします。

Nios EDSに戻って再度コンパイル。 の前にBSPを再読込します。BSPにマウスを合わせて右クリック、Nios II→Generate BSP Qsys側に変更があったら必ず実行してください。じゃないと漏れ無くエラーになります。 f:id:i8087:20160502224315p:plain

気を取り直してShit+F9でビルド。無事ビルドできました。 f:id:i8087:20160502224439p:plain

Run ConfigurationsでUSB Blasterを認識させます。Refresh ConnectionでOK。 f:id:i8087:20160502225217j:plain

わかりにくですが、LED0が前回の記事のカウンターの値で光るLED、LED1がNiosを経由して点灯させたLEDになります。 f:id:i8087:20160502225147j:plain

ちゃんと光りました。めでたしめでたし。


niosがちゃんと動いたし、実装基板が来るまでのデバッグはこのOdysseyでやると格段に効率上がりそう。 というか現在進行形でやってるけど、かなり良い感じ。MAX10のサイズ的に全てのモジュールは同時に入らないけど、個々モジュールの検証ならできるので、かなりいい感じ。ただModelsimの使い方が分からなくて実機に逃げただけだけど・・・。

MAX10でLチカ

MAX10 ALTERA

マクニカのodysseyでLチカをやってみよう。

まずAlteraのホームページから開発ツールの「Quartus Prime(Quartus Ver.15)」をダウンロード。MAX10のデバイスファイルも忘れずに。

早速起動して、プロジェクトファイルを作ります。

f:id:i8087:20160427195730j:plain

適当なプロジェクト名を付けて次に進みます。

f:id:i8087:20160427195834j:plain

odysseyのMAX10は「10M08SAU169C8GES」です。そうES品なのです。

プロジェクト作成ウィザード終了後、HDLを記述します。 f:id:i8087:20160427200435j:plain

library ieee;
use IEEE.std_logic_1164.all; 
use IEEE.std_logic_unsigned.all;

entity odyssey_m10 is
   port (
      CLK       : in  std_logic;
      PB0       : in  std_logic;
      LED0      : out std_logic;
      LED1      : out std_logic
   );
end odyssey_m10;

architecture rtl of odyssey_m10 is 

   signal   counter : std_logic_vector(23 downto 0) := (others=>'0');
    
begin
   
   process(CLK) begin
        if(rising_edge(CLK)) then
            counter <= counter + '1';
        end if;
    end process;

    LED0 <= counter(23);
    

end rtl;

ただクロックの立ち上がりでカウンターの値をインクリメントするだけの単純なデザインです。
クロックはOdysseyの場合、基板上に50MHzの発振子があるのでそれを使います。 223クロックサイクルごとにLEDが点滅させます。

記述はここまで。Analysis&Synthesisはこれでパスできるはずです。


次はPin PlannerでFPGAのI/Oを指定します。

f:id:i8087:20160427201355j:plain

プロジェクト作成ウィザードで「10M08SAU169C8GES」を指定してるので、上のキャプチャのようなものが表示されるはずです。
このPin Plannerの図はFPGAを上から見た(Top View)ピン配列になっています。
今回指定するのはCLK、LEDです。おまけでプッシュボタン(PB0)も指定しちゃいましょう。

・CLK:F13
・LED0:L13
・PB0:K13
(I/O Standerdはすべて3.3V LVTTL)

odysseyの回路図は公開されています。↓のリンクの「MAX 10 FPGAボード回路図」

Odyssey MAX 10 FPGA & BLE Sensor Kit - Mpression

使用するLEDやPBを増やしたり、バンク電圧を確認するときにはこの回路図を見ればOK。


Fitterを実行して、Assemblerも実行しちゃいましょう。

f:id:i8087:20160427202245j:plain

エラーが無いことを確認してFPGAにデータをProgramします。

Program Deviceを開いて、sofファイルを書きます。Program Deviceが立ち上がったら、Add Fileでsofファイルを指定します。

sofファイルは"(プロジェクトファイルの場所)/Output/***.sof"にあります。

f:id:i8087:20160427202506j:plain

追加すると↑のようにMAX10の絵がポコっと出現します。あとはUSB Blasterを繋いでStartするだけ。USB Blasterのドライバーのインストール方法はここにかいてありました。

www.altera.co.jp

f:id:i8087:20160427202914j:plain

f:id:i8087:20160502230556j:plain 光りました。 非純正のterasic製のUSB Blasterでも無事書き込めました。めでたしめでたし。

次はこのプロジェクトにNiosを追加してみます。

FPGAマガジンの

MAX10

FPGAマガジンの最新刊No.13がMAX10特集だったので、ちょうど良い時期だったし買ってみた。
目次を見た時からちょっと期待はずれの予感はしてたけど、内容を見てみたらやっぱり期待はずれだったなー。これが2000円の本かあという感想・・・。

store.macnica.co.jp

Odysseyを買う予定なら、確実にマクニカの人が書いた記事のほうが必要な情報だった。

トラ技の2016年4月号増刊号の「MAX10-FB(FPGA)基板」ってのもあるみたい。 でもこっちは3.3Vの供給が必要なので、

・自分で+3.3Vを用意する
・+3500円を出してUSB-JTAG変換基板 MAX10-JB(JTAG)基板を買う

のどちらかが必要。 そのまま使えたOdysseyの方がコンパクトだし好きだな。特価なら5000円だったし。ただUSBブラスターと同じ機能を持つというJTAG基板は欲しかったかも。

でもMAX10自体はどちらも10M08なのでどっち買っても良いと思う。拡張性はトラ技の方があるし、いろいろやりたいって決まってるならそちらがおすすめ。ただどっちも5000円程度なのでどっちも買うってものありかも。特に必要になることはないけど複数のMAX10間で通信していろいろやってみたい。

ただしMAX10はなんだかんだ言って一番小さいクラスのFPGAだし、その中でも10M08かなり小さいので、使い始めてみると、あっという間に容量不足ですと怒られてしまうのが難点。Niosとsignaltapを入れたら、それだけでかなりカツカツで現在進行形で困っている。

この次からはそんなMAX10にNiosを入れる方法をまとめていこうと思う。

MAX10の評価ボード

MAX10 ALTERA

MAX10の評価ボード「odyssey」がやすかったので買った

store.macnica.co.jp

AlteraのFPGAは使ったことなかったけど約5000円だったので、飲み会一回行ったと思えば安いもんだなと思い購入。
なんかスマホでいろいろできるみたいだけど、そっちはあまり興味が無い。
マクニカの人が丁寧に解説している記事があるのが決め手だったかな。Alteraは使ったこと無いのでちょっと心配だった。

後で必ず必要になるのでJTAGケーブルも購入。でも正規品は高いのでterasicのものを。

Terasic USB Blaster(1-TB1) ALTERA USB Blaster互換品

Terasic USB Blaster(1-TB1) ALTERA USB Blaster互換品

正規品の約1/3のお値段。千石や秋月なら1万円切っているで1000円でも安く買いたいならそちら。amazonのレビューで「マニュアルがないから扱いが難しい」みたいなことを言ってる人いたけどこんなものにマニュアルなんて必要か? 1ピンの位置だけ分かればいいような。

このデバイスを使っていろいろ手こずったり困ったことをブログの記事にしていこうかなと考えてます。