7セグメントLEDペリフェラル(Cinerariaの周辺I/Oその2) [FPGA]
今回はカスタムじゃないけどピン配がわかりにくいコンポーネントの説明。
DE0用NiosIIプラットフォーム、Cinerariaのダウンロードはこちらから
→ https://t.co/8kMHg0u0
・7セグメントLEDコンポーネント
・ハードウェア
DE0ボードに載っている7セグメント×4連のLEDを制御するコンポーネント。
ペリフェラルのクラスはPIOコンポーネントの32bit出力タイプのインスタンスをしているだけ。割り込みとかも特にないので、+0(データレジスタ)へデータをライトすればLEDが点灯する。
・ソフトウェア
LED_7SEG_BASEマクロで示されるレジスタアドレスは下記の通り
レジスタの各ビットとLEDのセグメントとの対応は下記の通り。
※各ビットは1=消灯、0=点灯なので注意すること。
・NiosIIからの使用方法
プログラム上は普通にPIOなのでとくに面倒なことは無く、ペリフェラルマクロが記述されている system.h と、IOアクセス関数の io.h をインクルードしてIOWR()で書き込みをするだけ。
ここで使っているIOWR()は該当アドレスのレジスタへ直接値を書き込むマクロで、内部的にはダイレクトライト命令に置換される。
NiosII /fはデータの読み書きは必ずライトバックキャッシュ経由で行うため、ペリフェラルへの読み書きのように即時性が必要なアドレスへのアクセスはI/Oコントロールマクロを使って行う。
横着してポインタで書き込むようなことをやると、プログラム上では書き込んでいるのにペリフェラルへは書き込まれてない、という挙動不明な状況になるから注意しよう。
・参考
Nios II ソフトウェア開発ハンドブック
ver 1.2 日本語版
→ http://www.altera.co.jp/literature/hb/nios2/n2sw_nii5v2_j.pdf
ver 10.1 最新英語版
→ http://www.altera.co.jp/literature/hb/nios2/n2sw_nii5v2.pdf
DE0用NiosIIプラットフォーム、Cinerariaのダウンロードはこちらから
→ https://t.co/8kMHg0u0
・7セグメントLEDコンポーネント
・ハードウェア
DE0ボードに載っている7セグメント×4連のLEDを制御するコンポーネント。
ペリフェラルのクラスはPIOコンポーネントの32bit出力タイプのインスタンスをしているだけ。割り込みとかも特にないので、+0(データレジスタ)へデータをライトすればLEDが点灯する。
・ソフトウェア
LED_7SEG_BASEマクロで示されるレジスタアドレスは下記の通り
+0x0 : LEDDATA
レジスタの各ビットとLEDのセグメントとの対応は下記の通り。
※各ビットは1=消灯、0=点灯なので注意すること。
・NiosIIからの使用方法
プログラム上は普通にPIOなのでとくに面倒なことは無く、ペリフェラルマクロが記述されている system.h と、IOアクセス関数の io.h をインクルードしてIOWR()で書き込みをするだけ。
#include <system.h>
#include <io.h>
int main(void)
{
IOWR(LED_7SEG_BASE, 0, ~0x7c5c5c78); // boot表示
while(1) {}
}
ここで使っているIOWR()は該当アドレスのレジスタへ直接値を書き込むマクロで、内部的にはダイレクトライト命令に置換される。
NiosII /fはデータの読み書きは必ずライトバックキャッシュ経由で行うため、ペリフェラルへの読み書きのように即時性が必要なアドレスへのアクセスはI/Oコントロールマクロを使って行う。
横着してポインタで書き込むようなことをやると、プログラム上では書き込んでいるのにペリフェラルへは書き込まれてない、という挙動不明な状況になるから注意しよう。
・参考
Nios II ソフトウェア開発ハンドブック
ver 1.2 日本語版
→ http://www.altera.co.jp/literature/hb/nios2/n2sw_nii5v2_j.pdf
ver 10.1 最新英語版
→ http://www.altera.co.jp/literature/hb/nios2/n2sw_nii5v2.pdf
2012-02-02 02:11