パルテノン講習会
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
swLEDR (確認)
swLEDG (演習)
swHEX0 (確認)
swHEXN(演習)
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
© Copyright 2026 ExpyDoc