SoC演習資料

パルテノン講習会
SoC演習
奥山祐市
1
この講義の趣旨
• SoC編:snxcで遊ぼう!
– Memory Mapped I/Oを体験する
– おくやまの経験上、アセンブラでやると数日かかるこ
とを、snxcでは数分で記述できる
• オプション
– もうすでにわかっているひとは?
• 例題を使ってゲームなどを作ってみよう
• SFL/NSLについての話は出てきません
– 一言だけ・・・
– /home/DE2_70/rtl を参照
2
演習を始める前に
• 知っておくと良いこと
– make/makefile の知識
• UNIX文化の入り口・基礎
• 時刻の依存関係を基にした汎用的な自動化ツール
• これを機にぜひmakefileの読み方/作り方を習得しよう
– snxcの中身
• コンパイラはプログラミングの集大成
• これほど小さくて見通しのよいコンパイラは他にない
• snxcの中身を読めるようになろう
3
SoC演習編
• 周辺機器の制御
メモリマップドI/O (Memory mapped I/O)
• 実験で使う周辺機器とアドレスマップ
• snxcによるプログラミング
• 資料集
– 各種レジスタの説明
– 演習プログラムの説明
4
周辺機器の制御
• 周辺機器=ペリフェラル
• プロセッサは周辺機器をメモリの一部として扱う
• 周辺機器のコントローラは、レジスタを介して制
御を行う
プロセッサがアクセスできる領域
メモリアクセス
本当のメモリ
SN/X
ボタン
スイッチ
LED
7セグメントLED
LCD
VGA
5
imem
SN/Xと周辺機器の接続図
inst_read
inst_write
iadrs
inst
SN/X
はバスコントローラ
アドレスが担当するモジュール
の該当範囲に入った際に、周
辺機器レジスタの制御を行う
この制御はDE2_70.nslに記
述されている
memory_read
memory_write
adrs
datai
datao
KEY
SW
LED
LCD
HEX
VGA
dmem
外部機器との
やり取り
6
実験で使う周辺機器と
アドレスマップ
モジュール
名
開始アドレス
(ベースアドレス)
終了アドレス
大きさ
用途
dmem
0x0000
0x0FFF
2^12
データメモリ
KEY
0xA000
0xA000
2^0
プッシュボタン入力
SW
0xA001
0xA001
2^0
トグルスイッチ入力
LED
0xA002
0xA003
2^1
LED(赤16, 緑9)出力
HEX
0xA008
0xA00F
2^3
7-segment LED出力
LCD
0xA020
0xA03F
2^5
LCD(16x2)出力
VGA
0xC000
0xCFFF
2^12
VGA(80x24)出力
7
snxcプログラミング
• /home/SNX2/snxc2/SPEC.txtを参照
• C言語のサブセットとなっている
• 例
SW =0xA001
LED=0xA002
while(1)
mem[LED]=mem[SW];
8
ボードの制御
1. rtlディレクトリでmake; make downloadする
2. programsディレクトリでmakeする
(すべての.scファイルをコンパイルする)
3. programsディレクトリで
make <target>.writeでプログラムをダウンロード
4. Key0を押し、リセットをする
• 注:make <target>.write中にエラーが出るとボー
ドにアクセスできなくなる。その時は、1をやり直
す
9
資料集
10
KEY入力
• プッシュボタンKEY3, KEY2, KEY1入力を検出する
3
2
1
0
0xA000
KEY3
KEY2
KEY0
KEY1
• KEYを押すと0、KEYを離すと1になるので注意
• 下位4ビットのデータのみ保持
11
SW入力
• スイッチSW[15:0]入力を検出する
15
0xA001
14
13
3
2
1
0
………
• 16ビットのデータをフルに保持する。read可
能・writeは意味なし
12
LED出力
• LEDの出力
– 赤:LEDR[15:0] 緑:LEDG[8:0]
15
14
13
0xA002
(LED赤)
0xA003
(LED緑)
3
2
1
0
3
2
1
0
………
9
………
• read/write 可能
13
HEX出力(1)
• 8つの7-segmant LEDへの出力
3
8
2
1
0
………
………
0xA008
0xA00F
………
14
HEX出力(2)
• 一つの7-segment LEDは・・・
– それぞれのビットは
{dp, g, f, e, d, c, b, a}
として対応付けられている
• 意味のある数字を表示する
ためには、一工夫必要
dp
– 08keyTo7seg.scを参照
15
LCD出力
• LCDは16桁x2行の表示領域を持つ
• 入力にはASCIIコード+拡張コードを入れる
3
7
2
1
0
………
………
0xA020
0xA03F
………
16
ASCII+拡張
コード対応表
VGA出力(1)
• 128x32のメモリ領域
• 80x30の表示領域がある
• コマンド領域がある
128
80
32
30
コマンド領域
/home/DE2_70/rtl/VGA
/README.txt
を参照
表示可能領域の外に
隠れている
18
VGA出力(2)
• 一つのキャラクタを表示するには
– 色指定+(ASCII+拡張)コード
15
0xCxxx
12
11
8
…
…
前景色(4bit)
3
7
2
1
0
文字コード(8bit)
• 80(x) x 32 (y) のどこに文字を置くか?
Address
= VGA +
0
………
背景色(4bit)
11
1
7
…
y座標(5bit)
2
6
………
x座標(7bit)
19
プログラム一覧(1)
01swToLedR.sc
02swToLedG.sc
03swToHex0.sc
04swToHexN.sc
05swToLcd.sc
06swToVga.sc
07keyToLed.sc
08keyTo7seg.sc
09keyToEdge.sc
swLEDR (確認)
swLEDG (演習)
swHEX0 (確認)
swHEXN(演習)
ASCII表示(確認)
ASCIIと色の表示(確認
key入力(確認)
7segパターン(確認)
keyのエッジ検出(確認)
20
プログラム一覧(2)
10wait.sc
11lcdMsg.sc
12vgaMsg.sc
13edgeHex4.sc
14stopWatch.sc
15stwOnLcd.sc
16stwOnVga.sc
99vgaTest1.sc
99vgaTest2.sc
特定の時間待つ (確認・演習)
LCDにメッセージを表示 (確認・演習)
VGAにメッセージを表示 (確認・演習)
ストップウォッチの叩き台(確認)
ストップウォッチ(LED版)の作成
ストップウォッチ(LCD版)の作成
ストップウォッチ(VGA版)の作成
VGAテストパターン(確認)
VGAテストパターン(確認)
21