岡田/春のプロジェクト/第11回
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[岡田/春のプロジェクト]]
*第11回 CPUの設計(2) Verilog HDLによる記述 [#kc0fc589]
**Keyword [#m2293305]
-define、include、CPU、機械語プログラミング、算術論理演算回路、ステート・マシン、テストベンチ、シミュレーション
***各種定数の定義 [#r77e7c21]
状態、算術論理演算、機械語命令を識別するための定数をdefine文を用いて宣言する。~
→defs.vを作る。
&br;
&br;
includeするには、`include "defs.v"とファイルの1行目に記述する。
**TINYCPUの制御信号 [#d3b210e9]
||制御信号|関係モジュール・バス|CENTER:値が1のときの動作|
|1|halt|state0|EXECAからIDLEに状態遷移|
|2|cout|state0|EXECAからEXECBに状態遷移|
|3|pcinc|pc0|プログラム・カウンタの値を1増加|
|4|push|stack0|スタックをプッシュ|
|5|pop|stack0|スタックをポップ|
|6|abus2pc|abus,pc0|abusの値をpc0に書き込む|
|7|dbus2ir|dbus,ir0|dbusの値をir0に書き込む|
|8|dbus2qtop|dbus,stack0|dbusの値をstack0に書き込む|
|9|dbus2ram|abus,dbus,ram0|ram0のabusで指定された番地にdbusの値を書き込む|
|10|dbus2obuf|dbus,obuf0|dbusの値をobuf0に書き込む|
|11|pc2abus|pc0,abus|pcoutの値をabusに書き込む|
|12|ir2abus|ir0,abus|irout[11:0]の値をabusに書き込む|
|13|ir2dbus|ir0,dbus|irout[11:0]の値の符合拡張をdbusに書き込む|
|14|qtop2dbus|stack,dbus|qtopの値をdbusに書き込む|
|15|alu2dbus|alu0,dbus|aluoutの値をdbusに書き込む|
|16|ram2dbus|ram0,dbus|ramoutの値をdbusに書き込む|
|17|in2dbus|dbus|inをdbusに書き込む|
**TINYCPUの制御信号論理 [#kbf8fbee]
|CENTER:命令|CENTER:FETCHA|CENTER:FETCHB|
|すべて|pcinc,pc2abus|ram2dbus,dbus2ir|
&br;
|CENTER:命令|CENTER:EXECA|CENTER:条件|
|HALT|halt|CENTER:-|
|PUSH I|ir2dbus,dbus2qtop,push|CENTER:-|
|PUSH A|ir2abus,cout|CENTER:-|
|POP A|ir2abus,qtop2dbus,dbus2ram,pop|CENTER:-|
|JMP A|ir2abus,abus2pc|CENTER:-|
|JZ A|ir2abus,abus2pc,pop|qtop==0のとき|
|JZ A|pop|qtop!=0のとき|
|JNZ A|ir2abus,abus2pc,pop|qtop!=0のとき|
|JNZ A|pop|qtop==0のとき|
|IN|in2dbus,dbus2qtop,push|CENTER:-|
|OUT|qtop2dbus,dbus2obuf,pop|CENTER:-|
|OP f|alu2dbus,dbus2qtop,pop|irout[4]==0のとき|
|OP f|alu2dbus,dbus2qtop|irout[4]==1のとき|
|OP f|alu2dbus,dbus2qtop|irout[4]!=0のとき|
&br;
|CENTER:命令|CENTER:EXECB|
|PUSH A|ram2dbus,dbus2qtop,push|
**カウントダウンを行う機械語プログラムとアセンブリ言語プログラム [#c14643c4]
1 000:D000 IN
2 001:300C POP n //000番地と001番地で入力ポートinから取得したデータが変数nに格納される。
3 002:200C L1: PUSH n
4 003:E000 OUT //002番地と003番地でnの値を出力バッファoutに書き込む。
5 004:200C PUSH n
6 005:500B JZ L2 //004番地と005番地でnが0か否か判定する。 0の場合はラベルL2、つまり00B番地に
7 006:200C PUSH n 分岐し、HALT命令により停止する。 0でなければ、そのまま006番地以降を実行する。
8 007:1001 PUSHI 1
9 008:F001 SUB
10 009:300C POP n //006番地から009番地でnから1引いた値をnに格納する。
11 00A:4002 JMP L1 //00A番地ではラベルL1、つまり002番地に分岐する。
12 00B:0000 L2: HALT
13 00C:0000 n:0
#comment
終了行:
[[岡田/春のプロジェクト]]
*第11回 CPUの設計(2) Verilog HDLによる記述 [#kc0fc589]
**Keyword [#m2293305]
-define、include、CPU、機械語プログラミング、算術論理演算回路、ステート・マシン、テストベンチ、シミュレーション
***各種定数の定義 [#r77e7c21]
状態、算術論理演算、機械語命令を識別するための定数をdefine文を用いて宣言する。~
→defs.vを作る。
&br;
&br;
includeするには、`include "defs.v"とファイルの1行目に記述する。
**TINYCPUの制御信号 [#d3b210e9]
||制御信号|関係モジュール・バス|CENTER:値が1のときの動作|
|1|halt|state0|EXECAからIDLEに状態遷移|
|2|cout|state0|EXECAからEXECBに状態遷移|
|3|pcinc|pc0|プログラム・カウンタの値を1増加|
|4|push|stack0|スタックをプッシュ|
|5|pop|stack0|スタックをポップ|
|6|abus2pc|abus,pc0|abusの値をpc0に書き込む|
|7|dbus2ir|dbus,ir0|dbusの値をir0に書き込む|
|8|dbus2qtop|dbus,stack0|dbusの値をstack0に書き込む|
|9|dbus2ram|abus,dbus,ram0|ram0のabusで指定された番地にdbusの値を書き込む|
|10|dbus2obuf|dbus,obuf0|dbusの値をobuf0に書き込む|
|11|pc2abus|pc0,abus|pcoutの値をabusに書き込む|
|12|ir2abus|ir0,abus|irout[11:0]の値をabusに書き込む|
|13|ir2dbus|ir0,dbus|irout[11:0]の値の符合拡張をdbusに書き込む|
|14|qtop2dbus|stack,dbus|qtopの値をdbusに書き込む|
|15|alu2dbus|alu0,dbus|aluoutの値をdbusに書き込む|
|16|ram2dbus|ram0,dbus|ramoutの値をdbusに書き込む|
|17|in2dbus|dbus|inをdbusに書き込む|
**TINYCPUの制御信号論理 [#kbf8fbee]
|CENTER:命令|CENTER:FETCHA|CENTER:FETCHB|
|すべて|pcinc,pc2abus|ram2dbus,dbus2ir|
&br;
|CENTER:命令|CENTER:EXECA|CENTER:条件|
|HALT|halt|CENTER:-|
|PUSH I|ir2dbus,dbus2qtop,push|CENTER:-|
|PUSH A|ir2abus,cout|CENTER:-|
|POP A|ir2abus,qtop2dbus,dbus2ram,pop|CENTER:-|
|JMP A|ir2abus,abus2pc|CENTER:-|
|JZ A|ir2abus,abus2pc,pop|qtop==0のとき|
|JZ A|pop|qtop!=0のとき|
|JNZ A|ir2abus,abus2pc,pop|qtop!=0のとき|
|JNZ A|pop|qtop==0のとき|
|IN|in2dbus,dbus2qtop,push|CENTER:-|
|OUT|qtop2dbus,dbus2obuf,pop|CENTER:-|
|OP f|alu2dbus,dbus2qtop,pop|irout[4]==0のとき|
|OP f|alu2dbus,dbus2qtop|irout[4]==1のとき|
|OP f|alu2dbus,dbus2qtop|irout[4]!=0のとき|
&br;
|CENTER:命令|CENTER:EXECB|
|PUSH A|ram2dbus,dbus2qtop,push|
**カウントダウンを行う機械語プログラムとアセンブリ言語プログラム [#c14643c4]
1 000:D000 IN
2 001:300C POP n //000番地と001番地で入力ポートinから取得したデータが変数nに格納される。
3 002:200C L1: PUSH n
4 003:E000 OUT //002番地と003番地でnの値を出力バッファoutに書き込む。
5 004:200C PUSH n
6 005:500B JZ L2 //004番地と005番地でnが0か否か判定する。 0の場合はラベルL2、つまり00B番地に
7 006:200C PUSH n 分岐し、HALT命令により停止する。 0でなければ、そのまま006番地以降を実行する。
8 007:1001 PUSHI 1
9 008:F001 SUB
10 009:300C POP n //006番地から009番地でnから1引いた値をnに格納する。
11 00A:4002 JMP L1 //00A番地ではラベルL1、つまり002番地に分岐する。
12 00B:0000 L2: HALT
13 00C:0000 n:0
#comment
ページ名: