順序回路
組合せ回路と順序回路の違い
- 組合せ回路:出力が「現在の入力」で決まる回路
- 順序回路:出力が「現在の入力」と「過去の入力で決まる値」から決まる回路
- 過去の入力から決まる値を保持する変数(相当)が必要
- 変数はflipflopやラッチといった記憶素子で実現する
基本的な約束事
順序回路を記述する上での約束事を書く
イベント式には
- 信号名・・・信号が立ち上がるとき,立ち下がるとき
- posedge 信号名・・・信号が立ち上がるとき(positive edgeの略)
- negedge 信号名・・・信号が立ち下がるとき(negative edgeの略)
イベント式に信号名だけを指定した場合,信号に変化があった場合にステートメントが実行される.
イベント式はorで区切って複数記述することが可能
ムーア型とミーリ型
Verilogではreg宣言でレジスタ(flipflopの塊)を宣言できる
『push1,push2,push3の順に押されたらledが点灯する回路』
上述のアルゴリズムはムーア型と呼ばれる.
その他の型としてミーリ型があり,それらは以下のように大別される
- ムーア型
長所: コンパクトな回路を合成でき高速になりがち
短所: 状態数がミーリ型よりも多くなりがち
- ミーリ型
長所: 状態数がムーア型より少なくなりがち
短所: 回路が大きくなりがち
ミーリ型ではalways文中で出力と状態遷移を一度に記述することができる.
クロックのリセット方法
クロックのリセットに関しても2種類があり
- 同期式リセット
長所: 上手くかけると回路がコンパクトになる
短所: 初期状態にするまでが大変
- 非同期式リセット
長所: 常に初期状態になるから設計が楽
短所: 回路が大きくなる
組合せ回路を順序回路で記述する
また,順序回路を,その動作の順番を状態とし,順序回路を作成できる.
順序回路で組合せ回路を作成するのは,一見冗長に見えるが,その実順序回路を用いると小さな回路になる.
順序回路において,全加算器は1つで足りることから,省メモリである.
しかしながら,設計の煩雑性からバグが生じやすく,また,動作が遅いことが知られている.
この動作の遅さを隠ぺいする技術として「パイプライン処理」がある.
順序回路の例
Verilog入門 - My Tips
で紹介されている順序回路を記す
LEDをチカチカ
クロックを使って状態遷移
暗号鍵
4bitの掛け算
状態遷移を併合し,簡単化
問題のヒントには
R_B[0]を変数idxで指定できれば,大幅に簡単化できる
とあり,R_Bとindexを与えれば,R_B[ idx]を返すファンクションを記述することを推奨している.
6bitの割り算
シフトを使わない
あまり深く考えず,割られる数が割る数より大きくなるまで差を繰り返し取り,その繰り返し回数が商で,残りが余り,という処理を記述してみた.
しかしながら,この処理だと高々何クロックで処理が終わるという予想が,冗長になりがちで,早い処理ではないような...
シフトを使ってみる
というわけでシフト演算を入れて実装してみる.
シフト演算を使った割り算が下記で,最適では無いような気もするが,処理修了までクロック見積もりが立つのでで良しとしたい.