「FPGA」カテゴリーの記事一覧

2015-10-01

LSI/FPGAの回路アーキテクチャ設計法

森岡澄夫著の本を読んでいる.2012年発行の本なので,もう少し早く読めば良かった.最適な回路アーキテクチャを最初から手戻りなく設計できないってのが身に浸みて理解できた.
9章までと10章からは違う本にしても良い感じ.

続きを読む
2015-01-07

シーケンサーのalways文のトリガー

シーケンサーというのはステートマシンのステートの遷移を担当する回路のことだ.always文で書くのだが,clkで仕事させれば良かろうと思い,

always @(posedge clk)

で作ってみると,動いたり動かなかったり.

always @(CURRENT)

のようにステートをトリガにすると正しく動く.どっちも正しく動くように思えるんだけど,なぜclkではダメなのかなあ?

ステートを進める部品では,clkの度に

CURRENT<=NEXT

が実行される.

シーケンサーのメインは

case (CURRENT)

によるステート別処理だ.もしシーケンサーをclkで回すと,clkの度にCURRENTステータスをチェックする.このときのCURRENTはNEXTが代入される前のステートだよね....あー考えがまとまらない.この件は保留しよう.

 

ところで,なぜprocess文ではなくて,always文かって?

実は昨年末から20年以上使っていたVHDLからVerilog HDLに乗り換えたのだ.乗り換えた感想は,Verilog HDLの方がいいかげんで良く,またタイピングも少なくて済むので私には向いているということだ.もっと早く変えれば良かった.

続きを読む
2015-01-06

制約ファイルの伝承

ISEでプロジェクトの下にモジュールをたくさん作ると,生成した回路の出力が予期せぬハイインピーダンスになる現象の理由が分かった.ハイインピーダンスになったときは,ピン指定の制約ファイルが正しく読み込まれていなかったのだ.既に制約ファイルがある状態で新規にモジュールを作ると,新規モジュールのファイル名が既存モジュールのそれと似ているときは制約ファイルが引きつがれる.なので問題は生じない.新規モジュールのファイル名が既存モジュールのそれと全然似ていないときは,制約ファイルがないものと扱われる.制約ファイルがないので,所望の出力ピンには配線はされず,ハイインピーダンスになってしまっていた.

ISEのDesignパレットでHierarchyを注意深く見ると,制約ファイルがモジュール配下になっているかどうか見分けることができる.もし,モジュール配下に制約ファイルがない場合は,新たに制約ファイルを作れば良い.

続きを読む
2014-12-25

ISEのバグ

XilinxのISEは最終版14.7を使っている.今日も出力ピンがハイインピーダンスで固定されるという,先日出た現象が起きた.プロジェクトを新規に作り直すと直る.同じプロジェクトに対してモジュールをたくさん作ると発生する現象だ.バグの性質が分かっているので,落ち着いて対処できる.これくらいは許そう.クリスマスだしね.

続きを読む
2014-12-19

予期せぬラッチのなぞ

同期設計では「予期せぬラッチ」は禁じ手となっている.だけど,私はそれがなぜなのか知らない.次はこの問題を考えてみようと思う.例によってめちゃくちゃなこと言っているかもしれないので,鵜呑みにしないように.

同期設計では同一クロックで動くFFが組み合わせ回路を介して延々つながっている.予期せぬラッチってのは,その中のひとつがD-FFではなくD-ラッチになってしまうこと.クロックとは関係なしに入力データが出力される.これがなぜ悪いのか?

ラッチの出力先のFFにとっては迷惑な話だろう.組み合わせ回路2段分の遅延とラッチの遅延が加わったデータがやってくるのだ.それの変化が自分のセットアップ時間とホールド時間の間にたまたま入るかもしれない.そうなったらメタステーブルになってまずい.ラッチ生成が悪いのはこれで分かった.

じゃあ,予期せぬラッチではなくて,予期したラッチなら良いのかってことを考えよう.ラッチ出力を受けるFFのセットアップ時間より早くデータが到着してホールド時間より遅く次のデータが到着してって,待て待て.ラッチ出力を受けるFFはラッチのせいでクロックを1つ飛ばすなんて知らない.1つめのクロックでデータを受けようとするだろう.組み合わせ回路2段分がよほど軽い回路でない限り,セットアップ時間に間に合うとは思えない.じゃあ,間に合えば良いのか?たぶん良い.しかし配置配線ツールのセットアップ時間解析が混乱するだろう.組み合わせ回路2段分+ラッチをひとつの組み合わせ回路として解析しなくてはならない.こんなことを柔軟にやってくれるとは思えない.

結論:ラッチができるとツールが混乱するので,禁じ手なのだ.

続きを読む
2014-12-18

ホールドタイムの謎

めちゃくちゃなことを言っているかもしれないので,以下の記述を鵜呑みにしないように.

同期設計では,セットアップ時間よりも早くデータが到着して,そのデータがホールド時間よりも長く維持できていなくてはならないと思っていた.ところが,これが微妙に違っていることに気付いた.セットアップ時間は良いのだが,ホールド時間ってのは,現データを維持するのではなく,ホールド時間が終わるまでに次のデータが来てはいけないって制約らしい.本当か?じゃあ,次のデータが来なければ,ホールド時間中にデータが暴れても良いってこと?そんなはずはないと思うのだが,どうもそうらしい.

FFの中身に立ち戻って考えると理解できるのだろうか.FFの中身って,インバータが二組くるっと回って繋がっている(うわっ,誤解を生みそうな表現だ.インバータ2個のループ回路が前段と後段にあるという意味だ).クロックがHighになると前段のインバータの入り口が遮断される.遮断される直前に入力データが変わってしまうと,前段のインバータ出力が安定した値に落ち着かないかもしれないので,あんまり直前は困るよってのがセットアップ時間.ここまでは良い.

クロックがHighの間は入り口は遮断されているので,入力データがどんなに暴れていようと知ったことじゃない.ここまでも良い.そうこうしているうちにクロックはLowになる.すると入り口が繋がる.これからは入力データが変わると前段のインバータ入力が変わるので,前段の出力はころころ変わるかもしれない.ころころ変わっているのは良いが,次にクロックがHighになるちょっと前(セットアップ時間)までには変わるのは止めてくれよとなる.

これまで書いたことを振り返ると,クロックがHighになった後は入り口は遮断されている訳だから,入力データがどんなに暴れていてもかまわない.つまり,入力データが維持されていなくても良いってことになる.ホールド時間中にデータが暴れても良いってことだ.これで疑問の半分は解けた.もう半分の疑問は,ホールド時間中に次のデータが来てしまったらどうなるかってことだ.入り口が遮断されているのだから,次のデータが来ても良いじゃないかと思う.あれ?おかしいぞ.ホールド時間の意味が無いってことじゃないか.ええっ?どこで間違えたのだろう.

もっと考えてみよう.クロックで開閉するスイッチについて良く考えてみると,クロックがHighになってすぐにFFの入り口が遮断される訳じゃない.Highになってから徐々に遮断されていくだろう.遮断しきる前に入力データが変わってしまっては前段が不安定になる.これがホールド時間ってことじゃないだろうか.たぶんそうだ.これで残り半分の疑問も解決した.めでたし,めでたしかな.

続きを読む
2014-12-15

なぜにハイインピーダンス

Avnet製のS6LX150Tボードを使っているんだが,ある端子の信号がいくらやり直してもハイインピーダンスから動かない現象に悩んでいた.2日ほど悩んだ.ボードを変えてみたりしたが現象は変わらない.あきらめかかっていたんだが,もしやと思い,ISEのプロジェクトを新たに作ってから動かしてみたら解決してしまった.古いプロジェクトからの修正でいじっていたので,ゴミができていたのかもしれない.とりあえず良かった.

続きを読む