以前より気になっていました。Xilinx Spartan-6 の 評価キットがようやく出てきました。
詳細は http://japan.xilinx.com/products/boards_kits/spartan6.htm にあります。
評価キット[EK-S6-SP601-G-J]は Spartan-6 XC6SLX16-CS324-2CES を搭載、価格は$295で あとはいつ入手できるか です!
1.FPGA仕様
ロジックセル 14,579 ブロックRAM 72Kバイト
旧スタータキット(HW-SPAR3AN-SK-UNI-G 価格$199)搭載の Spartan-3 XC3S700 の ロジックセル 13,248 ブロックRAM 45Kバイトに比べると ひとつ上の XC6SLX25 搭載が順当とも思われ、少々残念。
2.キット仕様
・Flashメモリ 64MB パンフレットでは 256Mb とある。
・RAM 128MB DDR2 パンフレットでは 128Mb とある。
・クロック 200MHz
・LAN 10/100/1000 Ethernet
・GPIO FMC-LPC connector という コネクタで 64ピンの信号が取れるようです。
なんと言っても、このキットの魅力は、「FPGA自体にMemory Controller Blockが搭載されていることで、128MBのDDR2が利用できるらしい!」と言うことです。
現在、ALTERA CycloneIII のスタータキットを使っていますが、キット搭載の32MB DDR を利用しようとして、メモリコントローラを構成したのですが、ピンアサインでエラーが発生、仕方なくFPGA内部に64KBのメモリを構成し何とか凌いでいます。
また、気になる点が GPIO(UserI/O)のほとんどが専用コネクタ(FMC-LPCと言う規格らしい)になり。対応のケーブル、サブボートが必要になりそうな点です。Xilinxの従来のキット(Spartan-3A DSP 3400A )でも使用されているコネクタなので、なんとかなるようですが、少々不安。
>> 現時点で、このコネクタ(FMC-LPC)から、UW-SCSIケーブルコネクタ(らしき)への変換サブボードが存在するみたいですが、詳細不明 個人的には、UW-SCSIの内部コネクタへの変換サブボードがあれば、80線のフラットケーブルにGPIOが引き出されるのでありがたいのですが。。。
3.購入について、
USの購入サイトAvnet,NuHorizons を覗いてみると、価格は上記定価で、Xilinx出荷6週間となっている。発売開始が6週間後ということでしょう。8月中に入手できればと思います。
2009年6月25日木曜日
LPC2388 GCCによる開発 メモ 中間まとめ
未だ、CQ出版 Interface誌 LPC2388付録基板のベースシステムの構築が出来ていません。
1.IRQによる割り込み処理のハンドリング。
1)実装するIRQ
ベースシステムのIRQ例外処理のはとりあえず。
・システムの稼動チェック(ハートビート)用に TIMER0の割り込み。
・LCD(SG12864ASLB-GB-R01)のリフレッシュ用に TIMER1の割り込み。
・Key入力用(タクトスイッチのON/OFFスキャン用)に TIMER3の割り込み。
・システム汎用にTIMER2の割り込み。
・シリアル通信受信用のUART1の割り込み。
を、使用します。
2)IRQのハンドリング(手法1) >> 今のところ不調
I誌のgcc用のサンプルを利用
(1)IRQハンドリング関数は CPU_IRQInterrupt(void)を使用
gcc_sample.cで定義/宣言され、startup.sでIRQ割り込みとして呼び出される。
(2)IRQハンドリング関数で VICIRQStatus による分岐で各IRQ割り込み処理を実行する。
/* CPU割り込み処理 */
void CPU_IRQInterrupt(void)
{
switch(VICIRQStatus)
{
case INT_IRQ_TIMER0:
// for Timer0 IQR Interrupt
TIMER0_IRQInterrupt(); // システム監視 ハートビート
/* タイマ割り込みクリア */
TIMER_InterruptReset(&TIMER_0);
break;
case INT_IRQ_TIMER1:
// for Timer1 IQR Interrupt
Lcd_IRQ_Handler(); // LCDリフレッシュ
/* タイマ割り込みクリア */
TIMER_InterruptReset(&TIMER_1);
break;
case INT_IRQ_TIMER2:
----------------------------
3)IRQのハンドリング(手法2)
(1)ハンドリング関数は CPU_IRQInterrupt(void)を使用 (手法1と同じ)
(2)それぞれのIRQ例外処理関数のアドレスを VICVectAdd4,VICVectAdd5,,,にセットする。
(3)IRQハンドリング関数で VICVectAddr にセットされた関数のアドレスを使用して、各タイマー、UARTのIRQ例外処理を実行する。
※IRQ例外処理側 (関数ポインタの扱い)
void (*pfunc)(); // 関数ポインタ宣言
pfunc = VICVectAddr; // 関数のアドレスを代入
(*pfunc)(); // IRQ例外処理関数のCall
VICVectAddr = 0x00000000; //IRQアドレスクリア(※訂正)
※IRQ設定側
extern void Sys_IRQInterrupt( void ); //IRQ例外処理関数(TIMER0)
/* ↑ 同一ソースファイル内で定義されていれば不要 */
--------------
VICVectAddr4 = (u32)Sys_IRQInterrupt; // IRQ例外処理関数のアドレスをセット
2.ARMモード/Thumbモードについての注意事項
1)ARMモードでの標準ライブラリ(libc.a, libm.a等)の指定
LIBRARY_DIRS = -L /usr/local/arm-tools/arm-elf/lib -L /usr/local/arm-tools/lib/gcc/arm-elf/4.4.0
2)Thumbモードでの標準ライブラリ(libc.a, libm.a等)の指定
LIBRARY_DIRS = -L /usr/local/arm-tools/arm-elf/lib/thumb -L /usr/local/arm-tools/lib/gcc/arm-elf/4.4.0/thumb
※一部でもARMモードのモジュールがあると、標準ライブラリを組み込む場合、リンク時にinterworkのワーニングが出、動作が怪しくなる。
※gccパッケージのインストールでconfigureオプション--enable-interworkを指定しているのにワーニングが出るのが不可解。
3.リンクスクリプトファイル
FreeRTOSのサイトから次のソースをダウンロード
FreeRTOSV5.2.0/デモ/[ARM7_LPC2368_Eclipse]/RTOSDemoの lpc2368.ld を修正し利用。
1)ramサイズを64Kに変更
2)usbramを16Kに変更
※※※※訂正※※※※
手法2の動作確認 不調 >> 最初の1歩に戻り再検証
①再度 CQ出版 I誌から再び、gcc_sample を 入手
● 5/13 gcc用サンプル・プログラム アップデート(gcc_sample.zip)
②gcc_sample.zipを解凍、gcc_sampleをビルド
③基板上のLEDの点滅を確認 [手法1の IRQで呼び出される関数でLEDを点滅]
④gcc_sample.cを手法2で出来るように修正
**修正箇所**
a. define
/* 割り込みコントローラ(VIC) */
#define VIC_BASE_ADDR 0xFFFFF000
#define VICVectAddr4 (*(volatile unsigned long *)(VIC_BASE_ADDR + 0x110))
#define VICVectAddr (*(volatile unsigned long *)(VIC_BASE_ADDR + 0xF00))
b.IRQハンドラー関数
/* TIMER0 割り込み処理 */
void TM0_IRQInterrupt(void)
{
if( toggle == 0 ) {
toggle = 1;
*FGPIO_FIO1PIN =0x00000000; /* P1[18,19] '0' -> LED ON */
} else {
toggle = 0;
*FGPIO_FIO1PIN =0x000C0000; /* P1[18,19] '1' -> LED OFF */
}
*TIMER_T0IR =1; /* タイマ割り込みクリア */
}
/* CPU割り込み処理 */
void CPU_IRQInterrupt(void)
{
void (*pFunc)();
pFunc = (void*)VICVectAddr;
(*pFunc)();
VICVectAddr = 0x00000000; // VICVectAddr のクリア ※1 追加
}
c.Main関数
検証用にポート1の19ピンに繋がるLEDの点滅を加える。
/* タイマ割り込みLED点灯制御プログラム */
int main(void)
{
*SYS_SCS = *SYS_SCS | 1; /* FGPIO Select */
/* LED点灯制御設定 */
*FGPIO_FIO1DIR =0x000C0000; /* P1[18,19] OutPut */
*FGPIO_FIO1MASK=0x00000000; /* P1[18] Non Mask */
*FGPIO_FIO1PIN =0x000C0000; /* P1[18,19] '1' -> LED OFF */
----------
*TIMER_T0MR0 = 1000000; /* 供給クロック周波数=1秒 */
*TIMER_T0MCR = 0x00000003; /* Match時にTCクリア&割り込み */
VICVectAddr4 =(unsigned long )TM0_IRQInterrupt;
*TIMER_T0TCR = 1; /* タイマスタート*/
toggle = 0;
----------
**動作検証**
結局不調
TIMER0 割り込み処理 TM0_IRQInterrupt(void) の最初の割り込みの実行は確認
でもそれっきり。
**さらにもがく**
VICVectAddr = 0x00000000;(※1)をIRQハンドリング関数(IRQInterrupt)に追加
※※動作検証※※
ようやく成功。
1.IRQによる割り込み処理のハンドリング。
1)実装するIRQ
ベースシステムのIRQ例外処理のはとりあえず。
・システムの稼動チェック(ハートビート)用に TIMER0の割り込み。
・LCD(SG12864ASLB-GB-R01)のリフレッシュ用に TIMER1の割り込み。
・Key入力用(タクトスイッチのON/OFFスキャン用)に TIMER3の割り込み。
・システム汎用にTIMER2の割り込み。
・シリアル通信受信用のUART1の割り込み。
を、使用します。
2)IRQのハンドリング(手法1) >> 今のところ不調
I誌のgcc用のサンプルを利用
(1)IRQハンドリング関数は CPU_IRQInterrupt(void)を使用
gcc_sample.cで定義/宣言され、startup.sでIRQ割り込みとして呼び出される。
(2)IRQハンドリング関数で VICIRQStatus による分岐で各IRQ割り込み処理を実行する。
/* CPU割り込み処理 */
void CPU_IRQInterrupt(void)
{
switch(VICIRQStatus)
{
case INT_IRQ_TIMER0:
// for Timer0 IQR Interrupt
TIMER0_IRQInterrupt(); // システム監視 ハートビート
/* タイマ割り込みクリア */
TIMER_InterruptReset(&TIMER_0);
break;
case INT_IRQ_TIMER1:
// for Timer1 IQR Interrupt
Lcd_IRQ_Handler(); // LCDリフレッシュ
/* タイマ割り込みクリア */
TIMER_InterruptReset(&TIMER_1);
break;
case INT_IRQ_TIMER2:
----------------------------
3)IRQのハンドリング(手法2)
(1)ハンドリング関数は CPU_IRQInterrupt(void)を使用 (手法1と同じ)
(2)それぞれのIRQ例外処理関数のアドレスを VICVectAdd4,VICVectAdd5,,,にセットする。
(3)IRQハンドリング関数で VICVectAddr にセットされた関数のアドレスを使用して、各タイマー、UARTのIRQ例外処理を実行する。
※IRQ例外処理側 (関数ポインタの扱い)
void (*pfunc)(); // 関数ポインタ宣言
pfunc = VICVectAddr; // 関数のアドレスを代入
(*pfunc)(); // IRQ例外処理関数のCall
VICVectAddr = 0x00000000; //IRQアドレスクリア(※訂正)
※IRQ設定側
extern void Sys_IRQInterrupt( void ); //IRQ例外処理関数(TIMER0)
/* ↑ 同一ソースファイル内で定義されていれば不要 */
--------------
VICVectAddr4 = (u32)Sys_IRQInterrupt; // IRQ例外処理関数のアドレスをセット
2.ARMモード/Thumbモードについての注意事項
1)ARMモードでの標準ライブラリ(libc.a, libm.a等)の指定
LIBRARY_DIRS = -L /usr/local/arm-tools/arm-elf/lib -L /usr/local/arm-tools/lib/gcc/arm-elf/4.4.0
2)Thumbモードでの標準ライブラリ(libc.a, libm.a等)の指定
LIBRARY_DIRS = -L /usr/local/arm-tools/arm-elf/lib/thumb -L /usr/local/arm-tools/lib/gcc/arm-elf/4.4.0/thumb
※一部でもARMモードのモジュールがあると、標準ライブラリを組み込む場合、リンク時にinterworkのワーニングが出、動作が怪しくなる。
※gccパッケージのインストールでconfigureオプション--enable-interworkを指定しているのにワーニングが出るのが不可解。
3.リンクスクリプトファイル
FreeRTOSのサイトから次のソースをダウンロード
FreeRTOSV5.2.0/デモ/[ARM7_LPC2368_Eclipse]/RTOSDemoの lpc2368.ld を修正し利用。
1)ramサイズを64Kに変更
2)usbramを16Kに変更
※※※※訂正※※※※
手法2の動作確認 不調 >> 最初の1歩に戻り再検証
①再度 CQ出版 I誌から再び、gcc_sample を 入手
● 5/13 gcc用サンプル・プログラム アップデート(gcc_sample.zip)
②gcc_sample.zipを解凍、gcc_sampleをビルド
③基板上のLEDの点滅を確認 [手法1の IRQで呼び出される関数でLEDを点滅]
④gcc_sample.cを手法2で出来るように修正
**修正箇所**
a. define
/* 割り込みコントローラ(VIC) */
#define VIC_BASE_ADDR 0xFFFFF000
#define VICVectAddr4 (*(volatile unsigned long *)(VIC_BASE_ADDR + 0x110))
#define VICVectAddr (*(volatile unsigned long *)(VIC_BASE_ADDR + 0xF00))
b.IRQハンドラー関数
/* TIMER0 割り込み処理 */
void TM0_IRQInterrupt(void)
{
if( toggle == 0 ) {
toggle = 1;
*FGPIO_FIO1PIN =0x00000000; /* P1[18,19] '0' -> LED ON */
} else {
toggle = 0;
*FGPIO_FIO1PIN =0x000C0000; /* P1[18,19] '1' -> LED OFF */
}
*TIMER_T0IR =1; /* タイマ割り込みクリア */
}
/* CPU割り込み処理 */
void CPU_IRQInterrupt(void)
{
void (*pFunc)();
pFunc = (void*)VICVectAddr;
(*pFunc)();
VICVectAddr = 0x00000000; // VICVectAddr のクリア ※1 追加
}
c.Main関数
検証用にポート1の19ピンに繋がるLEDの点滅を加える。
/* タイマ割り込みLED点灯制御プログラム */
int main(void)
{
*SYS_SCS = *SYS_SCS | 1; /* FGPIO Select */
/* LED点灯制御設定 */
*FGPIO_FIO1DIR =0x000C0000; /* P1[18,19] OutPut */
*FGPIO_FIO1MASK=0x00000000; /* P1[18] Non Mask */
*FGPIO_FIO1PIN =0x000C0000; /* P1[18,19] '1' -> LED OFF */
----------
*TIMER_T0MR0 = 1000000; /* 供給クロック周波数=1秒 */
*TIMER_T0MCR = 0x00000003; /* Match時にTCクリア&割り込み */
VICVectAddr4 =(unsigned long )TM0_IRQInterrupt;
*TIMER_T0TCR = 1; /* タイマスタート*/
toggle = 0;
----------
**動作検証**
結局不調
TIMER0 割り込み処理 TM0_IRQInterrupt(void) の最初の割り込みの実行は確認
でもそれっきり。
**さらにもがく**
VICVectAddr = 0x00000000;(※1)をIRQハンドリング関数(IRQInterrupt)に追加
※※動作検証※※
ようやく成功。
登録:
投稿 (Atom)