PICマイコンの開発環境であるMPLAB X IDEに備わっているデバッグ用のプログラミング言語Stimulus Control Languageを使って、自作のPICプログラムをデバッグしてみる記録です。今回は変数と型について調べます。今回の内容はMicrochipのチュートリアルに書いてあった情報も参照しています。
変数
変数名
SCLでは変数を使えます。変数名として使える文字は半角英数字とアンダースコア(‘_’)で、先頭の文字は英字でなければなりません。また大文字・小文字は区別します。
変数の定義はこのようにします。
variable 変数名1, 変数名2, 変数名3, … : 型;
同じ型の変数はカンマで区切って複数同時に宣言できます。もちろん一つの変数だけでも構いません。型については次節で説明します。
変数の宣言
変数の宣言はprocess
ブロックの中のbegin
の直前に記述します。begin
とend
の中に書くとエラーになるので注意しましょう。
testbench for "pic16f1705" is begin process is variable v1, v2, v3 : integer; // beginの前に書く variable x1 : bit; begin wait; end process; end testbench;
自動的に宣言される変数
PICのSFR(Special Function Register)に対応する変数が自動的に生成されます。変数名はSFR名と同じです。SFR内のフィールドはピリオド(‘.’)を挟んでフィールド名を指定することで参照できます。例えばADCON0
レジスタのADON
フィールド(bit0)は、「ADCON0.ADON
」で参照できますし、複数ビットで構成されるCCP1CON
レジスタのCCP1M
フィールド(bit3~bit0)も「CCP1CON.CCP1M
」で参照可能です。それぞれのフィールドにビット値’1’及びビット列”1011″を代入する場合の文はこんな感じです。
ADCON0.ADON <= '1'; // bit型 CCP1CON.CCP1M <= B"1011"; // bit_vector型(多分)
型
SCLで扱うデータはすべて型を持ちます。型には最初から組み込まれている型のほか、ユーザが独自に型を定義することもできます。
組み込み型
SCLでは最初から定義済みの型があり、大きく分けて3種類の基本型(スカラー型、列挙型、物理量型)と配列型があります。
スカラー型
ある数値の範囲を表す型です。
型名 | 意味 |
---|---|
integer | 符号付き32ビット整数 (-2,147,483,647~+2,147,483,647) |
byte | 符号無し8ビット整数 (0~0xFF) |
word | 符号無し16ビット整数 (0~0xFFFF) |
daddress | 符号無し24ビット整数 (0~0xFFFFFF) |
paddress | 符号無し24ビット整数 (0~0xFFFFFF) |
列挙型
特定の値のみ取ることができる型です。
型名 | 取りうる値 |
---|---|
bit | ‘0’, ‘1’ (数字の0と1ではなく1文字の’0’と’1’であることに注意) |
boolean | false, true |
character | ‘ ‘, ‘!’, ‘”‘, ‘#’, ‘$’, ‘%’, ‘&’, ”’, ‘(‘, ‘)’, ‘*’, ‘+’, ‘,’, ‘-‘, ‘.’, ‘/’, ‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’, ‘:’, ‘;’, ‘<‘, ‘=’, ‘>’, ‘?’, ‘@’, ‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’, ‘G’, ‘H’, ‘I’, ‘J’, ‘K’, ‘L’, ‘M’, ‘N’, ‘O’, ‘P’, ‘Q’, ‘R’, ‘S’, ‘T’, ‘U’, ‘V’, ‘W’, ‘X’, ‘Y’, ‘Z’, ‘[‘, ‘\’, ‘]’, ‘^’, ‘_’, ‘`’, ‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’, ‘g’, ‘h’, ‘i’, ‘j’, ‘k’, ‘l’, ‘m’, ‘n’, ‘o’, ‘p’, ‘q’, ‘r’, ‘s’, ‘t’, ‘u’, ‘v’, ‘w’, ‘x’, ‘y’, ‘z’, ‘{‘, ‘|’, ‘}’, ‘~’ |
severity_level | note, warning, error, failure |
file_open_kind | read_mode, write_mode, append_mode |
file_open_status | open_ok, status_error, name_error, mode_error |
vector_file_mode | binary_mode, hex_mode, formatted_mode, dec_mode |
物理量型
何らかの物理量を表す型で、単位を持ちます。
型名 | 取り得る単位 | 単位の意味 |
---|---|---|
time | ps | ピコ秒 |
ns | ナノ秒 | |
us | マイクロ秒 | |
ms | ミリ秒 | |
sec | 秒 | |
min | 分 | |
hr | 時間 | |
cycle | ic | 命令サイクル |
frequency | hz | Hz |
khz | kHz (=1000Hz) | |
mhz | MHz (= 1000kHz) | |
voltage | mV | ミリボルト |
V | ボルト (=1000mV) |
単位は定数を指定するときに使います。例えば10マイクロ秒待つ、という文を書く場合は「wait for 10 us
」のように数値の後ろに空白文字を挟んで単位を記述します。
配列型
基本となる型の値を並べて参照できるようにした型です。
型名 | 基本となる型 |
---|---|
bit_vector | bit |
string | character |
しかし配列型の使い方がよく分からない。宣言時に配列サイズは指定しなくてよいのか、process中伝承する場合の添え字の指定の仕方、などなど。ここは後日調べようと思います。
ユーザ定義型
ユーザ独自の型を定義できます。
スカラー型の定義
取り得る値の最小値と最大値を指定して型を定義します。
type 型名 is range 最小値 to 最大値;
列挙型の定義
取りうる値を列挙して型を定義します。
type 型名 is (値1, 値2, …);
物理量型の定義
取りうる値の範囲と単位を指定して型を定義します。
type 型名 is range 最小値 to 最大値 units 基本単位; 拡張単位1 = 指数 基本単位; 拡張単位2 = 指数 拡張単位1; ... end units;
ちょっと分かりにくいので、組み込み型voltageの定義はこうなっています。
type voltage is range -9223372036854775807 to 9223372036854775807 units mV; V = 1000 mV; kV = 1000 V; end units;
配列型の定義
以下のように、基本型を指定して型を定義します。
type 型名 is array (integer range<>) of 基本型;
例えばbit_vector型の定義はこのようになります。
type bit_vector is array (integer range <>) of bit;
コメント