ラベル FPGA の投稿を表示しています。 すべての投稿を表示
ラベル FPGA の投稿を表示しています。 すべての投稿を表示

2016年6月5日日曜日

デジタルマイクが動かない(ESPとFPGAでクロック生成 )◀アナログ出てました

秋月のディジタルシリコンマイクモジュール(細ピンヘッダ版)を試してみました。

秋月のサイトより

このモジュールは1-3.25MHzのクロックを入れればPDMフォーマットでデジタルデータが取り出せます。PDMなのでローパスフィルタを通せばそのままアナログ信号として使えます。しかも300円。素晴らしい。

…しかし使えなければ意味がありません。結果として動作させることができませんでした。

今週は何をやっても動かないなorz

■追記6/6■

電子工作部の方から「LPFの出力をアンプに繋いでみたら何か信号出てるんじゃない?」というアドバイスをいただき、FPGAで作った1.25Mhzのクロックを入れて、LPF出力をカップリングコンデンサ経由で27dBのアンプにつないでみました。

そしたら!

小さいですが確かに音が出ています!! いえええええ!!! アドバイスありがとうございました。うれしー。小さすぎてオシロでは見えなかったけど、信号出てたのね。

というわけで、今週末はデジタルでの処理に再挑戦します。

それまでは以下のマイコンでの試行錯誤からFPGAでのクロック発生回路でアナログとしての取得に成功、最終的にデジタル信号として取り込みDACから音が出るまでのドタバタ劇をお楽しみいただければ幸いですw

■SPIでデジタル入力(失敗)■

今度はSPIです。SPIのクロックを1Mhzに設定し、SPI modeをいろいろ変えたりしてみたのですが、結果は似たようなもので値が123-127の間をパラパラ上下するだけでした。

#include <SPI.h>
const uint8_t BITS_COUNT_TABLE[256] = {
    0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,
    1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
    1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
    2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
    1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
    2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
    2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
    3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
    1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
    2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
    2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
    3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
    2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
    3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
    3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
    4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8,
};
int numofbits2(uint16_t bits)
{
    return BITS_COUNT_TABLE[((unsigned char*)&bits)[0]]
         + BITS_COUNT_TABLE[((unsigned char*)&bits)[1]];
}
void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  SPI.begin();
  SPI.setFrequency(1000000);
  SPI.setDataMode(SPI_MODE0);
  noInterrupts();
}
static int mabiki = 0;
void loop() {
  // put your main code here, to run repeatedly:
  int num = 0;
  for (int i = 0; i < 16; i++) {
    num += numofbits2(SPI.transfer16(0xffff));
  }
  char buf[6];
  sprintf(buf, "%4d", num);
  if (mabiki == 20) {
    Serial.println(buf);
    mabiki = 0;
  } else {
    Serial.print(buf);  
  }
  mabiki++;
}
なお、ビットカウントはこちらの記事から使わせていただきました。

テーブルを使う方法は思いついたのですが、そのあとに記載されているアルゴリズムは本当にびっくりです。1960年代のコンピュータサイエンスは凄まじいですね。

■GPIOでデジタル入力(失敗)■

GPIOでクロックを生成し、ポートを読み込んで積算する方法を試してみました。帰ってきた値は見事にデタラメでグラフ化しても波形になりませんでした。
#include <Arduino.h>
void setup() {
  // put your setup code here, to run once:
  Serial.begin(230400);

  pinMode(14, OUTPUT);
  pinMode(12, INPUT);
}
void loop() {
  // put your main code here, to run repeatedly:
  int count = 0;
  for (long l = 0; l < 1000; l++) {
    digitalWrite(14, HIGH);
    if (digitalRead(12) == HIGH) {
      count ++;
    }
//    else {
//      count --;
//    }
    digitalWrite(14, LOW);
  }
  Serial.println(count);
}

なお、コメントアウトの部分はLOWならデクリメント、というサンプルを見たので試してみたのですが…結果がマイナスに振れただけで同じでしたたたたた。

■マイコン発振 / アナログ出力(失敗)■

1MHz強のクロックを入れ、出力に約20khzのローパスフィルタ(R=1kΩ,1=10nF)を通してマイク前から信号を入れてみました。ローパスフィルタは出力端子>抵抗>コンデンサ>Gndとつないで、抵抗とコンデンサがつながっているところから出力取ります。1MHz強のクロックはESPを160MHzクロックで動かして、以下のプログラムで生成します。デューティー比50%にならないけど、気にしない。デューティー比を考えれば少しでも演算の早いshortの方が良いのですが、shortだと約32mSecごとにシステム?に戻ってしまうのでオシロで波形見るときに邪魔かなと。
#include <Arduino.h>
void setup() {
  // put your setup code here, to run once:
  pinMode(14, OUTPUT);
}
void loop() {
  // put your main code here, to run repeatedly:
  int count = 0;
  for (long l = 0; l < 1000000; l++) {
    digitalWrite(14, HIGH);
    digitalWrite(14, LOW);
  }
}

さて出力は…見事に直流です。本当にありがとうございましたorz

■FPGA発振 + アナログ出力■

最後にFPGAでちゃんとした1.25 / 2.5MHzのクロックを作って試してみます。でもまだちゃんと作る自信がないので、「FPGA電子工作スーパーキット」のp112ページからの手順やソースをまず動かして見て、そこにクロック生成を追加します(弱気

なお、同誌附属の基板はまだ組み立てていないので、BeMicro MAX10を使います。
  1. Quartus起動
  2. New Project Wizardでディレクトリ,プロジェクト名ClockGenを入力し、BeMicro搭載デバイスの10M08DAF484C8GESを選び、Finish。
  3. Fileメニュー>New...からVerilog HDL Fileを選びOK
  4. Velilogソースを打ち込む
  5. TasksのAnalysis & Synthesisを右クリックしてStartを選ぶ。エラーが出たら直してもう一度
  6. Assignmentsメニュー>Pin Plannerを選び、ピンを割り当てる(下図1)
  7. TasksのCompile Designを右クリックしてStartを選び、コンパイルし、「…Quartus Prime Full Compilation was successful」が出たらOK
  8. Toolsメニュー>Programmerで、Programmerを起動
  9. USB-Blasterが選択されていることを確認(表示されていなかったらHardware Setup...ボタンから選択ダイアログへ)
  10. Add Fileボタンをクリックし、output_filesの中のClockGen.sofを選ぶ。デバイスと書き込みファイルが表示される(下図2)
  11. Startボタンをクリック、瞬時に書き込みが終わり、LEDがチカチカ。


図1

図2
基本動作が確認できたので、2.5Mhzとその1/2, 1/4, 1/8のクロックをPMOD端子から出力するように書きなおします。
  1. QuartusのEntity欄でClockGenをダブルクリックしてVerilogソースを開きます。
  2. ソースを修正して保存します。
  3. 青の「▶」をクリックすると「変更するか?」と聞いてきますのでYES
  4. Full Compilation was successfulが出たらToolsメニューからProgrammer
  5. Startボタンをクリックしてコンフィグ(書き込み)
と、いうわけで、(少し)きれいな1.25Mhzと2.5Mhzが出ました。で、本題のデジタルマイクですが。同じです。ローパスフィルタを通しても何も出ません。

はい終了。

■FPGAのソース■



■最後に■

デジタルマイクは製品として販売されているからには、動くはず。でも何が悪いのかわかりません。もう涙も枯れ果てました…でもFPGAでクロック出すのはうまく行ったから良しとしよう(問題をすり替えてはいけません)。

続きはこちらをどうぞ。

Verilog:「-1」と「- 1」が違うなんて・・・

ツールに慣れるための素振りとしてFPGAでLチカやったんです。

そしたら、LチカどころかL(数分)チカになってしまいまして。何度見直しても違いがわかりません。原因がこの行なのは間違いないのですが。
assign period_1sec = (counter_1sec == (`CYCLES_1SEC -1);

ただ、defineをやめて
assign period_1sec = (counter_1sec == (48000000);
と書くとちゃんと動きます。
assign period_1sec = (counter_1sec == (`CYCLES_1SEC);
でも大丈夫。

そこで「-1」になっていたところを念のため「-<スペース>1」に変えてみたら…動きました。

うーん、「-<スペース>1」は1減算として動くようです。

となると「-1」って、何?

…調べても出てこないので当面は放置、そのうち文法書でそれについての記述に出会うことだろう(遠い目

いやー…辛いわー(笑顔

2016年5月31日火曜日

BeMicro MAX10にNios IIを入れてLチカ(part 2:完結編)


はい、続きです。せいぜい2時間もあれば終わるだろうと思っていたNios II Lチカで4時間かかってしまいました。初心者ってしんどいわぁ。

■STEP3' コンフィグ書き込み■

前回、これだけ終わってませんでした。ここで初めてBeMicroをの電源を入れると、赤い電源LEDが点灯し、緑のLEDが2進カウンタとして動き始めます。懐かしなー。

と、TK-80時代を振り返るのは止めて、まずVirtualBoxでDevicesメニュー>USB> Altera USB-Blaster [1000] を選びます。次にQuartusのToolsメニューからProgrammerを選びます。もしHardware Setup...のとなりが「No Hardware」になっていたら、Hardware Setup...をクリックし、USB-Blasterを選びます(Currently selected hardware)。私は最初ここのところにUSB-Blasterが現れない→Device>USBのところにもない→もしかしてUbuntu対象外??と焦ったのですが、単にハブが落ちてたようでMacを再起動したら治りました。MacOS X El Capitainにしてからこういうことが多くてホント不便。本社新築する前にちゃんとしてくださいよお>Apple

…と余談はさておき、あとは記事通りです。

記事通り、書き込みが100%()Successfulになっても何も起こらなければ正常です。前回も書いたように、まだソフトウェアを書いてませんので。

■STEP4 Cプログラムを書き込む■


  1. Quartus IIからNios II EDSを起動
  2. ソフトウェア・テンプレートを利用する
    原因はわかりませんがうちのUbuntだとメニューバーがありませんw 左から二番目の下向きの三角にカーソルを合わせると「New」だと言ってますので、ここから「Nios II Application and BSP from Template」を選びます。
    SOPC Information File name:の「...」をクリックしてプロジェクトフォルダ下のmaxlab.sopcinfoを選びます。あとは記事通りでFinishまで。テンプレートはHelloWorldの下にあるHello World Smallなのでお間違えなく。
  3. C言語ソースの中身を加速度センサ制御用に書き換える
    雑誌にはソース掲載されていないので、ダウンロードしたものからのコピーです。
  4. 作成したソフトウェアをFPGAで実行する
    やっと こ こ ま で 来 た か って感じ。まぁreset_reset_nが無ければ大変なことは何一つなかったのですがw ここはまったく記事通り。
    …なのですが、私の場合、ここで一晩経過して電源を引っこ抜いているので、上のSTEP3'に戻ってコンフィグ書き込みを行い、それからソフトウェア書き込みを行いました。
    するとLEDがたくさん点灯するはずです(なんだよ「たくさん」ってのはよ)。BeMicroの向きを傾けていくと、真横にした辺りでパッと消え、背面になるにつれてピコピコとLEDが増えていくはずです。

    うごいた!

と、いうわけで、Nios IIが動きました。ソフト屋な私はつい「やった! これで何でもできる!!」という方向に安易に走りがちなのですが、旨いこと使いこなして行きたいと思います。はい。

とはいえ、なんにもフィードバックがないと辛いので、とりあえずは液晶でもつないでみますかね。

…そのうちに。

…マイコン駆動で。

2016年5月26日木曜日

FPGA評価モジュール:BeMicro到着


基板を手に持つとずっしり重いです。多層基板でベタGND / ベタVccがあるから?ってことだけじゃないと思うけど、とにかく存在感のある基板っす。

FPGAを使ってみたいと思ったのは、高速性とか自由度などいろいろ理由はあるんですが、GPIOが多いというのが大きいです。

このBeMicro MAX10でもコネクタに出ているだけで
  • 2x40pinのピンヘッダ
  • 80ピンカードエッジ
  • 2個の2x6pin

…こんなにあります。もううんざりするレベル。

ピン番号が横に長いExcelのセル番号みたいになってますww

LPC1114で8x8マトリクスのLED駆動してI2Cつなぐと残りが足りないわー…

MSP430G2552で4桁の7セグLEDをドライブするともうI2Cしか繋げないわー…

とか言ってた人生がイヤになります(もちろんMSP430の超低消費電力はこのFPGAが太刀打ちできる世界じゃないですし、そういう人生好きですけどね)。

さらにGPIOが多いだけでなく、標準の状態で以下のようなデバイスが付いているので、USBつなぐだけである程度のことができてしまいます。

  • 8MB RAM
  • ADC
  • 温度センサー
  • 3軸加速度センサー(ADXL362)
  • CDS
  • LED 8個
  • スイッチ2個
  • オンボードプログラマ(USB Blaster)

これで4000円(chip1stop.com…入手先によって値段は違います)。もちろん難しいんですけど、マニュアルの通りにCPU(Nios II / e)を作りこんで、多少必要な回路をその周囲に貼り付けるぐらいであれば、mbedを扱える人ならそんなにハードル高くないと思います。

この基板にはついてませんが、個人的にFPGAで何とかしたいブツとして「CMOSカメラの接続」っていうテーマがあります。ずっと前にaitendoで1.3MのCMOSカメラを「安い!」って飛びついて買ったんですが、Arduinoや下位のmbedでは簡単に御せる世界ではありません(mbed LPC-4088で制御した作例は見たことありますが)。でもMAX10ならCMOSカメラからの出力が16ピンもあってμ秒単位でいろいろ処理しなきゃならなくても、ぜんぜん余裕な世界です。

…もちろん、使いこなせれば…の話ですけどね。

パッケージ

中身
がんばります!

2016年5月23日月曜日

FPGA学習で頭を抱える

ビールと棒々鶏とFPGA

トランジスタ技術2015年11号 p113に、16ビットのカウンタを2個使って32ビットのカウンタを構成する際の下位から上位へのキャリーの処理が以下のように記述されていまして。

CNT(15 downto 0) <= CNT(15 downto 0) + 1;
if (CNT(15 downto 0) = x"FFFE") then
  CARRY <= '1';
else
  CARRY <= '0';
end if;

これが"FFFF"との比較じゃなくて"FFFE"との比較で正しく動作する、というのがどうにも理解できなくて頭を抱えていました。記事には
・CNTとx”FFFE"を比較してCARRYを立てる回路
・CNTを+1する回路
は同時に実行されるので、これでうまく動くのです。
と説明されているのですが、少しデジタル回路をいじった経験からすれば、「下位のカウンタがFFFFから0000になるときにキャリーが1になるべき」で、いくらFPGAがソフトと違って同時に処理されるものだとしても、「今」の値がFFFFの時に「次」のキャリーの値が1になるんではないかなーという違和感が消えません。

そこで、いろいろキャリーの処理について調べてみました。結果、言語と構成は違いますが、以下の記事にこうなった原因と正しいやり方が出ていました。

触って学ぼう FPGA開発入門(6): 順序回路と組み合わせ回路を意識した記述を! (2/4)

トラ技の記事はキャリーの処理を順序回路の中に組み込んでしまったためにキャリー出力がラッチされてしまい、それを補うために1つ手前の値"FFFE"で比較してやらないといけない、ということのようです。

上の「触って学ぼう」の記事では回路図になっているので一目瞭然なのですが、トラ技の説明からはまったく理解できませんでした。というか「同時に処理されるので云々」というトラ技の説明は現象と結びつかない気がします。

いやー、ソフトウェアと違いますね。当たり前だけど。自慢じゃないけど、この落とし穴に何度も落ちる自信あります、私orz

2016年5月11日水曜日

Odyssey MAX10でLチカ



■いよいよ書き込み■


と続いてきました、いよいよ書き込みです。Quartus Prime Liteを一通り使ってみます。

マクニカさんの記事は「はじめての」と書いてあっても読んだ人間が操作に完熟しまくっていることが前提になっていますので、ちょっと大変です。大変苦労しましたが、いい勉強になります(いや皮肉じゃないよ…技術者ってマゾじゃなきゃやってられないし)

■Linux上での起動■

インストール先/altera_lite/15.1/quartus/binにパスを通すか、毎回このディレクトリへcdで移動して quartus とタイプします。何かエラーが出るんですが、良いんでしょうか。
koichi@koichi-ubuntu:~$ quartus
Inconsistency detected by ld.so: dl-close.c: 762: _dl_close: Assertion `map->l_init_called' failed!

■プロジェクトを作る■

Quartus Prime Lite IIを起動したら、ファイルメニューからNew Project Wizard...を選び、プロジェクトを作るディレクトリとプロジェクト名を入力します。私はディレクトリ名プロジェクト名トップデザイン名を「MacnicaBlinky」にしました。


Nextをクリックします。「Project Type」画面、ここはEmpty projectのまま、Nextをクリック。「Add Files」画面も何も触らないでNext。

次のFamily & Device Settingsは大事です。Familyはもちろん「MAX10なんたら」を選びます。まだまだリストには大量にチップが並んでます。絞り込みたいのですが、上記ページどころかマクニカのサイトのあちこちを探してもOdysseyに搭載されているMAX10が「10M08だ」としか書いてありません。それだけでも何個もあるっちゅーねん(怒)。FPGAマガジンのNo13に「10M08SAU169C8GES」とあったので、それを入力します。めでたく選択肢が一個になったのでNextです。いやはや。



Summary画面です。内容を一通り確認して「Finish」をクリックします。




■VHDLを打ち込む■

Fileメニュー>New...を選びます。Design Files下の「VHDL File」を選びOKをクリックします。



エディタが開くので、記事のソースをコピペします。なお、13行目あたりの代入文で「<=」であるべき箇所が「<=」になっていますので、全角の<を半角に直してください。真面目にWeb作れよなぁ、マクニカ(すっかりタメ口にw

…と、その貼ったソースもいろいろ見えない文字が埋まってたりで使えないので、掃除しました。また、entityの名前もプロジェクト名と一致させないとダメっぽいので、それも合わせてあります。

library ieee;
use ieee.std_logic_1164.all;
entity MacnicaBlinky is
port (
    BUTTON : in std_logic;
    LED    : out std_logic
    );
end MacnicaBlinky;
architecture rtl of MacnicaBlinky is
begin
    LED <= BUTTON;
end rtl;

■入出力ピン割り付け■

ここからは「トランジスタ技術2015年11月号」の特集第二章を参考にします。この記事ではテンプレから操作を追っていくのですが、苦労してVHDLを貼ったので、設定はマクニカ、操作はトラ技…というクロス技で進めていきます。

マクニカには「PB0 はK13ピン、LED0 はL13ピン」と書いてあります。

なお、マクニカの「はじめてガイド ピン・アサインの方法」によれば、「2.2.データベースの構築」というところに「ピンをアサインする前にデザイン情報を作成しておくと…とても便利です」と書いてあるので、従います。Processingメニュー>Start>Start Analysis & Elaborationを実行するとno erro / ワーニング1個だけになるはずです。

ということで、ピンの割り付けに戻ります。資料は「はじめてガイド ピン・アサインの方法」の「3.ユーザーピン アサインの方法」に戻ります。

Assignmentメニュー>Pin Plannerを選びます。

よくみかけるあの画面が出てきました。



下の一覧から上のマトリクス上にドラッグ・アンド・ドロップしてつなぐようです。「PB0 はK13ピン、LED0 はL13ピン」ですが、PB0は一覧表ではBUTTONとなっています。まずBUTTONをゆっくりドラッグしてK13のあたりでウロウロしていると黒いダイアログにK13についての説明が出てきますので、手を離します。同様にLEDをL13で。

表のI/O Standardのところをダブルクリックしプルダウンから「3.3-V LVTTL」を選びます。似たようなのが多いので間違えないように。間違えるとハード的に破損します。

■コンフィギュレーションモードを選ぶ■

「MAX 10 の CFM をどう使うか=何モードを選ぶか、になるのですが、今回は Single Compressed Image を選択します。」って書いてあるんだけどー、それはどこですかー。と喉から血を吹き出しながら叫んだら、見つかりました。

Assignmentメニュー>Device



真ん中へんにあるDevice and Pin Optionsボタンをクリックします。



左のCategoryで「Configuration」を選び、右のConfigurationのConfiguration modeのプルダウンを「Single Compressed Image(1376Kbits UFM)」」にて、OKをクリックします。




■論理回路に対するタイミング制約 ■

元記事に「論理回路に対するタイミング制約を作成&設定します。 今回はクロック制御とは無関係で、スピードを必要とする論理回路ではないですし、Pin to Pin の単純動作なので、省略します。」とあるので省略します。

■コンパイル■

Processingメニュー>Start Compilationでコンパイルを開始すると下のメッセージ欄にたらたらメッセージが出てくるのですが、毎回この表示が出て少し止まるのでちょっとココロがくじけますが、影響ないので終了を待ちます。



終わりました。


元Java屋としてはワーニングが大変気になるところですが。エラーはでていないので、気にしないことにします。

■タイミング検証■

「今回は上記の手順③-3で述べた理由から省略します。」だそうです。

■プログラミング(書き込み)■

プロデューサーさん、プロデューサーさん、ついに書き込みですよ書き込み!

…すまん。ついやってしまった。デレマスは渋凛一択だけど、アイマスとしては765プロの面々の方が好きだな。

さて、それはともかく。

あちこちひっくり返しても、接続する順番とかJTAGコネクタの向きが見当たりません。ググってやっと見つけたのがこの記事(プログラミング)。ありがとうございます。以下の作業はこの記事を参考にさせていただきました。


写真のように赤い線の向きを合わせてBlasterのケーブルを刺します。初回だとちょっと硬いかもしれませんが、根元までしっかり挿しましょう。悟空にもUSBケーブル(mini USB)もつなぎ、Odysseyにもmicro USBケーブルをつなぎます。VM上で使っている方は、VMがちゃんとUSB Blasterを認識しているか確認しておきましょう(経験者は語る)。

Toolsメニュー>Programmerを選びます。



Hardware Setup...をクリックしてCurrently selected hardwareでUSB-Blaster [1-2]を選択してCloseボタンをクリックします。


もう疲れたので、記事をそのまま引用します
4.ハードウェアにプログラミングするconfigのファイルを指定します。[Add File..]ボタンをクリックします。プロジェクトフォルダ配下のoutput_filesフォルダにconfigファイルがあります。テストの用途では拡張子がsofのファイルを選びます。

私の場合は「MacnicaBlinky.sof」を選び、Openボタンをクリックします。



なお、スクショ撮り忘れたからって同じ操作をもう一回やるとこんな画面になってしまいます。


二行目を右クリックしてDeleteすれば戻ります(ちょっと焦った)

さて、いよいよです。「Start」ボタンをクリックします。結果は右上のマドに出るのですが「Failed」でした。「プログラミング」を拝見したら、OdysseyにもUSBつなぐんですね。はっはっは。


ではケーブルをつないで、改めてStart。「100% (Successful)」キター!!

■動作テスト■

これでFPGAが俺様の回路になりましたw テストボタンを押せば、1000千万桁の円周率が算出されます!…なんてことはなく、押している間だけLEDが1個点灯します。ぽちぽち。ボタンとLEDを直結すれば5分もかからない、とか言ってはいけません。

いろいろ回り道をしましたが、ともかくOdyssey MAX10で入力と出力と回路を作ることができました。

いい加減なWeb資料を公開してくださったマクニカにも感謝します。ブログには全部書いてないけれど、回り道して調べまくって、すっげー勉強になりました。いや、でも、調べられることであれば、アウトラインでもいいから一連の処理手順が公開されているって大事なことですよね。いやマジで。今後もよろしくお願いします。

あ、お笑い系テクニカルライターの御用があれば、おこえかけてくださいねw

悟空USB BlasterをMacOS上のVirtualBox上のUbuntuで。


Power LEDの豪快なズレなど全然気にならない1200円

USB BlasterはUSBからFPGAに書き込みをするためのアダプタ。Alteraの正規品は10万円ぐらいするけど、この互換品は1200円。Amazonでレビュー1件しかなかったけど、たくさん買ってちゃんと動いたって書いてあったので、買いました。

■Ubuntu上でUSB Blasterを認識させる■

MacOS X El Capitan 10.11.4、VirtualBoxのバージョンは5.0.20、ubuntuは14.04 LTSです。Quartus II Prime Lite Edition 15.1を入れてあります。

まず、VirtualBoxのDeviceメニュー>USB>Altera USB-Blaster [0400]を選択して、Ubuntuがデバイスを認識できるようにします。

Quartus / USB Blasterの設定はここを参考にしました。

まず設定ファイルを書きます。ターミナルを起動して
sudo vi /etc/udev/rules.d/altera-usb-blaster.rules
iをタイプしてから以下をコピペ
ATTR{idVendor}=="09fb", ATTR{idProduct}=="6001", MODE="666"
:wq<return>で保存。もちろんvim以外のエディタでもOKです。

Quartusを起動します。
cd <インストールディレクトリ>/altera_lite/15.1/quartus/bin
./quartus
Toolsメニュー>ProgrammerでProgrammerを起動


画面上の「Hardware Setup...」をクリック


Currently selected hardware:で「USB-Bluster [1-2]」を選び、Close
「Hardware Setup...」ボタンの右隣りが「USB-Bluster [1-2]に変わります。

■追記 5/11■

やっとQuartus Prime Lite on Ubuntu on MacでLチカまでたどり着きました。


2016年5月7日土曜日

Odyssey MAX10評価キット:開封編


このごろの新しいおもちゃ興味の中心はFPGA、というかAltera MAX10です。

附属基板をちゃんと動かすのは面倒くさいからBeMicroで勉強するつもり

さくっと動かして実験するにはBeMicro MAX10というボードがコストパフォーマンス的(Chip1stopで4000円)にも規模的(FPGA上にマイコンチップを合成してまだ余る)にも使い勝手(USBつなげばプログラム可能)もよさ気ですが、まずは「Odyssey MAX10 FPGA and BLE Sensor Kit」というやつを買ってみました。

これは、FPGA MAX10と各種センサーの乗っかったBLEマイコンがセットになっているもので、iPhone/Androidの専用アプリからプリセットされた数種類の回路?を選んでFPGAをプログラミングし、動作させることができる、というものです。回路?は、もちろん自分で設計製作してダウンロード?したものも動かすことができます。キットにプリセットされた回路?や自分でプログラムする回路?はpersonalityと呼ばれています。

※「?」が多くてすみません。
 まだFPGA習い始めたばかりなので、用語に馴染めていないのです。

センサーとしては、マイク、温度、湿度、照度、加速度、DACがついていて、他にLED8個とスイッチ2個を使うことができます。

■使ってみる■

届いたのはプラスチックのケース。


開けてみると思っていたより小さいです。mbed LPC1768と同じぐらい、といえば電子工作方面の方には通じるでしょうか。Arduino Nanoより少し長いです。


クッションに2つのブツが。左のキーホルダー状プラスチックケースに入っているのはBLEマイコン用の電池ホルダーです(袋にワッシャが同梱されていますので開封時に無くさないようにご注意を)。右はFPGA+BLE基板が2階建てになっています。電池ホルダー基板+BLEマイコンだけで使う場合には、この2階建てをバラす必要がありますが、ピンセットで返しの部分をつまむと比較的簡単に外れます。ピンセットの先で基板を傷つけないようにご注意を。

準備としては
  • https://odyssey.m-pression.com/でユーザ登録
  • iPhone/Androidアプリをダウンロードし、上で登録したアカウントでログイン
  • マイクロUSBケーブル

あたりが必要です。

さっそくOdysseyにマイクロUSBを接続し、iPhoneアプリを立ち上げると、BLEのペアリング画面になります。すぐに見つかると思いますので、選択します。



するとPersonality Listが出ます。



まず「ADC and Audio Monitor」をタップします。



この時、OdysseyのUSBコネクタ近くの緑LEDが点灯しています。これは選択したPersonalityをFPGAにプログラミングしていることを示すもので、これが終わるまでiPhone画面を操作しても反応しません。LEDが消えた時点でスマフォで「ADC on」をタップし、Odyssey近くで音を出すとUSBの反対側にある緑LEDラインが音の大きさに比例した長さで点灯します。

同様に、温度&湿度、加速度、照度…などいろいろありますので試してみましょう。

なお、iPhone上の画面はWeb上でカスタマイズ可能です。配置や項目などを入れ替えることで、センサーなどに合わせたアプリとして構成することができます。例えばボタンを配置し、I2Cへのコマンド(アドレス、レジスタ番号、書き込み値、データ長など)を指定すれば、スマフォ上のボタンをタップ→BLE経由でOdysseyへ→MAX10のI2Cラインに信号を出力→結果を逆ルートでスマフォへ、という動作をします。

必ずしもすべてのI2Cデバイスに対応できるわけではないですが、よっぽどへそ曲がりなデバイス出ないかぎりは対応できそうな感じです(まぁI2Cは大抵ヘソ曲がってますけどね)。


■感想■

FPGA初体験なのですが、いやー、TTL ICにラッピングで配線して間違えたりショートしたりして苦労してたのがウソみたいに回路できちゃいますね。魔法みたいです。もちろん今までの回路図のかわりにVHDLやVerilog HDLなどとの戦いが待っているわけですが(回路図を書いていくこともできます)。

さて、明日はチュートリアルに従ってVHDLかVerilog HDLをコンパイルし、組み上がった回路をOdysseyにダウンロードして実行してみたいと思います。

当面の目標は、もちろんデジタル時計です(笑)。

■参考書など■

  • トランジスタ技術 2015年 11月号
    特集「FPGAキットで体験!チップ内電子工作」
    FPGA電子工作として、いろいろな事例が具体的に紹介されていて勉強になります。
  • FPGAマガジン No.13
    特集「入門もホビーもピッタリ! ワンチップFPGA=MAX10」
    MAX10の概要を把握したりカタログ的な意味では役に立ちましたが、表面をさらっとなでた感じの記事が多いのでちょっと不満。
  • (1)MAX10(2)ライタ(3)DVD付き! FPGA電子工作スーパーキット 
    記事は入門書として素晴らしいと思います。なおCQ出版お馴染みのマルツで部品を買い足さないと動かない基板が同梱されていますが、買い足す部品を合計するとあんまり安くないのでBeMicro MAX10を買った方が手っ取り早いと思います。ライタも悟空 ALTERA USB Blaster互換JTagケーブルが1200円ですしね。
  • HDLによる高性能ディジタル回路設計
    今の私には少し歯ごたえがありすぎるのですが、従来の回路設計の延長ではないFPGAとしての回路設計はどうあるべきかという観点から記述されているので、ソフト屋の私にはむしろ理解しやすいです。

2016年5月3日火曜日

MacでAlteraのQuartus Prime Liteを動かす(Ubuntu上

コンパイル通った記念w

FPGAやりたいけど開発ツールがWindows、というのがネックになって手を付けておりませんでした。いや、言い訳じゃなくて、そんだけWindowsが嫌い。Windows+Eclipseはもっと嫌い。Windows+Eclipse+Strutsはそれだけで退職しようかと思うレベルで嫌い。

…と、話が逸れましたが。

Linux版があるのは知ってたんですが、死ぬほど苦労した末にビルドを通してやっと半分ぐらいの機能が使える…というを印象があって敬遠してました。でも、今どきはそんな苦労しなくてもインストーラからさくっと使えると風のウワサに聞きまして。

というわけで、VirtualBoxにUbuntuを入れ、その上でAltera社のFPGA「MAX10」シリーズを使うための開発ツールQuartas Prime Liteを入れてみました。

まずVirtualBoxをインストールし、その上にUbuntuをインストールします。ちょっと古いけど、この記事を参考にしました。ありがとうございます。VirtualBoxには8GB割り当てています(母艦はiMac 5k, 3.2 GHz Core i5, 24GB, 外付けのSSD)。バージョンなど読み替えつつインストールしてください。なお、Quartus Prime Liteはダウンロード10GB+インストールサイズ20GBの合計30GBは食いますので、最初からその程度の容量+30GBぐらいは確保しておきましょう。
MacのVirtualBoxにLinuxのUbuntuをインストールする方法

私は上記で50GBしか確保しなかったら、スペースが足りないと言われてしまい、MAX10以外のデバイスをカットしてようやくインストールできました。これでは空きがギリギリになってしまうので、以下の手順で仮想マシンのディスク容量を確保しました。

Altera.comでユーザ登録をしてからダウンロード。死ぬほど時間がかかりますが、大人しくひたすらダウンロード。

ダウンロードしたらダウンロードディレクトリにある「Quartus-lite-15.1.2.193-linux.tar」をダブルクリックし、アーカイブマネージャで開き、さらに右クリックして解凍します。解凍し終わったらターミナルを起動し、ディレクトリを移動して ./setup.sh でインストーラを起動します。あとは画面の指示に従っていけばOK。

インストーラの最後で「デスクトップにアイコンを置く」っていうチェックボックスがあって、その方が便利なのでオンにしたのですが、何故かアイコンが残っていません。ぜひインストール完了時にQuartus Primeを起動してランチャーに登録しておいてください。あたしゃ起動の方法がわからなくて、結局インストーラをもう一回走らせるはめになりました。

ともかく、これで準備OKです。おお早朝始めたのにもう夕方だ…まぁ大部分はインストール待ち時間だったのですが。


その後、岩田利王さんのチュートリアルを参考にLチカを記述して、なんとかコンパイル通すところまでたどり着きました。すっかり夕食の時間です。

これで、フライングで注文してしまったMAX10がムダにならないで済みますw しかし、考えてみりゃ連休明けまで届かないですよね、今日頼んだものってorz

■追記 5/11■

やっとQuartus Prime Lite on Ubuntu on MacでLチカまでたどり着きました。