やかんです。
ハードウェア設計論の授業、めちゃむずくないですか。やっぱり工学部電気系学科すごいってことですかね。
実際、すごいと思う
ということで今日は順序機械をverilogで書いてみようと思います。授業で扱われた内容ですが、よくわからなかったので復習という形になります。
順序機械とは
ディジタル回路の講義の中で扱われたものですね。順序回路で構成される機械のことです。あるいは、順序回路のこと自体を順序機械と呼んでも大丈夫なはず。
あってる?
それまでの入力と、現在の入力から出力が決定される回路が順序回路です。これと対になった概念として組み合わせ回路がありますが、組み合わせ回路の方は現在の入力からのみ出力が決定されるという性質を持ちます。
順序回路、あるいは順序機械は過去の履歴を持ってるよ、みたいな話なはず。あるいは、状態(それまでの入力から決定される)を持つものが順序回路です、の方が正確な気がしてきた。
めっちゃシンプルな状態機械を例にする。
この例はハードウェア設計論の講義内で扱われたものです。
ざっくりいうと
- xという変数を用意する
- xが0より大きく15より小さければxに1を足し続ける
- xの値が15以上になる場合は1を引いていき、xの値が0以下にならないところまで引き続ける
日本語下手、、
まあ要はxの値が0と15の間に存在し続けるように演算を続けるよ、ということです。
まずは状態遷移図を書いてみる
正解は分かりませんが、順序回路を考えるときは状態遷移図から始めるのがセオリーなのかな?って勝手に思ってます。実際のところどうなのでしょうか。
まず、State0を定義します。ひたすら加算し続ける状態。
で、このXn+1の値が15より小さい場合はState0にとどまり続けます。
で、Xn+1の値が15に達するともう1つの状態に遷移します。
てなわけでState1を定義します。今になって思うと、状態は2つしか登場しないからState0とState1じゃなくてStateAとStateBとかの方がわかりやすかったかもですね。
で、State1についても同じことする。
というわけで、状態遷移図完成です。これをverilogじゃなくて論理回路で設計する場合は、それぞれの状態をbitで表現した上で状態遷移表を記述するんでしょうが、今回はverilogで作ることが目的なのでこの工程は不要です。
そしてverilogで表現する
一回、何も見ないで書いてみることにします。すごいポンコツコードが出来上がる気がしますが、ものは試しです。
やりたいこととしては
- 1クロックで同期させる
- 1クロックの中で以下3つを行いたい
- 状態の確認(State0なのかState1なのかの分岐)
- 状態に応じた演算
- 演算結果の出力
といったところでしょうか。これすらもあっているか分かりませんが、まあ一回やってみます。
…
はい。作業とりあえず終了。書いてみたコードがこちら。
module order_machine(
input wire clk, rst,
output wire[3:0] x
);
reg[0:0] state;
reg[3:0] x;
always @(posedge clk) begin
if(rst) begin
state <= 1'b0;
x <= 4'b0000;
end else begin
if(x == 0) state <= 1'b0;
if(x == 15) state <= 1'b1;
if(state == 1'b0) begin
x <= x + 4'b0001;
end else begin
x <= x - 4'b0001;
end
end
end
assign x = x;
endmodule
入力ポートがクロック(clk)とリセット(rst)の信号を受け取るために2つ、出力ポートがxの値を出力する用で1つ。内部にはstateを保持するレジスタと、xの値を保持するレジスタの2つを格納。
うーん、どうなんだろう。これは、もう電気系の友達に聞くしかないな笑
まとめ
書いてみたコードを電気系の友達に添削依頼します。
ということで、こちらの殴り書きは終了。最後までお読みいただき、ありがとうございます。