« 2018年11月 | トップページ | 2019年1月 »

2018.12.31

2018年を振り返って

今年1年を振り返ってみます。

1月

  • 電子回路経営者懇談会を開催
  • ZYNQ小冊子を作り、Zynqberryスタータキットを発売
  • Trenzセミナーを開催
  • MITOUJTAG Pro 3.2をリリース
  • FPGAカンファレンスに出展

2月

  • 自動見積もりフォームの開発
  • HyperFADCの新基板設計
  • Cosmo-Z MiniのUbuntu Linux作成

3月

  • HDMIミキサー基板が動作開始
  • Cosmo-Z Miniのブラッシュアップ
  • HyperFADCの特性測定
  • LFSRで変調をかけたレーザーの実験
  • 応用物理学会と物理学会の展示会に出展

4月

  • XILINXのPCI Expressコア「XDMA」の使い方を解説
  • Cosmo-Z Mini基板再設計と初出荷
  • オンラインショップをリニューアル

5月

  • Trenz×ZYNQセミナー開催
  • Artix-7ボードの改版
  • 第1回 Cosmo-Zセミナー開催

6月

  • Trenzオンラインショップのリニューアル
  • Zynqberryセミナーの開催
  • SDSoCの勉強を開始

7月

  • Cosmo-Z用にフルデジタルロックインアンプを作成
  • JTAGチャレンジ基板の開発
  • ディープラーニングの勉強開始

8月

  • MITOUJTAGにDigilentプラグインをリリース
  • JTAGチャレンジ基板の開発
  • 特電オフィスを模様替えして会議室を設置
  • IPA情報セキュリティキャンプで講師をつとめる
  • UltraScale+のJTAGに異常を発見
  • Spartan-7ボード設計開始

9月

  • JTAGチャレンジ基板を用いた初のMITOUJTAGセミナーを開催
  • 本郷オフィスの閉鎖を決定

10月

  • UltraScale+のJTAGの問題を解明
  • UltraScale+に完全対応したMITOUJTAG BASIC 3.4をリリース
  • トランジスタ技術11月号にSDSoCで作るAIの記事が掲載

11月

  • 本郷の事務所撤退準備
  • VivadoのJTAGシーケンスをいろいろと解読
  • 商品の出荷事務をAmazonに委託

12月

  • 事務所の移転先を探す→保証金ほとんど返ってこない
  • 新オフィスで仕事開始&コワーキングスペースの住人になった

という感じです。

前半は順調に進んでいたのですが、途中から雲行きが怪しくなってきて、終いには事業に失敗してオフィスを手放した、と思われるかもしれません。

それは違います。

特電は起業してから14年。2006年に、秋葉原に事務所を構えてから11年くらい。少しずつ業績を拡大しつつ、扱う製品もだんだん高度で専門的になってきました。

最初はFPGA評価ボードとかを作っていたのですが、今では人工衛星とか海底地震の計測器とかを請け負っています。(まだ研究開発の試作段階ですが)

2011年から2018年の間に売り上げは2倍になりました。

 

正社員を雇わずに妻と二人でやってきました。

今まで、技術系のお手伝いは基本的に大学生のアルバイトさんにお願いして、事務作業は学生さんや主婦のパート・アルバイトにお願いしてきたのですが、このまま続けていっても売り上げは微増するかもしれないけど、10倍20倍という劇的な躍進をして上場することは望めないだろうという展望が見えてきた時期でもありました。

 

会社を大きくするには、人と金が必要です。

学生アルバイトさんは優秀なのですが、2~3年で卒業してしまいます。また、最近の学校は授業が厳しいので週に2日くらいしか来れません。

正社員を雇えばいいと言う人がいるかもしれませんが、優秀な人は基本的に大きな会社に行ってしまうので、小さな会社に来たがる人は多くありません。

そのような状況下で、一般の求人サイトから「勤務条件と勤務内容と待遇」だけを見て来る候補はたいてい外れです。FPGAとADCがやりたい、とかJTAGがやりたい、という人は稀です。まず、一般の求人サイトにはいません。

最初に入れる正社員は、知り合いや能力がよく知れた人を雇わなければなりません。

平成30年の現在では、優秀な人材を集めて大きな会社を作るには2つの方法しかないように思えます。

  1. 億単位のお金を投資で得て、そのお金で渋谷や恵比寿あたりにオシャレなオフィスと優秀な人材を集める。また、大手企業を退職したがっているシニアを見つけて雇いノウハウと経験を活用する。広報や営業として若い女性も採用し、適度な男女比を維持し、人間関係で人の流出をつなぎとめる。(多くのITベンチャーが、だいたいこのやりかた)
  2. 学生か卒業後2年いないに数人のグループで起業し、投資を得て、一気にサービスや商品を作り上げてEXITする

2の方法はもう時期が過ぎてしまったので、私としては1の方法しか残っていませんが、それはやりたくありません。

これ以外の方法で会社を大きくする方法はないかをじっくりと考える時間が必要なので、一度、会社を小さくしたというのが正直なところです。とにかく、事務や人事のことで悩む時間を減らしたかったのです。

その上、2019年は消費税の増税や5月の10連休など、会社経営上の大きなリスクがあります。(10連休ということは、相手企業が休むから、売上の3分の1がなくなる。なのに、給与と家賃はかかる。えらいこっちゃ)

タイミング的にも、特電を手伝ってくれていた技術系のアルバイトさんの多くはM2やD3で、もう来れなくなるタイミングでした。

契約社員の方には1か月くらいの実質的な有給をとってもらい、次の勤務先を探してもらいました。詳しくは聞いていませんが、次のところが見つかったようです。

M1の学生さんは、リモートワークでまだ残ってくれています。本当にありがたいことです。

こうして事務所を解体し、2006年から続いてきた秋葉原出店の流れを一度、無事に閉じることができました。

かなりほっとしています。

レンタルオフィスやシェアオフィスで1週間ほど仕事をしてみてわかったのは、もう場所を借りて、人を雇って、機材をそろえて、仕入れして、決まった時間に始業して仕事するというスタイルは、平成も31年にもなる世にはそぐわないんじゃないかなということです。

2019年は「働き方改革」を考えつつ、本当に優秀な人材を探しながら、再び秋葉原に戻ることを考えています。

| | コメント (0)

2018.12.30

14bit DACのAD9717でグリッチが出る問題とその対処法

ZYNQ搭載のDAQ装置「Cosmo-Z Mini」は、Analog Devices社のAD9717というDACを利用した、14bit 125MHzのDACを2ch搭載しています。

Cszmini

今まで、このDACから出す正弦波が汚いという問題がありました。

どんな感じかというと、次の波形をご覧ください。

Ad9717_1

丸で囲ったところにヒゲが出ているのがわかります。

Cosmo-Z Miniで出力したものをループバックしてADCで取り込んでみると、

Ad9717_3

このように同じ機械でもヒゲが観測されるので、オシロの問題ではなさそうです。

必ず決まった場所で出るし、特に多くのビットが切り替わるところで良く出ます。

このDACは14bitパラレルで、しかも250MHzというデータレートで信号を与えるので、データバス間のタイミングのずれや、クロックとの位相の問題かと思っていました。しかし、このヒゲは、クロックをいくら遅くしても出るのです。

次に、内部にある2つのクロックドメインをつなぐ「リタイマー」の問題かと思い、AD9717のSPI経由で内部レジスタにアクセスできるようにして、いろいろな設定をいじってみました。

Retimer

しかし、リタイマー関係の設定を操作しても変更はありません。上の図のDELAYというのも変更はできないようでした。

途方に暮れて適当に内蔵レジスタを触っていたら、なんと、IRSET、QRSETレジスタの操作を行うことで、このヒゲを劇的に減らすことができたのです。

Ad9717_2

ご覧のとおり、つるっつるの正弦波です。

 

このDACは電流出力で、出力電流は次の式で決まります。

IOUTFS = 32 * VREFIO / RSET

VREFIOは1.0Vですので、RSETを16kΩとすると、IOUTFSはフルスケールで2mAとなります。

つまりデフォルトの設定では、外部抵抗を参照して2mAを作っているのですが、この電流が多いのか何かの理由でヒゲが出るということだったようです。これを内部の参照抵抗を使うようにして、レジスタ4と7に0x92くらいを書き込むと、劇的に改善されます。

Ad9717_4

さて、これだけだと正弦波的に見えなくなっただけかもしれないので、FFTをして確かめてみました。

まずは、デフォルトの外部抵抗(16kΩ)の状態。ゴジラの背中ような大量の高調波が観測されています。歪率は-50dB弱でしょう。

Ad9717_5

 

次に、IRSETレジスタに0x92を書き込んだ状態。先ほどまでの高調波が嘘のように消えてしまいました。

Ad9717_6

5MHzまでの成分を見ると、3倍と5倍がまだ少し見えていますが、基本波に対して-75dBくらいを達成できています。

Ad9717_7

最後はレジスタに0x9fを書き込んで、IRSET抵抗を32kΩにした場合。

Ad9717_8

なんとか-80dBを達成しました。

AD9717を使って、FPGAでコントロールされるDACから-80dBの歪率を持つ正弦波を出力することができました。

なぜRSETとビットの変わり目で大きなグリッチが出るかの関係はわかりませんでしたが、RSETを大きくして電流を絞ればよいことがわかりました。

| | コメント (0)

2018.12.27

某コワーキングスペースの会員になりました

特電の本社は某ビルのレンタルオフィスに移しましたが、それとは別に都内某所にあるコワーキングスペースの会員になりました。

一昨年、「みんなでワイワイ Amazon AWSのF1 FPGAを触る会」か何かで、コワーキングスペースというものの存在を知り、こういう働き方もいいなと思って、気にはなっていました。

正式には来年1月からの入会なのですが、みんなが声をかけてきてくれたり、歓迎会をしてくれそうであったり、なんだか嬉しいですね。

自分のオフィスを捨てることで、そういうコミュニティに入るキッカケができ、結果的に良かったと思います。

 

このコワーキングスペースは、24時間365日使用することができ、デザイン系やWeb系の、特電が弱かった分野を補完してくれそうなクリエイターさんが多く集っています。

特電は動くものとか光るものとかロボットとか作れるので、動いたり光ったりするものを作ることでクリエーターさんのお手伝いもできたらいいなと思っています。

ありがたいことに自分の占有スペースと鍵付きのロッカーを持てるので、オシロとか、信号発生器とか、はんだごてとか仰々しいものを持ち込んで、仕事場のセットアップが出来ました。

本社のあるオフィスビルは高層で綺麗でビジネスっぽくて良いのですが、スーツ着用が暗黙の了解だったりするので、ちょっと堅苦しいですね。その上、個室なのでかなり寂しい。

それに比べてコワーキングスペースは服装はゆるくてもOKで、人がいて会話もあるので、寂しくない。

一人で仕事をしていると本当に寂しくて滅入ってくるので、仕事の機密性によって使い分けつつ、しばらくはコワーキングスペースで仕事をしようかと思います。

| | コメント (0)

2018.12.26

新しいオフィスではんだ付け開始

移転後のオフィスで、ようやくはんだ付けやレーザーの実験を始められるようになりました。

Newoffice

汚してはいけないので、マットを引いてその上ではんだ付けです。

毎回毎回片づけなければならないので、ちょっと大変です。

 

不思議なことに、移転して、前のビルに行かなくなってからMITOUJTAGやCosmo-Zの注文や引き合いが増えているのです。オフィスの運というものは本当にあるのかもしれない。

| | コメント (0)

2018.12.25

Windows10でXPSが動かなくなった&その回避方法

久しぶりにISEで作ったZYNQのプロジェクトを論理合成しようとしたら、XPSが動かなくなっていました。

ISEの64-bit Project Managerを起動し、

Xps_error

Synthesizeしようとすると、

Started : "XPS Process: Synthesize XPS Source".
ERROR: synthesizing XPS module failed!

Process "XPS Process: Synthesize XPS Source" failed

とエラーになってしまいます。failedというだけで詳細なエラーの原因はわかりません。

 

XPSのモジュールを開こうとすると、

Started : "XPS to edit cpu.xmp".
ERROR: Editing XPS module failed!

となります。

ライセンスを入れなおしてみてもダメ。ISEとEDKを再インストールしてもダメです。2台ありWindows10 PCの両方で同じ現象です。

また、ISE Design Suite 64bit command promptからxpsを起動してみると、

Xps_error2

XPSがアプリケーションエラー0xc0000142を起こしてしまいます。XPSのほかにもいくつかのプログラムが同じエラーを起こすようです。

これが原因で、詳細なエラーメッセージを出さずにISEでfailedと表示されてしまうのかもしれません。

ふと思いついて、32bit版のISEで論理合成してみると・・

Xps_noerr_2

なんと、動くではないですか!!

ちゃんとXPSも起動します。

Xps_noerr2

また、Windows8.1のマシンでは、いままでと変わりなく論理合成が出来ていて、xps.exeも起動できているので、Windows10のアップデートによるものではないかと考えています。

当面の間は32bit版のISE+EDKで行うか、Windows 8.1で論理合成するしかないのかもしれません。

そもそもISEの32bit版と64bit版の違いってそれほどないような気もするので、32bit版でいいかも。

| | コメント (0)

2018.12.22

新しいオフィスで仕事開始

昨日から新しいオフィスで仕事をしています。

綺麗な部屋と綺麗なビル。コーヒーが飲み放題です。

Newoffice1

1日目は溜まっていたメールの返事や、住所変更などの事務作業で終わってしまいました。

毎日使えたら最高だろうな。

| | コメント (0)

2018.12.21

本郷の石川ビルの原状回復で保証金が返ってこない

特電が一昨日まで入居していた本郷の東大赤門前の石川ビルですが、契約書には明け渡し後、速やかに保証金を返金すると書かれているのにも関わらず、返金される気配が全くありません。

Ishikawabldg

昨日、1階の不動産屋に返金を求めたら、「物理的に不可能です。なぜなら、お金が用意できていません。いつ返すかも決まっていません。返す日程のその目途も立ちません。」とのこと。

契約書は3か月前に予告して、明け渡し後速やかに返還という良識的なものだったので、当然お金は用意できているはずでしょうが、それができていないようです。おい

不動産屋によれば、保証金から原状回復費を差し引いて返金するのでその見積をとるのに時間がかかり、それが終わってから返金とか。速やかの定義は1か月くらいだとかなんだとか。

いや、それは、明らかに速やかではない。

 

で、今朝原状回復の見積を急いで取りました、とのこと。カーペットとかで内装工事の見積をとったら75万円とかってぽろっと言いだしたので、思わず「ふざけるな」って言ってしまいましたよ。

 

確かに、カーペットは汚れていますよ。

Amamori

でもね、この床の汚れは雨漏り(壁の通気口かひび割れによるもので、全くこちらに非はない。外壁工事したら直った。)によるものなのですそれは不動産屋も知っていたはず。

内装屋の見積がボッタク リなのか。

あと、多少汚れているところはあるけど、それは歩いたことや、座っていたことで足がそこにあったから。

Office_1

Office_2

これは通常の使用による汚損。それとも、空中浮遊しろとでもいうのでしょうかね。

 

「一部だけ取り換えると色むらが出るから全部取り換えよう」というパティーンが見え隠れします。

保証金から家賃の2か月(約70万円)を無条件で償却しておいて、さらに75万円を請求しようとしているのでしょうか。

結局のところ、不動産屋やオーナーというのは、保証金を返す気なんてさらさらないのかもしれません。最後くらい綺麗にしてほしいものです。

 

さらに、最終月は日割り家賃であるはずなのに、家賃の約36万円を1か月分全額引き落とししてきました。だから、過払いの状態になっているのですが、その返金も「原状回復が済んでから」とか言ってきました。

過払いと原状回復とは関係ないでしょう。さすがに論理的におかしい。

 

既に明け渡しを済ませているので、保証金はこちらがオーナーと不動産屋に無保証で貸している金銭賃貸借の状態に入ったわけです。

確かに保証金は無利子ですが、明け渡しが完了して賃貸借契約は終了したので、本来は保証金を返すはずだが返さないという契約書にない状態に突入しました。

だから、無利子の保証金ではない、遅延するなら利子を払えと言っておきました。

さあどうなることでしょう。

| | コメント (1)

2018.12.17

ZYNQのSPIをLinuxから使うspidevの解析

ユーザモードドライバのspidevがZYNQ Linuxでも動くことがわかったので、中身を解析してみましょう。

spidevというドライバのソースは、Linuxカーネルの drivers/spi/spidev.cにあります。このドライバの全体的な構造を次の図に示します。

Spidev7

spidev.cは、ユーザプログラムからのioctl()によるリクエストを受け付けて、それをメッセージ化して、バスドライバであるspi.cに渡します。

spi.cは、SPIへのメッセージ化された要求を、低レベルな物理ドライバへ投げるということを行っています。

実際にZYNQのレジスタを操作しているのは、spi-cadence.cという低レベルな物理ドライバです。cadenceというのは、IPコアで有名なケイデンス社のことでしょう。ZYNQのSPIはcadence社のIPコアを元に作られていると推定されます。spi_cadence.cはLinux起動時にcdns_*で始まる関数をspi.cに登録し、処理が必要なときに呼び出されるようになっています。

登録されている関数の機能を調べてみました。

  • cdns_prepare_transfer_hardware()
    • ZYNQのレジスタを操作して、SPIを有効にする
  • cdns_unprepare_transfer_hardware()
    • ZYNQのレジスタを操作して、SPIを無効にする
  • cdns_prepare_message()
    • クロックモード(SPIモード0~3)の設定
  • cdns_transfer_one()
    • クロック周波数を設定する
    • FIFOに送信データを詰めて、送信を行う
  • cdns_spi_chipselect()
    • CSを上げ下げする
    • is_decoded_csが0ならば、全チャネルを有効にする
  • cdns_spi_irq()
    • 受信割込み処理

spidevで送受信を要求するとSPIのメッセージが作られて、それを元にspi-cadenceドライバが動きます。

具体的な動作としては、メッセージを処理する前にcdns_spi_chipselect()が呼ばれてSSを0にし、メッセージにしたがって複数のSPIトランザクションを送受信し、すべてのメッセージが処理されたらSSを1に戻します。

送信と受信は同時に行われますが、送受信の完了は割込みを使って判断しています。そのため、割込みが発生しないと適当な時間でタイムアウトするようになっています。

spidevにはいくつかのオプションが設定できますが、SPI_IOC_WR_LSB_FIRSTは効きません。それどころか、

uint8_t lsbfirst = 1;
ioctl(fd, SPI_IOC_WR_LSB_FIRST, &lsbfirst);

というコードを実行すると、

spidev spi1.1: setup: unsupported mode bits 8

というエラーが表示されます。(bit 8というのは、LSB_FIRSTというモードのことを言っているので、8bitモードとか16bitモードということではありません。)

また、SPI_IOC_WR_BITS_PER_WORDというオプションはZYNQのSPIでは効果はなく、常に8bit単位となるようです。

また、複数の長さのメッセージを送っても、CSの上げ下げは1回しか起こりません。メッセージを処理するたびにCSを上げ下げするわけではないようです。

最初の1バイトはコマンド、2バイト目からは受信と送信が切り替わる、というのは実現できないので、3-WireのSPIは扱えません。

結局のところ、使えるオプションは、クロックの速度設定と、SPIモード0~3の設定のみでした。

spidevを使おうとして困るのは、デバイスの名前がspidev32766.0というふうに大きな数字になってしまうことです。しかも、この値はシステムによって変わります。

この値をユーザが決めるには、device treeでaliasを設定すればよいようです。

aliases {
      spi1 = "/amba/spi@e0006000";
};

とすれば、ZYNQ PSのSPI0が/dev/spidev1.0 として認識されるようになります。(spi0はqspi用に既に使っている)

ZYNQのSPIには3個のSSがあって、デフォルトのSSではなく、SS1やSS2を使いたい場合はdevicetreeに

    spidev@0x01 {
        compatible = "spidev";
        spi-max-frequency = <1000000>;
        reg = <1>;
    };

を追加すればよいようです。

こうしてみたところ、起動時にspi1.0、spi1.1、spi1.2が登録されました。

Spidev8

しかし、割込みが発生しないので、現時点では使えないようです。

送信してみると、

spidev spi1.1: SPI transfer timed out

というエラーが出てしまいます。

まとめると、ZYNQのSPIをspidevで操作するときには、

  • 4線式のスタンダードなSPI。3線式はサポートしない。
  • CSはSS0のみ使用可能
  • LSB Firstにはできない
  • クロック周波数は変更可能
  • SPIモードの設定は可能
  • 常に8bit単位
  • device treeにaliasを設定すれば、/dev/spidev1.0でアクセスできる

ということでした。

| | コメント (0)

2018.12.16

ZYNQのSPIをLinuxから使う方法

ZYNQのPSにはSPIのポートが出ています。このSPIを使えば周辺ICを簡単にコントロールできるでしょう。

Spidev0

しかし、公式Wikiで紹介されているSPIの使用方法

https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18842255/Linux+SPI+Driver

では、標準的なSPI Flash ROMやEEPROMを接続する場合しか書かれていません。

私はDAコンバータの内蔵レジスタを操作したかったので、より低レベルな操作ができるドライバを必要としていました。

LinuxでSPIを使うためにspidevというドライバが用意されています。概要は、「LinuxでSPI (spidev)を使う」のページで紹介されているのですが、open("/dev/spidev0.0", O_RDWR)で開いた後、ioctlで操作するという素敵なものです。

これは、ユーザモードドライバといって、デバイスに対する具体的な操作をカーネルモードでやらずに、ユーザモードのプログラムで組むことができるものです。これによって誰でもプログラムを作ることができるようになり、開発とテストが飛躍的に容易になります。

このspidevをZYNQで使いたいので、普通のLinuxカーネルではspidevは入っていないので、カーネルを再構築しなければなりません。

Linuxのコンフィグは、cat /proc/config.gz | ungip -c で取得することができるので、得られたconfigというファイルを.configにリネームしてLinuxのカーネルをビルドできる環境に持っていけば、現在のLinuxカーネルのその他の状態は変えずに新たなドライバを組み込みこんだカーネルを作れる。

spidevを有効にするには、Linuxのコンフィグで、

CONFIG_SPI_SPIDEV=y

にするか、menuconfigで、Device Drivers => SPI supportの中にあるUser mode SPI device driver supportを有効にします。

Spidev1

これでビルドしたら、次にdevice treeにSPIの下のspidevを有効にするように記述を追加します。

spi@e0006000 {
    compatible = "xlnx,zynq-spi-r1p6";
    reg = <0xe0006000 0x1000>;
    status = "okay";
    interrupt-parent = <0x4>;
    interrupts = <0x0 0x1a 0x4>;
    clocks = <0x1 0x19 0x1 0x22>;
    clock-names = "ref_clk", "pclk";
    num-cs = <3>;
    is-decoded-cs = <0>;
    #address-cells = <0x1>;
    #size-cells = <0x0>;
    spidev@0x00 {
        compatible = "spidev";
        spi-max-frequency = <1000000>;
        reg = <0>;
    };
};

これでspidevが有効になります。

dmesgで見てみると、起動時に認識されていることがわかります。

[    0.763436] spidev spi32766.0: buggy DT: spidev listed directly in DT

実際にspiのドライバがどう認識されてどんなデバイスが作られたかを見てみると、/sys/bus/spi/devices/spi32766.0 というバスが認識されていて、/dev/spidev32766.0 というデバイスがあることがわかります。

Spidev2

このドライバを開くには、open("/dev/spidev32766.0",O_RDWR)とすればよいことになります。

作ったプログラムの全体を載せます。

#include <stdio.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdint.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <linux/spi/spidev.h>
 
#define SPI_SPEED_HZ    500000
#define SPI_DELAY_USECS 1
#define SPI_BITS        8
 
#define DEVICE_NAME "/dev/spidev32766.0"
 
int main (int argc, char *argv[]) {
    if(argc < 2) {
        printf("usage:spitest length");
        return 0;
    }
    int trsize = atoi(argv[1]);
 
    int fd = open(DEVICE_NAME, O_RDWR);
 
    uint8_t *tx = new unsigned char[trsize];
    uint8_t *rx = new unsigned char[trsize];
    struct spi_ioc_transfer tr[1];
 
    tr[0].tx_buf        = (__u64)tx;
    tr[0].rx_buf        = (__u64)rx;
    tr[0].len           = trsize;
    tr[0].delay_usecs   = SPI_DELAY_USECS;
    tr[0].speed_hz      = SPI_SPEED_HZ;
    tr[0].bits_per_word = 8;
    tr[0].cs_change     = 0;
 
    for(int i=0;i<trsize;i++) {
        tx[i] = i;
    }
    tx[0] = 0x80;
    tx[1] = 0x02;
    tx[2] = 0x03;
    tx[3] = 0x01;
    memset(rx,0 , trsize);
    uint8_t mode = SPI_MODE_0; // 効果あり
    ioctl(fd, SPI_IOC_WR_MODE, &mode);
 
    uint8_t wlen = 32; // 効果なし
    ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &wlen);
 
//  uint8_t lsbfirst = 1; // 変更不可
//  ioctl(fd, SPI_IOC_WR_LSB_FIRST, &lsbfirst);
    printf("TX:");
    for(int i=0;i<trsize;i++) {
        printf("%02X ",tx[i]);
    }
    printf("\n");
//  write(fd , tx, 2); // 動作はする
//  read(fd , rx, 3); // 動作はする
    printf("result=%d bytes\n",ioctl(fd, SPI_IOC_MESSAGE(1), tr));
    printf("RX:");
    for(int i=0;i<trsize;i++) {
        printf("%02X ",rx[i]);
    }
    printf("\n");
   
    delete[] tx;
    delete[] rx;
    return 0;
}

このプログラムを、g++ spitest.cpp -o spitest でコンパイルして、

# ./spitest 長さ

で実行できます。

ZYNQの中でどのような波形が出ているのかをキャプチャするロジックを作り、

Spidev5

その中でMOSIとMISOを接続してループバックて、実行してみた結果は、

Spidev3

となりました。256バイトの送信でも問題なくできているようです。

試しに、送受信の長さを4バイト程度にして、中の波形をMITOUJTAGを使ってみてみると、

Spidev4

となりました。

わかることは、

  • CSはSS0が使われる
  • MOSIからはMSBファーストでデータが出てくる
  • 1バイト(あるいは指定長)ごとにCSを上げることはない
  • 転送が行われている間、MOSI_TはL(出力許可)になる
  • MISO_TはH(出力禁止)だが、転送が行われた後、短い時間Lになる
  • MISOは挙動不審
  • SS_Tや、SCLK_Tは転送が行われている間、Lになる

というものでした。

なお、tr[0].cs_change = 0;を1にすると、1つのメッセージを送信するたびにCSを上げ下げするようになります。しかし、最後のメッセージでは0にしておかないとCSが下がりっぱなしになってしまうようです。

また、tr[0].delay_usecsは、SPIへの送信が終わったあと、CSを上げるまでのディレイ時間を設定するものです。通常は0でよいと思います。

ZYNQのSPI0の信号を外に出すには、下の図のように単純に出せばよく、

Spidev6

SCLKやSSに3ステート・バッファを使うと、転送が行われていない間はハイ・インピーダンスになってしまうので、特にこだわりがなければ、そのまま出力したほうがよいでしょう。

MISOは、ZYNQがマスターとなる場合は入力ですが、MISO_TがLになる期間があるので、これも3ステート・バッファを使わずに単純な入力ポートとしたほうがよいでしょう。

これで、SPIの単純な操作ならできるのですが、様々なオプションに効果があるのかとか、3線式SPIへの対応可能性、spidev32766という番号の変え方などを、デバイスドライバのソースコードを読みつつ探っていくことにします。

(続く)

| | コメント (0)

2018.12.14

新しい事務所

特電の移転先が決まりました。

来週後半からは、このビルで仕事をします。

New_office

お仕事が捗りそうでしょ?

今日はCosmo-KのIBERT試験など動作テストをしていました。

Cosmo-KはSFP+の光トランシーバが3ch付いているので、この1つ1つの光トランシーバ機能をIBERTという試験をしてテストしていきます。

10Gbpsでもアイが54%も開いていました。実力的には20Gbpsまで行けそうかな?

満足のいく性能が出てよかったです。

Ibertk003652d

| | コメント (0)

2018.12.13

カーシェア

Times24のカーシェアを申し込んだので、本郷の現事務所から、倉庫まで荷物を運んでみました。

最寄りのカーシェアは本郷郵便局の裏手にある駐車場なので、そこまで徒歩で向かいます。

本郷の道路は一方通行や右折禁止ばかりなので、来た道を戻って事務所に戻ることはできません。

何とか本郷通りを本郷3丁目の交差点から北上するルートに戻ろうとしたものの、一方通行や右折禁止に阻まれて、思うように進めませんでした。

カーナビが指示している道はなんだか遠そうだったので、抜け道を探して、結局のところ、こんな経路を通ることになってしまいました。

Hongo1

特にヤバかったのは、上の図で「せまい」と書いてあるところ。

拡大して見てみましょう。

Hongo2

狭いです。

ここ、本当にヤバいです。

Googleマップでは、

Hongo3

やっぱり狭い。

 

車の幅よりも狭いくらいの幅しかないのです。

この道が見えたときには、本当に後悔しました。素直にカーナビに従っておけばよかった。今更バックでは戻れません。

緑の柵には先人のこすった後がたくさんあります。

車の右側が2cmくらいしか隙間がない状態で、5cmずつくらい車を進めていき・・・

Hongo4

何とかクリアしました!!

 

やった!

 

・・

・・・・

って喜んでいる場合じゃない。パーキングで車を借りて、抜け道探して30分くらい無駄な時間を過ごしていました。

事務所に戻って荷物を積んで倉庫に向かうのですが、こんなときに限って赤信号ばかり。台東区に入ると右折ができずに、結局、往復2時間もかかってしまいました。

乗用車で運べる荷物の量なんて大したことないということがわかったので、次はレンタカーで軽トラ借りてみます。

| | コメント (0)

2018.12.12

事務所から倉庫への引っ越し

今日は引っ越しの日なのですが、事務所の移転というわけではなく、あまり使わない書籍や、機材、オフィス家具などを都内某所にある倉庫に移すという引っ越しです。

帳簿10年保存義務って厳しくないですか?

まず、深夜に会社に来ました。

Office3

さて、これから片付けなければなりません。

冷蔵庫とか、給湯台、工具、ケーブル・テーブルタップの山、etc・・・

Kougu

これらって、本当に必要だったものなのでしょうか。梱包していて疑問がわいてきました。

そして、古い帳簿や雑誌、技術書などをダンボールに入れます。

Danball

全部で30箱くらいになりました。

まぁ、オフィスの全面引っ越しに比べれば楽なものです。

朝5時に家に帰って、仮眠して朝ごはん作って、子供を送り出して、朝9時にまたオフィスに来ました。雨なので自転車が使えません。

しばらくすると引っ越し屋さんが来て、倉庫へ運んでくれました。

最初は自分で軽トラックを借りて運ぼうとか考えていたけれども、一方通行で狭い商店街にあるので、何かと不安。引っ越しはプロに任せて本当によかった。

都内某所にある倉庫。

Souko

ここで、本棚やキャビネット、書籍、機材などは、復活の日まで休んでいてもらいます。

また本郷の事務所に戻ります。

Empty

なーんにも、無くなっちゃったな~

ただ、あと5日間ほどはするべき仕事が残っているので、机などを配置しなおして執務開始!

Newhaichi

Cosmo-Z Miniの動作試験などをして、1台、出荷しました。

いらない物がなくなって、いるものだけが残っただけなのかもしれない。

Hongo4

いるものって何だろう。

パソコン、試験機材、製造のための材料、机、プリンタ、サーバ、在庫、梱包資材、今年の帳簿・・?

| | コメント (0)

2018.12.11

引っ越しの準備、合間にお仕事

今日も引っ越しの準備で大忙しです。

朝、倉庫の大家さんのところに挨拶に行き、昼頃から本郷のオフィスに行って、注文が入っていたCosmo-K-の出荷前検査をしていました。

Cosmok

PCI Express経由のDDR3メモリテストや、

Kminus

10Gbps SFP+のIBERT試験を行い出荷。

Ibertk003572d

今回のロットも問題なく10Gbpsが出ました。

そして、商品を出荷しつつ移転先の候補となる物件を選んでいました。

来客は来ない事務所利用となると言い方が面倒なので「セカンドハウス的な」という便利な言葉で説明していました。

家相をいろいろ見てきてわかってきたことは、1992年~2012年に竣工した物件で東西を向いているものは、西向きならOK。2012年以降の東西向き物件は不可。ということです。

この条件に合うワンルームマンションを自宅の近くで2件ほど探し、16時と17時に不動産屋に予約を入れたので、15:30ごろには部屋を軽く片付けてオフィスを出ました。

Hongo2Hongo1

不動産屋に着いて歓談しているのですが、なかなか内見をさせてくれません。

16時から内見と聞いていたのに他の内見の予約が入っているとかなんとか。

「306号室なら空いてますよ~」みたいに、希望していない物件を薦めてきます。

「方位が悪い。西向きでないとダメ」と問答無用で即答。

ああ、なるほど。この不動産屋は元付で入っているわけじゃなくて立場が弱いから自分らが優位に薦められる物件にしようとしているのです。さすが仲介手数料無料だ。

結局、1つ前に見ていたお客さんが申し込みをしたとかいうことで、希望の物件は見られなかったので、縁がなかったということです。

次の不動産屋さんと17時に待ち合わせしていたので次に行きます。

「南向きの部屋もあります」とここも他の物件を紹介してきます。

「いや、運勢が悪い。」

「西向きをご希望ですね・・」

いや、竣工が1992年~2012年2月なら西向きということであって、西向き限定というわけではないのですが面倒なので、それ以上は何もいわずにおきました。

自宅から徒歩1分のところにある比較的新しいマンションなのですが、わざわざ不動産屋さんの車に乗って現地へ内見しにいきました。

大手デベロッパーのマンションで、外装はパステルカラー。廊下も綺麗で、部屋の広さは6畳というのは嘘はないのですが、お湯が有料とか、部屋の中に段差があるとかで、嫌な感じの物件でした。

そして、不思議なのは、最近のワンルームマンションは郵便ポストに自分の名前を出さないということです。205、306、・・・郵便屋さんは部屋の号室だけで郵便を投函しているのかと思うと恐ろしくなります。

結論としては、ワンルームマンションを借りて自宅近くに仕事部屋を作るというプランは消失しました。

部屋探しにものすごい工数をかけたけれども、結局のところ、「自宅近くのワンルームマンションで開発」というのは、あまり運勢が良い部屋に巡り合えないということです。

春頃に再び秋葉原に事務所を借りられるよう、今は基板設計やFPGAの開発、ソフトウェア開発に注力することにしました。

| | コメント (0)

2018.12.10

夜中に会社に行って出荷

昼間は事務作業に追われて、技術的な仕事ができないので、夜中に会社に来て、製造などの出荷作業を行っています。

夜中に来たのは久しぶりです。だんだん本来のペースで働けるように戻ってきました。

まず、Cosmo-KというKintex-7のPCI Expressボードにコネクタやヒートシンクを取り付け、USBのファームウェアを書き込み、メモリテストを行っています。

Cosmok4

USB3.0はちゃんと300MB/s以上出ています。問題なし。

K7speed

それから、Cosmo-Z Miniの組み立てと動作試験。

Cszmini

基本的な動作は問題ないようです。

最後に、Cosmo-Z Mini Optの光センサのノイズ試験。

Cszmini_opt

機器本体とつなぐ数cmのケーブルを、バラの線を2本にしたり、ツイストペアにしたり、シールド線や同軸ケーブルにするなどいろいろ変えてノイズがどう変わるかをテストしていました。

機器の中は狭くて大変だけど、ツイストよりもやっぱり同軸ですね。拾うノイズが観測できないほど小さくなりました。

Twist

| | コメント (0)

2018.12.09

自宅近くでマンションを探してみたけれど

本郷事務所の撤収に伴い、今後作業する部屋が必要と思い、自宅の近くでワンルームマンションを探していました。

机が最低で2個は置けなければならないし、事務作業とはんだ付けの机は分けたい、オシロやファンクションジェネレータなどの機材も置きたいので8畳は必要かなと思っていました。

オンラインの賃貸情報で数十件は見て、現地で内見も6件くらいして、だいたいこの地域の感覚がつかめてきたところで、こんな感じの超優良物件を見つけたのです。

築浅で、ほぼ新築です。

Bukken

さっそく内見をさせてもらったところ、築浅だけあってピカピカで、広さも問題なく(といってもキッチンも含めて10畳なので実質的には8畳程度)。

この地域では破格の賃料で、礼金も仲介手数料も不要、保証会社もいらないから保証金もない。すぐに契約して来週から入居可能という感じでした。

こんな超優良物件があってよいのかと興奮して帰ったのですが、フライングスター風水で調べてみると大変悪い物件だったのです。

8e

わかる人にはわかるチャートです。

風水はちょっとかじった程度ですが、悪い物件であることはすぐにわかります。

簡単に言ってしまえば、8、9、1という数字が良い数字で、2や5や7が悪い数字です。

88の部分が風呂トイレになっていてラッキーゾーンが全く活かせません。右下の97が洗濯機置き場になっていて使えないので、人の運勢も弱くなる。

オフィスの机はどこに置けばよいでしょうか?キッチンの隣に置いたら不幸になり、ベランダの横に置いたら病気になるでしょう。左下の79のところに置くと、人との争いごとになり、唯一無害な34の部分はベランダの出口を塞ぐので使えなさそう。

この物件に入居しても、何も良いことがなさそうです。

非科学的と思う人もいるかもしれませんが、風水というのは本当に馬鹿にできないものです。

最近やっと気が付いたのですが、特電の本郷のオフィスは真ん中が95になっていて、今年の年飛星が9なので1年間の入囚が起きていたのです。

左側にある数字9と年飛星が被っていることを入囚というのですが、入囚すると運勢がロックされて、良いことがなくなります。

つまり、本郷のこのオフィスは2018年の2月~2019年の2月までの1年間、人に関する運が悪くなります。しかも11月の月飛星が5だから、2018年12月は人もお金も入囚していた最悪の月だったのです。

20年の入囚だけでなく、1年や1か月の入囚がこんなにも悪い力を出すとは思ってもいませんでした。

11月の終わりに気が付いて、入囚を解除する対策を施したらいきなり売上が改善したので、本当に不思議。でも改善にも限度があるので、この本郷オフィスは早く撤収することが吉です。

もっと早くに気が付いていればよかった!

| | コメント (0)

2018.12.06

Intel(ALTERA)のMAX10キットを試す

MITOUJTAGでMAX10がどう見えるかを試してみたくてIntelのMAX10評価ボード「10M50 Evaluation Kit」を購入しました。

Max10_kit_top

このボードは、MAX10の最大クラスである10M50DAF484C6GESを中心に、1G ビット(64Mx16)LPDDR2 SDRAMや、HDMI出力、CSI入出力が搭載されています。

Max10_kit_bot

HDMI出力はAnalogDevicesのADV7513を使って作られていて、I/O直結にはなっていないようです。

Max10_kit_block

MAX10のほか、MAX2も乗っていて、MAX2とCypressのEZ-USB FX2によりオンボードのUSB Blaster2を構成しています。

このボードをUSB給電で動かす際のポイントを書きます。

  • 付属する赤と黒のコネクタが付いた変なUSBケーブルは、黒いコネクタを使う
  • USBから給電する際には、J11を2-3のほうに差し替える

さて、電源を入れると動き出してLEDが点滅するわけですが、MITOUJTAGから認識しようとしても残念ながらUSB Blaster2を認識しませんでした。

Usbblaster2

どうやらUSB BlasterとUSB Blaster2は全く別物のようです。

そこで特電のUSB-JTAGケーブルをつなごうとしたのですが、それでもデバイスを認識しません。

MAX10キットの回路図を見たところ、2番ピンがUSB_DISABLEとなっていました。外部からUSB Blasterをつなぐ場合はGNDとショートされるはずです。ここをLレベルにするとオンボードのUSB Blaster2が無効になります。

Jtag_connector

というわけで、Pocket JTAG Cableの青い線をつないで、MITOUJTAGでLに設定しました。

Max10_usbjtag_disable

これでMAX10が認識されるかと思ったら、今度は不明なデバイスが2個見つかりました。

Max10kit_unknown

1つ目のデバイスのIDCODEは0620A1BB、2つ目のデバイスのIDCODEは020D10DDでした。この020D10DDというデバイスはUSB Blaster2を構成しているMAX2の中に存在する仮想的なデバイスだそうです。

読み解いた感じでは下の図のようになっています。

Vtap

最初のデバイスのIDCODE「0620A1BB」というのは正しくはMAX10のIDCODEで031050DDのはずです。

何かがバグって1bit左にシフトしているようです。VTAPのIDCODEレジスタが33bitあるのかな??

なお、Qualtusのプログラマでは次のように見えます。

Qpro1

SW2.4をONにすると、MITOUJTAGでも普通のチェーン構成として見えるようになります。

Sw24

これでようやくMITOUJTAGで普通にMAX10がスキャンできるようになりました。

Max10_bscan

| | コメント (0)

2018.12.05

ZYNQ LinuxからのUSBメモリ書き込み速度

ZynqとLinuxで計測システムを作ったときに、どのくらいの速度で記録ができるのかという疑問を晴らすために、Zynq LinuxからUSBメモリに書き込む速度を測定してみました。

使用したZYNQのシステムは、Cosmo-Z Mini

Zynq_usbmem

この中にはXC7Z020が入っていて、Ubuntu Linux 14.04が起動しています。

いろいろなメモリカードやUSBメモリを用意しました。

  • TOSHIBAの32GB USBメモリ
  • SDカードリーダとTOSHIBAの16GB MicroSD (秋月)
  • Buffaloの8GB USBメモリRUF3-K8GA-BK

Zynq_usbmem1

これらのメモリにデータを書き込むわけですが、一番シンプルなのはddコマンドを使って乱数を書き込む方法です。

dd if=/dev/urandom of=/usbmem/test.bin bs=1048576 count=12000

結果の表示は 

・・・
12577055296 バイト (13 GB) コピーされました、 947.968 秒、 13.3 MB/秒

これではあまりにもシンプルすぎてつまらないので、自分でプログラムを作って書き込むことにしました。

#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <iostream>
#include <fstream>
#include <cstdlib>

const long long blocksize = 1000000;

void showspeed(struct timeval* start, int block) {
	struct timeval current;
	gettimeofday(&current, NULL);
	printf("%lld\t", (long long)blocksize * block / 1000000);
//	printf("Total %lld[MB],", (long long)blocksize * block / 1000000);
	printf("%ld\t", current.tv_sec - start->tv_sec);
//	printf("%ld[sec]", current.tv_sec - start->tv_sec);
	if(current.tv_sec != start->tv_sec) {
		double elapsed = (current.tv_sec - start->tv_sec) * 1000000 + (current.tv_usec - start->tv_usec);
		printf("%3.2f\n", (double)(blocksize * block) / elapsed);
//		printf(", Write throughput=%3.2fMB/s\n", (double)(blocksize * block) / elapsed);
	}
	else {
		printf("\n");
	}
}

int main(int argc, char *argv[]) {
	struct timeval start;

	if(argc < 3) {
		printf("usage: memfill size(GB) filename\n");
		return 1;
	}
	double size = atof(argv[1]);
	char *filename = argv[2];

	unsigned char *tmp = new unsigned char [blocksize];
	for(int j=0;j<blocksize;j++) {
		tmp[j] = rand();
	}

    std::ofstream ofs(filename,std::ios::out | std::ios::trunc | std::ios::binary);
    if (!ofs) {
        std::cerr << "error" << std::endl;
        std::exit(EXIT_FAILURE);
    }

	printf("[MB]\t[sec]\t[MB/sec]\n");

	gettimeofday(&start, NULL);
	int block;
	for(block = 0; block < size * 1000 ; block++) {
		if((block % 100) == 0) {
			showspeed(&start,block);
		}
		ofs.write((char *)tmp,blocksize);
	}
	showspeed(&start,block);

	ofs.close();
	
	delete[] tmp;
}
 

ddと比べても速度に差はなかったので、このプログラムで計測することにしました。

このプログラムを実行すると次のような表示が出ます。

Zynq_usbmem4

100MB書き込んだときは平均23.32MB/sで、500MBのときは平均14.94MB/sで、というふうに読みます。最初はおそらくキャッシュが効いていて速いのですが、だんだん遅くなってくるのがわかります。

書き込み速度のグラフを示します。

Zynq_usbmem2

サイズが大きくなるとだんだん遅くなるのがわかりますね。このまま12GBまで続けてもそれほど変わらないので、2GBで打ち切っています。

下のほうを拡大してみます。

Zynq_usbmem3

意外なことに、一番速かったのは、秋月で売っている東芝のMicroSDカードをext4でフォーマットしてUSBカードリーダに挿したものでした。14GB/s出ています。このMicroSDカードをFAT32にするとわずかに遅くなります。

次点はBuffaloのUSBメモリ(RUF3-K8GA-BK)をext4でフォーマットしたもの(水色)なのですが、RUF3-K8GA-BKはFAT32にすると激遅(黄色の線)になります。

RUF3-K8GA-BKはUSB3.0のインタフェースを積んでいるくせに、Windowsパソコンから書き込んでも7MB/secしか出ません。Amazonのレビューでも遅さが指摘されています。

Cosmo-Z Miniは4GBのeMMCを積んでいるのですが、意外と遅いようです。10MB/sec前後です。

しかし、一番遅いのはWindowsで使いまわしている東芝のUSBメモリで、すでにいろいろなファイルが入っているものです。

結論を言うと、

  • USBメモリの種類によってかなりばらつきがある。東芝のMicro USB速い!
  • ext4でまっさらな状態にフォーマットして使うと速くなる
  • すでに使用中のUSBメモリカードに追記すると遅くなる

という感じでした。

メモリカードと機材を選べば10MB/s以上で連続してデータを記録できそうですね。

| | コメント (1)

« 2018年11月 | トップページ | 2019年1月 »