2012/12/24 ver1.0 作成
琉球大学工学部情報工学科 和田 知久
0から31をゆっくりと数えるカウントプログラムをC言語で書くと、以下のようなことになる。
A=32であり、カウントの上限値を指定している。
BはB=1000000程度の値であり、点滅の遅延調整をする。
int count;
for (count = 0; count <
A; count++) {
LEDをcountの値に従って点灯させる;
/* 時間遅延のためのループ */
for
(delay = 0; delay < B; delay++) {
no operation
}
}
このプログラムによって、countの値はゆっくりと上昇する。
このcount値をメモリの最上位アドレス=508番地に書き込むと、その下位5ビットがLEDに転送されるようにHWが設計されている。
表5 データRAMの内容
|
|
データRAM |
|
|||||
バイトアドレス |
dramのAdd入力 |
00 |
01 |
10 |
11 |
|
||
256 |
0 |
A=32 |
|
|||||
260 |
1 |
B=大きな値 |
|
|||||
264 |
2 |
1 |
|
|||||
268 |
3 |
0 |
|
|||||
272 |
4 |
0 |
|
|||||
276 |
5 |
0 |
|
|||||
280 |
6 |
0 |
|
|||||
284 |
7 |
0 |
|
|||||
|
0 |
|
||||||
|
|
0 |
|
|||||
|
|
0 |
|
|||||
|
|
0 |
|
|||||
508 |
63 |
count値 |
|
|||||
表6 命令ROMの内容(バブルソートのプログラム)
|
|
命令ROMの内容 |
|
||||||
バイトアドレス |
iromのAdd入力 |
00 |
01 |
10 |
11 |
説明 |
|||
0 |
0 |
NOP |
No operation |
||||||
4 |
1 |
LW R5, 264(R0) |
R5<= 1 |
||||||
8 |
2 |
LW R1, 256(R0) |
R1 <= 32 (A) |
||||||
12 |
3 |
LW R2, 260(R0) |
R2 <= 大きな値 (B) |
||||||
16 |
4 |
ADD R3, R0, R0 |
R3 <= 0 (count値の初期化) |
||||||
20 |
5 |
LOOP1: SW R3, 508(R8) |
count値を508番地に転送 (LED点灯) |
||||||
24 |
6 |
ADD R4, R0, R2 |
R4 <= 最大値 (delay値の初期化) |
||||||
28 |
7 |
LOOP2: BEQ R4, R0, +2 |
delayループ脱出判定 なら10番地へ抜ける |
||||||
32 |
8 |
SUB R4, R4, R5 |
R4 <= R4 – 1; delay値を1下げる |
||||||
36 |
9 |
J 7 |
7番地へジャンプ、LOOP2 |
||||||
40 |
10 |
SLT R6, R3, R1 |
R3< R1=32ならR6 <= 1、違うならR6 <=0 |
||||||
44 |
11 |
BEQ R6, R0, +2 |
ループを超えたらループを抜ける14番地へ |
||||||
48 |
12 |
ADD R3, R3, R5 |
R3 <= R3 + 1 |
||||||
52 |
13 |
J 5 |
5番地へジャンプ、LOOP1 |
||||||
56 |
14 |
NOP |
No operation |
||||||
60 |
15 |
J 1 |
無限ループ |
||||||
64 |
16 |
|
|
||||||
68 |
17 |
|
|
||||||
72 |
18 |
|
|
||||||
76 |
19 |
|
|
||||||
80 |
20 |
|
|
||||||
84 |
21 |
|
|
||||||
88 |
22 |
|
|
||||||