#include // using 'printf', 'scanf' #include // using 'exit' #include // using 'strcmp' #include // using 'open' #include // using 'close' #include // using 'mmap', 'munmap' #include #define FPGA_BASE_ADDRESS 0xc1a00000 #define FPGA_SLAVE_REG0OFF 0 #define FPGA_SLAVE_REG1OFF 12 #define FPGA_RESET_REG_OFF 64 #define MAP_SIZE 4096UL #define MAP_MASK (MAP_SIZE-1) char command[10]; int memfd; void *mapped_base, *mapped_dev_base; off_t dev_base = FPGA_BASE_ADDRESS; void openFPGAInterface() { memfd = open("/dev/mem", O_RDWR | O_SYNC); if( memfd == -1 ) { printf("CL-Interface: Can't open /dev/mem.\n"); exit(EXIT_FAILURE); } printf("CL-Interface: /dev/mem opened.\n"); mapped_base = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, memfd, dev_base & ~MAP_MASK); if( mapped_base == (void *) -1 ) { printf("CL-Interface: Can't map the memory to user space.\n"); exit(EXIT_FAILURE); } printf("CL-Interface: Memory mapped at address %p.\n", mapped_base); mapped_dev_base = mapped_base + (dev_base & MAP_MASK); } void CostasLoopProcessing() { unsigned long samples[512]; unsigned long val; // push 512 samples to the FPGA unsigned int i; for (i = 0; i < 512; i++) { *((unsigned long *) (mapped_dev_base + FPGA_SLAVE_REG1OFF)) = 0x00000000; } // wait for the system to finish processing // (stop if 50000 reads and FPGA circuit still not ready) unsigned int j = 0; unsigned int stop = 0; while(j < 5000 && stop == 0) { val = *((unsigned long *) (mapped_dev_base + FPGA_SLAVE_REG0OFF)); // exit case to start reading if (val != 0xDEADDEAD) { printf("CL-Interface: Caught exit sequence on the bus, stopping poll loop\n"); printf("CL-Interface: Waited for %d cycles\n", j); samples[0] = val; stop = 1; // stop waiting for FPGA circuit, start reading } j++; } if (stop == 0) { printf("CL-Interface: Never received ready flag\n"); } else { printf("CL-Interface: Reading back 512 samples\n"); // read back 512 samples unsigned int k; for (k = 1; k < 512; k++) { val = *((unsigned long *) (mapped_dev_base + FPGA_SLAVE_REG0OFF)); samples[k] = val; } } unsigned int p; for (p = 0; p < 512; p++) { printf("CL-Interface: Sample %d: #%x\n", p, samples[p]); } } void closeFPGAInterface() { if( munmap(mapped_base, MAP_SIZE) == -1 ) { printf("CL-Interface: Can't unmap memory from user space.\n"); exit(EXIT_FAILURE); } close(memfd); }