2019年10月20日日曜日

IOEのFast Input/Output Registerを活用しよう

MAX10 FPGAの評価ボード(EK-10M50F484)を用いて、HDMI信号を出力する際に数日間嵌まったので忘れないようにここに書いておく。

■嵌まった内容
FPGAボード上に搭載されているHDMIトランスミッタPHY(アナデバADV7513。以下PHYと呼ぶ)から、Full-HD 60fpsの信号を出力している際に、稀に同期信号が外れて映像が乱れる or 映らなくなる現象が発生した。FPGA内部のビデオ信号/同期信号以外のモジュールを修正した場合や、ドライヤーでFPGAパッケージ温度を上昇させることでも現象が発生することもあり、非常に悩まされた。
発生当初、タイミング系のトラブルだろうな・・・?とは予想していたが、Fmax値は満足しており、タイミング制約の書き方が誤っているのではないだろうか??と疑いを掛けて何度もSDCファイルを書き換えては再合成を繰り返していた。
SDCファイルを何度か書き換えて試行錯誤していると、一時期安定動作することもあったが、周辺回路を追加していくことで映像が乱れる現象が再発し、ますますワケガワカラナイ状態だった・・・。

■PHY < = > FPGA間の信号観測(失敗)
映像が乱れる原因として、PHYのタイミング制約を満たしていないのでは・・・?という疑問が湧いてきた。
気になったので、オシロスコープで信号を見てみることにした。
以下の画像が測定した波形だ。
オシロでPHY信号を測定(CH1:CLK / CH2:Video Data)

う~む・・・分からん。
オシロの水平軸は目一杯拡大しているが、5ns/divが限界。また、このオシロのアナログ帯域は100MHz、サンプリング速度は500MS/s(2ch時)である。観測したい信号のクロック周波数はFull-HD 60fpsのピクセルクロック ≒ 150MHzなので、帯域/サンプリング速度ともに不足している。また、PHY信号線にプローブを接続すると、プローブの入力容量により信号が劣化し、全く映像が出なくなってしまった。
手持ちの測定器による評価は無理だと分かった。。😨

参考までに使用したプローブのスペックを以下に示す。RIGOLのRP2200というパッシブプローブだ。
RP2200のスペック

x10で使用したときの帯域は150MHz、上昇時間2.3ns、入力容量は標準で17pFだ。
プローブを接続することで映像が出なくなった原因は、プローブの入力容量による信号レベルの低下や歪が考えられる。17pFの容量は、150MHz信号に対して約62Ωのインピーダンスとなり、ドライブする側(FPGA)の負担となる。

■Quartus Timing Analyzerでの解析
オシロスコープによるタイミング測定が失敗に終わったので、Quartus Primeに付属のTiming Analyzerを使用してPHYの駆動タイミングを検証してみた。
Quartus上のTools => Timing Analyzer => Custom Reports => Report Path...
で対象の信号を選択する。

Report Pathボタンを押すと内部レジスタからポートまでの遅延時間が解析される。
内部レジスタからポートまでの遅延時間解析結果

ここで解析された時間をブロック図に書き込んだのが以下の図になる。
FPGAとPHYの接続と遅延時間の関係

PHYのビデオデータセットアップタイム(min)は1.8ns、ホールドタイム(min)は1.3nsとなっている。FPGAからPHYまでの配線は、目視によるボード確認でミアンダ配線となっており等長と予想される。PWB上のCLKとデータの伝搬遅延がほぼ同じになれば、CLKを基準としてデータをサンプリングするPHYにとっては配線長を考慮する必要が無くなる。そうなると、CLKの遅延時間4.584nsに対して最も近いDE(Data Enable)の遅延時間5.407nsの両者でホールドタイムが満たせていないことになる。
 セットアップタイムは 6.666 - (5.407 - 4.584) = 5.843ns (min 1.8ns OK)
 ホールドタイムは 5.407 - 4.584 = 0.823ns (min 1.3ns NG)
と計算できる。
セットアップタイム/ホールドタイムの計算

SDCファイルを何度か書き換えて試行錯誤していると稀に上手く動いていたのは、たまたま出力レジスタとポート間の遅延時間がこれらセットアップ/ホールドタイムの制約を満たす位置に配置されたためと想定される。CLKはFFを介さずに出力ポートへ接続されるため、何度かコンパイルを行っても同じ遅延時間(4.584ns)となっていた。

FPGAに回路を追加したり、SDCファイルを少し変えただけで信号遅延時間がコロコロ変わるのは非常に扱いづらい。そこで、本題のIOEに内蔵されたレジスタが活躍する。これはFPGAの各I/Oピンの直近に固定配置されたレジスタで、出力用/入力用/OutputEnable制御用の3つがある。今回はOutput Registerを使用する。
MAX10 IOEの構造図

IOEのOutput Registerの使い方はとっても簡単だ。
・・・とその前に、Output Registerを使用するためには、最終段のFFからFPGAの出力ポートの間に組み合わせ回路を入れてはならないという制約事項がある。上のブロック図からも明白なように、Output Registerから出力ポートまでに組み合わせ回路を入れられる構造を持たないからだ。また、この制約のおかげで遅延時間が最小かつ固定にできているとも言える。
今回、PHYへの信号はすべてFF出しとなっているため、この制約をクリアする。
PHY制御信号生成部のRTL Viewer抜粋

まず、プロジェクトの解析と論理合成フェーズまでを完了しておく。
次にQuartusツールバーのAssignments => Assignments Editorを起動する。
Toの<<new>>を選択し、Node FinderからOutput Registerを使用したいポート名を入れて検索する。
Node Finderで対象の信号を追加

信号を右側のNodes Foundに追加したあと、OKを押すと以下のようにAssignments Editorに追加される。
Assignments Editorに追加された様子

次に、黄色くなっているAssignment Nameに”Farst Output Register"を選択し、Valueを"on"にする。一行設定できれば、複数の行を選択してCtrl + C, Ctrl + Vで一括で設定できる。設定が完了すると、Status欄にチェックマークがつく。
Status欄にチェックが付けばOKだ

ここまでできたら、フルコンパイルを実行して、制約内容を配置配線に反映させる。
以上でIOEのOutput Registerを使用する設定は完了だ。
なお、今回は出力ポートを指定したが、RTLのレジスタ名を指定して制約を掛けることもできる。

コンパイルが完了したら、再びTiming Analyzerを起動して、遅延時間を確認してみよう。OutputRegisterに割り当てられたことで、CLKを除く各信号の遅延時間が2.345~2.386nsに収まっている。出力ポートまでの遅延時間が短くなっていることに加えて、信号間のばらつきが小さくなっていることにも注目したい。(From:6.662 - 5.407 = 1.255ns、To:2.386 - 2.345 = 0.041ns)
内部レジスタからポートまでの遅延時間解析結果(Output Register使用後)

FPGAから出力されるバス信号の出力遅延が揃うことで、タイミングマージンを確保しやすくなり、等長配線の効果も発揮される。

ここで再びPHYのタイミング制約を満たしているか確認してみよう。
クロックのほうがデータよりも遅延時間が長くなったため、以下のように算出できる。
 セットアップタイムは 4.584 - 2.386 = 2.198ns (min 1.8ns OK)
 ホールドタイムは 6.666 - 2.198 = 4.468ns (min 1.3ns OK)
今度はホールドタイムのほうがマージンが大きい結果となった。
セットアップタイム/ホールドタイムの計算

これで、PHYのタイミング制約を満たすことができた。実際の評価ボードでも、安定した映像出力を確認できた。

更にマージンを確保するためには、位相差を微調整した2出力のPLLクロックにて、CLK信号とデータ信号を生成する方法が考えられる。今回は使用しなかったが、今後タイミング関連で嵌ったときには試してみたい。

それでは楽しいFPGAライフを!

■参考資料
https://www.intel.co.jp/content/dam/altera-www/global/ja_JP/pdfs/literature/hb/max-10/ug_m10_gpio_j.pdf
https://timetoexplore.net/blog/video-timings-vga-720p-1080p
https://www.analog.com/jp/products/adv7513.html


2019年4月11日木曜日

HTC10(HTV32)バッテリ交換

3年近く使っているHTC10のバッテリ劣化が深刻なため、交換を行った。
なお、交換時にディスプレイのタッチパネルを破壊してしまったため、正確にはディスプレイ+バッテリの交換となる。

【交換費用】
トータルで掛かった費用は約5,000円。
ディスプレイの破損が無ければ3,000円程度で済んだ。
  • HTC用バッテリ:$10.99 (AliExpress)
  • ディスプレイ:$17.38 (AliExpress)
  • ヒートガン:\1,598 (Amazon)
  • T5トルクスドライバー (手持ち品)

【準備物】
①交換用バッテリ
分解用の簡易工具と両面テープが付属。
(Store: ALPHASC Store)


②交換用ディスプレイ
こちらにもバッテリと同様の工具類が付属。
(Store: iPerfectParts Store)


③ヒートガン
Amazonで安くてそこそこ評価の良いものを選択。
(https://www.amazon.co.jp/gp/product/B07N2PN2QC)
温風は200℃と謳われているが、粘着剤を緩める用途には十分。温風出口が絞られており、局所的な加熱に適している。
熱収縮チューブの収縮作業も問題なく行えた。


④トルクスドライバー(T5)
ベースからメイン基板を取り外す際に使用。


【作業】
作業開始前に重要なデータは必ずバックアップすること。特にGoogle認証システムアプリなど、他のWebサービスに影響が出るものは予め別の端末にコピーしておくと安心。
Youtubeの分解動画がとても参考になる。内部構造を把握しておくと分解時のダメージを最小にできる。
なお、作業される場合は自己責任で。

1.micro SDカード、SIMカードの取り出し
刺さったままだとベースをケースから引き外す際に干渉する。


2.ディスプレイの取り外し
この作業は最も時間がかかるが、慎重に行う。
軍手をして周囲をじっくり加熱してから吸盤とピックを使ってこじ開けていく。
内部のフレキ配線やカメラなどに接触して破壊しないように、ピックの差し込みは2~3mm程度に留めておく。
ディスプレイが完全に外れたら念の為動作確認をしておくと安心。
この段階で既にタッチパネルを破壊していたのかもしれませんが、確認し忘れ・・・。




3.ケースとベースの分離
数本のプラスネジを外してベース(メイン基板やバッテリが搭載されたフレーム部品)とケースを分離する。
ネジを全て外しても、頑固に嵌合しているため、USBコネクタ付近からマイナスドライバー等で軽くこじってやると外しやすいかと思う。
ベースが分離できた段階で、以後の作業でショートによる破損を防止するためにバッテリのコネクタを外しておく。


4.メイン基板の取り外し
HTC10は、バッテリがメイン基板とベースにサンドイッチされた構造のため、メイン基板を外さないとバッテリが外れない。
T5のトルクスドライバーを使用して外す。


5.バッテリ交換
バッテリは両面テープでベースとがっちり接着されている。
鋭利な金属工具で無理やり剥がすと、セルを突き破って最悪の場合発火の危険性があるため、プラスチック製のヘラなどでゆっくり剥がしていく。



6.組み立てと動作確認
バッテリ交換が完了したら逆の手順で組み立てる。
ケースとディスプレイを固定する粘着剤は、1回程度の分解なら十分再利用可能。(防水スマホではないので)
粘着剤の毛羽が立っている場合は、ヒートガンで軽く熱してやると丸く収まって作業性が改善する。

組み立てて動作確認をしたところ、タッチパネルの上部に帯状に不感帯が出来ていた。
まさかタッチパネルを破損させるとは思っていなかったので、すぐに交換用ディスプレイを発注。
不感帯の領域がちょうどChromeのアドレスバーに被るため最悪の使い心地となるが、画面回転機能を駆使してなんとかやりくりした。
以下スクショで線が直角に折れ曲がってる区間が不感帯となっている。



7.ディスプレイ交換
ディスプレイを注文して1週間ほどで到着したので交換。
タッチパネルの動作はバッチリ。交換用ディスプレイには、粘着剤が塗布されていないため、付属の粘着シートを細くカットして固定する。

以上で交換作業は終了。


【交換後の使用感】
交換前は、朝100%充電状態でも仕事から帰る際にはほぼ電池切れ状態、バッテリ残量30%程度でカメラを起動すると突然電源が落ちるなどの症状があったが、朝充電しておけば夜まで5,60%を維持する程度に回復した。
バッテリ残量表示も正しい値を示すようになり、残容量5%でカメラを起動しても電源が落ちるなどの寿命末期症状はなくなった。

HTC10を購入したのは2016年6月頃なので、おおよそ3年前となる。
真夏に車のダッシュボードに取り付けて、充電しながらナビを使用したり、急速充電を多用していたのもバッテリ劣化を加速させた要因かもしれない。
リチウムイオン電池は高温状態での使用・保管と、満充電状態での保管により急速に劣化が進む。
電池の寿命を労るのであれば、本体が高温状態となる急速充電を避けるのが良いと思う。

これまでの劣化状況を鑑みると、あと2年は十分戦えそうだ。
それまでに新機種に乗り換える可能性もあるが、分解してより愛着が湧いたので、しばらくはこのまま運用してみようと思う。

【便利メモ】
  • HTC診断ツールの起動:*#*#3424#*#*
  • 参考にした動画:
    https://youtu.be/T5uLJJnEHMk
    https://youtu.be/OIAXFCHbiU0

[2019/11/15追記]
バッテリ交換して7ヶ月程度ですが、バッテリ交換前のようなヘタリ具合に戻りました・・・。バッテリ自体も膨張しており危険なため常用は諦めてPixel4に移行しました。

以上

2017年8月23日水曜日

【備忘録】風呂のドアノブ取替え

実家に帰省した際に、錆びて動かなくなったドアノブを交換したのでメモっておく。次回、同様の症状が発生した場合に、何年耐えたのか、どこが錆びやすかったのか振り返るのが目的。

作業日:2017/8/19 土

毎日高湿度に曝され、結露を繰り返す風呂場のドアノブは錆びやすい。
最近のユニットバスなら勿論対策されているだろうが、実家の風呂の扉はアルミサッシの旧式で、ラッチが錆びてドアが閉まらなくなることが屡々。
手で触れる部分はステンレスで出来てるが、内部のラッチは鉄に何かしらのメッキがされたものが多い。オールステンレスの製品もある、、特にこのような環境だとそれを選択するべきだ。

今回は時間がなかったので、端折って近所のホームセンターでインテグラル錠を買ってきた。鍵をかける必要なんて全くないんだけど、サイズが合うのがこれしかなかったのだ。ずっと実家に居るなら通販でじっくり選んで替えるのだが。5000円ちょいと良いお値段。肝心のラッチはステンレスでは無い。

せっかくなので、グリスによる防錆効果の実験を兼ねて、一緒に購入したリチウムグリスをベタベタに塗ってやった。

次に錆びて動かなくなるのは何時になるだろう、5年耐えれば万々歳なんだがー。これで年に2,3回の帰省も楽しみになりますね(?)








2017年7月19日水曜日

本州最北端に行ってきた

連休を貰えたので、7/8(土)~7/17(月)にジムニーで本州最北端へ行ってみました。
目的地は大間崎です。京都から出発し、下道メインで行きは日本海側、帰りは太平洋側を通ってぐるっと一周しました。
道中、ニコ技イベントの”NT金沢”や、”ウマイ肉を食う会”にも参加しました(^^)。

【目的地着 7/12(水)】
大間崎はマグロ一本釣りが有名な町らしいです。
この日は少し曇っていて強風でしたが、昼過ぎころからバイク乗りの方が大勢来てました。カモメが可愛かった(・∀・)



宿は道の駅(=車中泊)が殆どです。ジムニーはリアシートを外して助手席を倒せば、ほぼフラットな面が出来るので、そこに布団を敷けば快眠できます。8泊ほど車中泊しましたが、疲れが溜まることは無かったです。朝は蒸し暑さで目が覚めますが・・・

車中泊仕様にすると以下のようになります。
無駄に明るかったりミクさんが寝てたりしますが、おおよそこんな感じです。
177cmの私が足を伸ばしてギリギリといったところなので、高身長の方は少し窮屈かもしれません。

出発してからの経由地と宿、風呂をざっとまとめておきます。
(夏休みの日記的なノリで書いています。ピンぼけはご了承下さい。)
■1日目 7/8(土)
・移動:京都(綾部) → 石川(金沢)
・宿:道の駅 内灘サンセットパーク
・風呂:満天の湯 金沢店
NT金沢に一緒に乗っていく方がいましたので、ここだけ高速を使いましたw 
昼頃に金沢に到着し、NT金沢を見学したり、酒の飲み比べをしました🍶
夜はNT出店勢と金沢のソウルフード(?)な第7ギョーザを食べに行きました。
店についてからギョーザを口にするまで1.5hくらいかかったので、予約をおすすめします。

■2日目 7/9(日)
・移動:石川(金沢) → 新潟(糸魚川)
・宿:道の駅 親不知ピアパーク
・風呂:満天の湯 魚津天 (マタカヨw)
夕方まで引き続きNT金沢を見学。トークセッションなどでfmfmした後に出展者と晩飯兼打ち上げ。
この日の夜から本州最北端に向かって下道をトコトコ走る旅の始まりです~~。

■3日目 7/10(月)
・移動:新潟(糸魚川)→長野(美ヶ原高原とか、大町エネルギー博物館とか)→新潟(村上)
・宿:道の駅 笹川流れ 夕日会館
・風呂:逃して入れず・・・w
この日は寄り道して長野県入り。大町ダム(濁流でしたが)や大町エネルギー博物館、ビーナスラインのある道の駅 美ヶ原高原美術館に行きました。黒部ダムへと続く扇沢駅まで行きましたが、ダムの見学は見送り。。また今度見に行きます。エネルギー博物館は、水力発電機の実物や、アルミニウム電解槽用の大電流直流発電機など、ぱわみのある装置が展示していて見応えがありました。深夜にだいぶ走りましたが、何時までたっても新潟から出られず、長さを実感できましたw







■4日目 7/11(火)
・移動:新潟(村上)→ 青森(横浜)
・宿:道の駅 よこはま 菜の花プラザ
・風呂:よごしやま温泉
この日はほぼ移動。途中、秋田県で”TDK歴史みらい館”(http://www.tdk.co.jp/museum/)を見学。
TDKが誕生してから現在に至るまでに作られた様々な部品や商品を展示しています。年表とともに部品や製品実物(分解されてたりする)がズラッと並んでおり、電気好き・家電好き・ジャンク好きには堪らんです。無線給電に使われるインバータや、IGBTのゲートトランス、大容量のコンデンサ等のパワエレ関連部品も多数展示されています。みらいエリアには、スマートハウスのブースが有り、SESUBを内蔵したタクトを振ることで、部屋の明かりをつけたり、天気予報を取得したりと近未来の生活を体験することができます。
平日なのでお客さんも少なく、じっくりと回れて良かったです。
入館料も無料ですので、秋田に行く機械があれば、是非寄ってみて下さい!







■5日目 7/12(水) ★目的地到着★
・移動:青森(横浜) → 本州最北端の地 → 福島(国見)
・宿:道の駅 国見 あつかしの郷
・風呂:極楽湯 古川店
朝早くから出発し、昼前に大間崎に到着。写真撮ったりお土産を買ったりした後、かもめ食堂で海鮮丼を食べてまったり帰路へ。お土産屋で現金を切らしてたことに気づき、本州最北端のゆうちょATMにお世話になるなど・・・
お土産屋のおばちゃんがフレンドリーな方で、帰り際に写真を撮ってくれました。



■6日目 7/13(木)
・移動:福島(国見)→ 静岡(小山)
・宿:道の駅 ふじおやま
・風呂:湯楽の里 土浦店
折角の機会なので、福島原発に行けるところまで最接近してみました。帰宅困難区域は許可車両しか入れず、迂回をしながら富岡駅付近で一服。除染土砂を運搬するダンプが沢山走っていました。
原発近くの住宅は、空き巣に入られないように柵がしており、電柱には監視カメラがついています。人の手が入ってない道路や民家には草が生い茂り、人工物が徐々に自然に飲み込まれていくような不思議な光景がいくつも見られました。

■7日目 7/14(金)
・移動:静岡(小山)→ 愛知(愛西)
・宿:道の駅 立田ふれあいの里
・風呂:尾張温泉
ひたすら移動。1人回転寿司行ったり、ハードオフ行ったりと。
カツ丼店(かつや)がエエ感じです。牛丼感覚でカツ丼食える店が地元にも欲しい~
尾張温泉はバブル期にできた哀愁漂う感じの温泉でした。首の日焼けがヒリヒリ傷んだけどいい湯でした♨


■8日目 7/15(土)
・移動:愛知(愛西)→ 大阪(岬町)
・宿:道の駅みさき 夢灯台
・風呂:天然温泉 平野台の湯(朝風呂)
三重、和歌山の端を通って紀伊半島をぐるりと走りました。途中、九鬼駅や本州最南端の道の駅 くしもと橋杭岩に寄り道。銭湯に行こうと思ったら着替えがないことに気づき、コインランドリー回してるうちに閉店。なので、朝風呂ですw




■9日目 7/16(日)
・移動:大阪(岬町)→ 兵庫(東加古川)
・宿:NT金沢まで一緒に行った方の家
・風呂:忘れて肉食ってました
時間に余裕があったので、ジムニーのオイル交換をしました。久しぶりにディーラです。
前回交換から5,866kmぶり、エレメントは13,920kmぶりで使いすぎた感がありますが・・・。店内展示のアルトワークスに座ってシフトレバーの操作感を味わった。欲しいっすよコレ。
夜になり、兵庫県のとあるお店でウマイ肉を無限に食べました。
わさび塩で頂くのが非常に美味い。もう普通の焼肉屋には行けねぇ~ぜ(゚∀゚)





■10日目 7/18(月)
・移動:兵庫(東加古川)→ 京都(綾部)帰宅
・宿:自宅
・風呂:奥香の湯
ウマイ肉をお腹いっぱいに食べて、夜の街をうろついてたせいか、翌日の昼まで若干の二日酔いに襲われるなど。いつ寝たのか覚えていませんが、目覚めたら見慣れない部屋にいました。朝からアナログな単焦点レンズが欲しくなって困る・・・。The 光学機器って感じに精密に作り込まれたレンズの絞りをカチカチ変えて、変化するボケ具合に感動した(沼)。
昼飯を食った後、5人ほどで鋳造でできた橋(神子畑鋳鉄橋)を見に行きました。
日本に現存している全鋳鉄製の橋としては最も古いモノみたいで、国指定文化財に登録されています。
その後、温泉に浸かってせんべい工場を見学した後、帰宅しました。
ウマイ肉→川遊び→温泉 って流れで最高のお盆休み最終日(感)でした。




【数値で振り返る】
・日数:9泊10日
・総移動距離:3,778km
・給油量:約230L
・平均燃費:約16.4km/L
⇒ 割りとエコカー

【次行くなら・学びなど】
・GPSロガーほしい、Google Mapにもログを取れる機能が有るらしい・・?
・爪切りほしい・髭剃必要
・小型の扇風機ほしい
・シャツと下着は日数分 or (1/2日数分)ほしい。ズボンは3着で十分。タオルはすぐに乾くので、3枚あれば足りる。
 ⇒ コインランドリー行くのが面倒&勿体無いので
・真夏の車中泊は、太陽が顔を出すとすぐ蒸し暑くなるので、早寝早起きを徹底したい
・写真沢山撮ろう
・良さ気な温泉は案外早く閉まるので、20時くらいまでには入っとこう
・深夜の移動は道が空いてて効率的だが、睡魔に襲われる。そしてつまらん。早朝に移動したほうが良い
・どこに行っても(クソ僻地は除く)快適に使えるWimaxは便利
・ワンプッシュで蚊を消せるスプレーは必須。窓を空かしててもほぼ大丈夫だった
・塩コショウパスタはつらい。やっぱり卵は必要でしょう・・・
・車中泊最高ʅ( ◔౪◔)ʃ

次は北海道に行ってみたいですねー
舞鶴からフェリーが出ているようなので、バイク乗せて行きたい。
車中泊ではなくて、テントを張ってのキャンプは経験ないのですが・・・

~おわり~