付録 I I 計算システム評価ボード 105
II.4 評価ボードの使い方
DIPスイッチを用いて設定する。ベースアドレスは0x0000 0xf8まで8byteを単位 として設定できる。例えば図I I.15のように設定すると0xf0 0xf7までを使用する
(下位3bitは設定しても無視される)。このとき、OFFが1でONが0である。当然、
他のデバイスが使用していないアドレスを使用する。この場合、表II.9のようにマッピ ングされる。このような設定をした後、ISA BUSに装着する。
ON OFF
図 II.15 DIP スイッチ15
表 I I.9 インターフェースカードのI/Oマッピング
I/O アドレス 割り当て
Base Address ポートA 下位
Base Address + 1 ポートA 上位
Base Address + 2 ポートB 下位
Base Address + 3 ポートB 上位
Base Address + 4 ポートC 下位
Base Address + 5 ポートC 上位
Base Address + 6 コントロール ワード 下位
Base Address + 7 コントロール ワード 上位
II.4
評価ボードの使い方
インターフェースのI/Oポートのモード
コンフィグレーションで使用するインターフェースの端子は、C0 C1 C2 C8 C9 C10
B14 B15 である。このため、インターフェースのI/Oポートのモードは表I I.10のよう に設定しなければならない。他のポートは自由に設定できる。
15ファイル名: ./g2/ifdip.eps
II.4 評価ボードの使い方 122
表 II.10 インターフェースのI/O ポートのモード
ポートC 下位 出力 C2:nCONFIG C1:DLCKC0:DATA0
ポートC 上位 出力 C8 C9 C10: FLEX選択
ポートB 上位 入力 B14:nSTATUSB15:CONF DONE
コンフィグレーション後のモード変更
PPI8255はモードを変更すると全ての出力バッファを0にクリアする。このため、
モードを 変更する と、nCONFIGがLowにさ れてしまい、FPGAが コンフィグ レー ションモードに入ってしまう事がある。これを防ぐには以下のことを行う必要がある。
1. ポートC上位は出力にする。
2. コンフィグレーションのあとは、FPGAの選択を000に設定する。
コンフィグレーション後に使用可能な端子
コンフィグレーションを行った後は、ポートC上位に000を出力していれば、他の ポートは自由に使用できる。
FLEX 2ndのコンフィグレーション
Bポー ト 上 位 は コ ン フィ グ レー ショ ン 時 にFLEX 2ndか ら ド ラ イ ブ さ れ る。 も し
FLEX1stで使用している場合はFLEX1stの端子をハイインピーダンスか入力にして おく必要がある。
FLEX 1stのコンフィグレーションプログラム
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <dos.h>
#define BASE_8255 0xfff0
#define P_A BASE_8255
#define P_B BASE_8255 + 2
#define P_C BASE_8255 + 4
II.4 評価ボードの使い方 123
#define P_AL P_A
#define P_AH P_A + 1
#define P_BL P_B
#define P_BH P_B + 1
#define P_CL P_C
#define P_CH P_C + 1
#define P_CTRL_L P_CTRL
#define P_CTRL_H P_CTRL + 1
#define DATA0 0x1
#define DCLK 0x02
#define nCONFIG 0x04
#define CONF_DONE 0x40
#define nSTATUS 0x80
/* A:in m0 B:in m0 CH:in CL:out 0x9A */
/* A:in m0 B:in m0 CH:out CL:out 0x92 */
/* A: mode2 BL: out BH: in CL3: out CH3: in 0xDB(H) 0xD8(L) */
int main(int argc, char *argv[])
{
long i;
printf("TTF Downloader for FLEX10K100 Eval. Board.\n");
if(argc != 2)
{
printf("usage : flex10k foo.ttf \n");
exit(1);
}
FILE *fp;
if ((fp = fopen(argv[1], "rt") == NULL){
fprintf(stderr, "%s を開けません\n",argv[1]);
return 1;
}
outp( P_CTRL , 0xC8);
outp(P_CTRL_H , 0xCA );
outp(P_CL,0xff);
outp(P_CH,0x04);
{
printf("nSTATUS = H Check...");
unsigned char a;
a = inp(P_BH) & nSTATUS;
if ( a != nSTATUS ){
printf("nSTATUS が High でない\n");
exit(1);
}
printf("OK!\n");
}
outp(P_CL , 0 );
printf("nCONFIG PLUS Check...");
while(1)
{
unsigned char a;
a = inp(P_BH) & nSTATUS;
if ( a != nSTATUS ) break;
}
outp(P_CL , nCONFIG );
while(1)
{
II.4 評価ボードの使い方 124
a = inportb(P_BH) & nSTATUS;
if ( a == nSTATUS ) break;
}
printf("OK!\n");
for (i = 0l ; i < 8l ; i++)
{
outp( P_CL , nCONFIG | 1 );
outp( P_CL , nCONFIG | DCLK | 1);
}
printf("Now Downloading...");
for ( i= 0l ; i < 150000l ; i++){
unsigned char c;
int c1;
if ( EOF == fscanf(fp,"%d,",&c1) ) break;
int j;
c = c1;
for ( j=0l ; j< 8l ; j++){
outp( P_CL , nCONFIG | ( c & 1 ) );
outp( P_CL , nCONFIG | DCLK | ( c & 1 ) );
c >>= 1;
}
if ( (inp( P_BH ) & 0xC0 ) == 0xC0 ) break;
if ( i == 149132l )
{
printf("Abnormal end.\n");
exit(1);
}
}
if ( i != 149131l)
{
printf("Abnormal end.\n");
exit(1);
}
for (i = 0l ; i< 8l ; i++)
{
outp( P_CL , nCONFIG );
outp( P_CL , nCONFIG | DCLK);
}
printf("Normal end.\n");
outp(P_CH,0x00);
return 0;
}
FLEX 2ndのコンフィグレーションプログラム
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <dos.h>
#define BASE_8255 0xfff0
#define P_A BASE_8255
#define P_B BASE_8255 + 2
#define P_C BASE_8255 + 4
#define P_CTRL BASE_8255 + 6
#define P_AL P_A
II.4 評価ボードの使い方 125
#define P_BL P_B
#define P_BH P_B + 1
#define P_CL P_C
#define P_CH P_C + 1
#define P_CTRL_L P_CTRL
#define P_CTRL_H P_CTRL + 1
#define DATA0 0x1
#define DCLK 0x02
#define nCONFIG 0x04
#define CONF_DONE 0x40
#define nSTATUS 0x80
/* A:in m0 B:in m0 CH:in CL:out 0x9A */
/* A:in m0 B:in m0 CH:out CL:out 0x92 */
/* A: mode2 BL: out BH: in CL3: out CH3: in 0xDB(H) 0xD8(L) */
int main(int argc, char *argv[])
{
long i;
printf("TTF Downloader for FLEX10K100 Eval. Board.\n");
if(argc != 2)
{
printf("usage : flex10k foo.ttf \n");
exit(1);
}
FILE *fp;
if ((fp = fopen(argv[1], "rt") == NULL){
fprintf(stderr, "%s を開けません\n",argv[1]);
return 1;
}
outp( P_CTRL , 0xC8);
outp(P_CTRL_H , 0xCA );
outp(P_CL,0xff);
outp(P_CH,0x05);
{
printf("nSTATUS = H Check...");
unsigned char a;
a = inp(P_BH) & nSTATUS;
if ( a != nSTATUS ){
printf("nSTATUS が High でない\n");
exit(1);
}
printf("OK!\n");
}
outp(P_CL , 0 );
printf("nCONFIG PLUS Check...");
while(1)
{
unsigned char a;
a = inp(P_BH) & nSTATUS;
if ( a != nSTATUS ) break;
}
outp(P_CL , nCONFIG );
while(1)
{
unsigned char a;
a = inportb(P_BH) & nSTATUS;
if ( a == nSTATUS ) break;
printf("OK!\n");
for (i = 0l ; i < 8l ; i++)
{
outp( P_CL , nCONFIG | 1 );
outp( P_CL , nCONFIG | DCLK | 1);
}
printf("Now Downloading...");
for ( i= 0l ; i < 150000l ; i++){
unsigned char c;
int c1;
if ( EOF == fscanf(fp,"%d,",&c1) ) break;
int j;
c = c1;
for ( j=0l ; j< 8l ; j++){
outp( P_CL , nCONFIG | ( c & 1 ) );
outp( P_CL , nCONFIG | DCLK | ( c & 1 ) );
c >>= 1;
}
if ( (inp( P_BH ) & 0xC0 ) == 0xC0 ) break;
if ( i == 149132l )
{
printf("Abnormal end.\n");
exit(1);
}
}
if ( i != 149131l)
{
printf("Abnormal end.\n");
exit(1);
}
for (i = 0l ; i< 8l ; i++)
{
outp( P_CL , nCONFIG );
outp( P_CL , nCONFIG | DCLK);
}
printf("Normal end.\n");
outp(P_CH,0x00);
return 0;
}