連載
» 2016年06月14日 14時00分 公開

MAX 10 FPGAで学ぶFPGA開発入門(11):「MAX 10 NEEK」でストップウォッチを開発し、内蔵メモリから起動する (4/10)

[大原 雄介,MONOist]

NIOS IIで動作するストップウォッチをプログラム

 さて次はNIOS II上で動作するプログラムの方だ。まずは第9回の手順と同じよう、" Nios II Application and BSP from Template "からHello Worldのテンプレートでアプリケーションを生成する(Photo07)。

photo Photo07:アプリケーションプロジェクト名は"stopwatch"とした

 このままでは文字通り、単なる「Hello World」なので、これをList 3のように書き換えた。

List 3:
#include <stdio.h>
#include "system.h"
#include "altera_avalon_pio_regs.h"
long	HEXtable[10] = {0x40,	// 0:1000000
			0x79,	// 1:1111001
			0x24,	// 2:0100100
			0x30,	// 3:0110000
			0x19,	// 4:0011001
			0x12,	// 5:0010010
			0x02,	// 6:0000010
			0x78,	// 7:1111000
			0x00,	// 8:0000000
			0x10	// 9:0010000
};
void LEDR_out(int num)
{
	if((num < 0)||(num > 9))	return;
	IOWR_ALTERA_AVALON_PIO_DATA(LEDR_BASE, 1 << num);
}
void HEX_out(int digit, int num)
{
	if((num < 0)||(num > 9))	return;
	if((digit < 0)||(digit > 2))	return;
	if(digit)
		IOWR_ALTERA_AVALON_PIO_DATA(HEX1_BASE, HEXtable[num]);
	else
		IOWR_ALTERA_AVALON_PIO_DATA(HEX0_BASE, HEXtable[num]);
}
int main()
{
	long	cnt=0, lpCnt;
	while(1)
	{
		LEDR_out(cnt);
		HEX_out(0, cnt);
		HEX_out(1, cnt);
		cnt++;
		if(cnt == 10)	cnt=0;
		for(lpCnt=0; lpCnt<300000; lpCnt++);
	}
  return 0;
}
List3

 一応簡単に説明すると、LEDR_outは一列に並んだLEDの指定桁(0〜9)のみを光らせる関数、HEX_outは7セグメントLEDを指定した値(0〜9)に点滅させる関数である。

 面白いのは、LEDRの方は指定した桁にあたるbitを立てると、それに対応するLEDが点滅する(例えば0x3FFを指定すれば全部点灯する)のに対し、7セグメントLEDは対応するbitを落とすと、そのセグメントが点灯する方式になっていることだ。

 ここに指定するbit fieldとセグメントの関係は

 となっており、そこで最初にHEXtable[]でそれぞれの数字に対応したbit patternを保持しておき、これをまとめて出力する形になっている。HEX_out(0,xxx)で1桁目を、HEX_out(1,xxx)で2桁目をそれぞれ表示する形だ。

 一方、これを呼び出すmain()は、見ての通りでcntという変数で0〜9を繰り返しながら表示させるだけの、純粋にテストプログラムである。実行するとMovie01の様に、7セグメントと10個のLEDが連動しながらきちんと表示されているはずだ。

関連キーワード

アルテラ | FPGA関連 | Eclipse


Copyright © ITmedia, Inc. All Rights Reserved.