溜息日和

プログラミングとか機械学習とか統計力学とかいろいろ

順序回路

組合せ回路と順序回路の違い

  • 組合せ回路:出力が「現在の入力」で決まる回路
  • 順序回路:出力が「現在の入力」と「過去の入力で決まる値」から決まる回路
    • 過去の入力から決まる値を保持する変数(相当)が必要
    • 変数はflipflopやラッチといった記憶素子で実現する

基本的な約束事

順序回路を記述する上での約束事を書く

always文

always@(イベント式)遅延時間 ステートメント
あるいは
always #定数値 ステートメント
「定数時間を経過するごとに」という意味

イベント式には
  • 信号名・・・信号が立ち上がるとき,立ち下がるとき
  • posedge 信号名・・・信号が立ち上がるとき(positive edgeの略)
  • negedge 信号名・・・信号が立ち下がるとき(negative edgeの略)

イベント式に信号名だけを指定した場合,信号に変化があった場合にステートメントが実行される.
イベント式はorで区切って複数記述することが可能

reg宣言

値を保持する信号線を定義する.
順序回路で用いるフリップフロップやラッチなどはreg宣言が必要.
reg宣言を行った変数をレジスタ型変数と呼ぶ.
レジスタ型変数にはreg以外にもintegerなどがある.
レジスタ型変数への代入は,always文,initial文,task,functionの中で可能

ブロッキング代入文(=)とノンブロッキング代入文(<=)

ノンブロッキング代入をすることで.並列性のある命令の流れを記述することができる.

ムーア型とミーリ型

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の割り算

シフトを使わない

あまり深く考えず,割られる数が割る数より大きくなるまで差を繰り返し取り,その繰り返し回数が商で,残りが余り,という処理を記述してみた.

しかしながら,この処理だと高々何クロックで処理が終わるという予想が,冗長になりがちで,早い処理ではないような...

シフトを使ってみる

というわけでシフト演算を入れて実装してみる.
シフト演算を使った割り算が下記で,最適では無いような気もするが,処理修了までクロック見積もりが立つのでで良しとしたい.

コンテンツ一覧に戻る

広告を非表示にする