(char *)VRAM_BASEADDR + Y * 80 + Xのアドレスに書き込む.
ソース | コメント |
---|---|
#include <xparameters.h> #define VRAM_BASEADDR (char *)XPAR_CGA_0_S00_AXI_BASEADDR #define XSIZ 60 #define YSIZ 39 char what( int , int ); void v_puts( int , int , char * ); void v_putc( int , int , char ); static char data1[XSIZ][YSIZ] = { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { 1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }, { 0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } }; static char data2[XSIZ][YSIZ]; int main() { int i,j,num; static char *banner = "Microblaze Softcore Processor Video System"; v_puts( 0, 0, banner ); /* Character table */ for( j=0; j<16; j++ ){ for( i=0; i<16 ; i++ ) { v_putc( i+64, j+9, 16*j+i ); } } /* Right side wall */ for( i=0 ; i<44 ; i++ ) { v_putc( 79, i, i%10 + '0' ); } /* Bottom wall */ for( i=0 ; i<80 ; i++ ) { v_putc( i, 44, i%10 + '0' ); } /* Clear DATA2 array */ for( i=0; i<XSIZ; i++ ){ for( j=0 ; j<YSIZ ; j++ ) { data2[i][j] = 0; } } while(1) { for( i=0; i<XSIZ; i++ ){ for( j=0 ; j<YSIZ ; j++ ) { num=0; if( what(i-1,j-1) ) num++; if( what(i-1,j ) ) num++; if( what(i-1,j+1) ) num++; if( what(i ,j-1) ) num++; if( what(i ,j+1) ) num++; if( what(i+1,j-1) ) num++; if( what(i+1,j ) ) num++; if( what(i+1,j+1) ) num++; if( what(i,j) ) { if( num == 2 || num == 3 ) data2[i][j]=1; else data2[i][j]=0; } else if( num == 3 ) data2[i][j]=1; } } for( i=0; i<XSIZ; i++ ){ for( j=0 ; j<YSIZ ; j++ ) { data1[i][j] = data2[i][j]; v_putc( XSIZ-i-1, j+5, data2[i][j] ? '@' : ' ' ); data2[i][j] = 0; } } /* Busy wait */ for( i=0; i<256; i++ ){ for( j=0 ; j<1000 ; j++ ) { v_putc( 79, 0, i ); } } } } char what( int i, int j) { if( i < 0 ) return 0; if( j < 0 ) return 0; if( i == XSIZ ) return 0; if( j == YSIZ ) return 0; return data1[i][j]; } void v_puts( int x, int y, char *str ) { while( *str != '\0' ) { v_putc( x++, y, *str++ ); } } void v_putc( int x, int y, char ch ) { volatile char *addr; addr = VRAM_BASEADDR + (y*80 + x); *addr = ch; } |
|
※ Vitis/Vivado 2023.2 の場合,この操作で新しいVitisが起動するため,以降の操作が大きく異なります.
以降の説明と同じ操作で設計を進めるのであれば,"Vitis Classic" を起動してください.
libs: echo "Compiling cga..." $(COMPILER) $(COMPILER_FLAGS) $(EXTRA_COMPILER_FLAGS) $(INCLUDES) $(LIBSOURCES) $(ARCHIVER) -r ${RELEASEDIR}/${LIB} ${OUTS} make cleanを以下のように3行コメントにする
libs: echo "Compiling cga..." # $(COMPILER) $(COMPILER_FLAGS) $(EXTRA_COMPILER_FLAGS) $(INCLUDES) $(LIBSOURCES) # $(ARCHIVER) -r ${RELEASEDIR}/${LIB} ${OUTS} # make clean