Exemplo n.º 1
0
void fpga_debug(void)
{
	int i;
	unsigned long di=1;

	fpga_TWE(0);
	fpga_Control(20,0);
	fpga_setadrs(0);
	fpga_datset(0x000ff005a);
	SLT=0;
    SLT=1;
	Nop();
	SLT=0;
	fpga_datset(0x000000000);
	SLT=0;
    SLT=1;
	Nop();
	SLT=0;
	for (i=0;i<24;i++){
		fpga_datset(di<<i);
		SLT=0;
    	SLT=1;
		Nop();
		SLT=0;
	}
	fpga_datset(0x004000000);
	SLT=0;
    SLT=1;
	Nop();
	SLT=0;
	fpga_start();
	__delay_ms(100);

	fpga_setadrs(2032);
	for (i=0;i<24;i++){
		fpga_datset(di<<i);
		SLT=0;
    	SLT=1;
		Nop();
		SLT=0;
	}

	
}
Exemplo n.º 2
0
int main(void)
{
	int i, fp_id, num_bytes, pagesize, buf_size, memali;
	const char *loadfile = "top.bin.ufp";
	err_e err, e;
	void * bp;
	u_64 val;
	long long data[2][1024];
	char line_in[256];
	FILE* file;
	char* filename;  
	int k;

	printf("Start program\n");

	filename="mas_input_int32.New.txt";
	file = fopen(filename, "r");
	if (file == NULL)
	{
		printf ("ERROR: Could not open input file %s for reading.\n", filename);
		return(-1);
	}

	k=0;
	while(fgets(line_in, 255, file) != NULL)
	{
		sscanf(line_in,"%ld %ld", &data[0][k],&data[1][k]);
		if(data[0][k]<0) data[0][k]=-1*data[0][k];
		if(data[1][k]<0) data[1][k]=-1*data[1][k];
		if(k<5) printf("Data read = %d %d %d\n", k, data[0][k], data[1][k]);
		k++;
	}

	// Set FPGA ready
	fp_id = fpga_open("/dev/ufp0", O_RDWR|O_SYNC, &e);
	num_bytes = fpga_load(fp_id, loadfile, &err);
	fpga_reset(fp_id, &e);
	fpga_start(fp_id, &e);

	// Set RAMS ready
	rams[0] = fpga_memmap(fp_id, MEM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, MEM_OFFSET + 0*MEM_DISTANCE, &e);
	rams[1] = fpga_memmap(fp_id, MEM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, MEM_OFFSET + 1*MEM_DISTANCE, &e);
	rams[2] = fpga_memmap(fp_id, MEM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, MEM_OFFSET + 2*MEM_DISTANCE, &e);
	rams[3] = fpga_memmap(fp_id, MEM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, MEM_OFFSET + 3*MEM_DISTANCE, &e);
  
	// Initalize vectors and input data on rams
	u_64 word0 = (u_64) data[0][0];
	u_64 word1 = (u_64) data[1][0];
	u_64 word2 = 0;
	u_64 *word_0 = rams[0];
	u_64 *word_1 = rams[1];
	u_64 *word_2 = rams[2];
	for( i = 0; i < 128; i++)
    {
		*word_0 ++= (u_64) data[0][i];
		*word_1 ++= (u_64) data[1][i];
		*word_2 ++= 0;
	}

	// Set memory for FPGA use
	pagesize = getpagesize();
	buf_size = ((128*1024*1024 + (pagesize - 1)) / pagesize) * pagesize;
	memali   = posix_memalign(&bp, pagesize, buf_size);
	fpga_register_ftrmem(fp_id, bp, buf_size, &e);
	ftr_mem = bp;

	// Setup Mitrion run
	void * addr = ftr_mem;
	fpga_wrt_appif_val(fp_id, 0x00000000000000001UL, (0x01*sizeof(u_64)) + 0, TYPE_VAL, &e);
	fpga_wrt_appif_val(fp_id, 88, ((0x40+1)*sizeof(u_64)), TYPE_VAL, &e);
	fpga_wrt_appif_val(fp_id, (u_64)addr, (0x40*sizeof(u_64)), TYPE_ADDR, &e);
	fpga_wrt_appif_val(fp_id, 0x000000000000000000UL, (0x02 * sizeof(u_64)), TYPE_VAL, &e);
	fpga_wrt_appif_val(fp_id, 0x000000000000000000UL, (0x01 * sizeof(u_64)), TYPE_VAL, &e);

	// Loop and wait until FPGA calculation is done
	do
	{
		fpga_rd_appif_val(fp_id, (void*)&val, (0x02 * sizeof(u_64)), &e);
	} while((val&1) == 0);

	// Print the final result 
	u_64 * word_dst = rams[3];
	u_64 wordp = *word_dst;
	for(i = 0;i < 128; i++)
	{
		wordp = *word_dst;
		word_dst++;
		printf("FPGA %d: %d + %d = %ld\n", i, data[0][i], data[1][i], wordp);
	}

	printf("End of program ");
	return 0;
}