|
| 1 | + |
| 2 | +#include "acc_i16c.h" |
| 3 | + |
| 4 | +void copy_mem2dev(uint8_t *orig,uint32_t byte_num, unsigned long in_buffer) |
| 5 | +{ |
| 6 | + int fd = open("/dev/mem", O_RDWR); |
| 7 | + unsigned char *virtual_addr; |
| 8 | + uint32_t RequestByteNum;// must page |
| 9 | + if(byte_num%(HPAGESIZE)==0) |
| 10 | + RequestByteNum = byte_num; |
| 11 | + else |
| 12 | + { |
| 13 | + RequestByteNum = ceil(byte_num/(HPAGESIZE*1.0))*(HPAGESIZE); |
| 14 | + } |
| 15 | + virtual_addr = (unsigned char *)mmap(NULL, RequestByteNum, PROT_READ | PROT_WRITE, MAP_SHARED, fd, (off_t)in_buffer); |
| 16 | + if(virtual_addr == MAP_FAILED) |
| 17 | + { |
| 18 | + perror("Virtual_addr_in mappong for absolute memory access failed!\n"); |
| 19 | + return; |
| 20 | + } |
| 21 | + memcpy(virtual_addr,orig,byte_num); |
| 22 | + |
| 23 | + munmap((void *)virtual_addr, byte_num); |
| 24 | + close(fd); |
| 25 | +} |
| 26 | + |
| 27 | +void copy_dev2mem(uint8_t *dst,uint32_t byte_num, unsigned long in_buffer) |
| 28 | +{ |
| 29 | + int fd = open("/dev/mem", O_RDWR); |
| 30 | + unsigned char *virtual_addr; |
| 31 | + uint32_t RequestByteNum;// must page |
| 32 | + if(byte_num%(HPAGESIZE)==0) |
| 33 | + RequestByteNum = byte_num; |
| 34 | + else |
| 35 | + { |
| 36 | + RequestByteNum = ceil(byte_num/(HPAGESIZE*1.0))*(HPAGESIZE); |
| 37 | + } |
| 38 | + virtual_addr = (unsigned char *)mmap(NULL, RequestByteNum, PROT_READ | PROT_WRITE, MAP_SHARED, fd, (off_t)in_buffer); |
| 39 | + if(virtual_addr == MAP_FAILED) |
| 40 | + { |
| 41 | + perror("Virtual_addr_in mappong for absolute memory access failed!\n"); |
| 42 | + return; |
| 43 | + } |
| 44 | + printf("copy start-----byte_num=%d\n",byte_num); |
| 45 | + memcpy((uint8_t *)dst,virtual_addr,byte_num); |
| 46 | + printf("copy ok!\n"); |
| 47 | + |
| 48 | + munmap((void *)virtual_addr, byte_num); |
| 49 | + close(fd); |
| 50 | +} |
| 51 | + |
| 52 | +int copy_file2mem(char *bin_file,uint32_t byte_num,unsigned long in_buffer) |
| 53 | +{ |
| 54 | + unsigned char *buffer = (unsigned char *)malloc(HPAGESIZE); |
| 55 | + if(buffer==NULL){ |
| 56 | + printf("cannot malloc buffer %d byte\n", HPAGESIZE); |
| 57 | + return -1; |
| 58 | + } |
| 59 | + printf("Total Byte Num = %d\n Address 0x%X\n", byte_num, in_buffer); |
| 60 | + FILE *fp; |
| 61 | + if( (fp = fopen(bin_file, "rb")) == NULL)fprintf(stderr,"CANNOT OPEN bin_file\n"); |
| 62 | + int rd_num; |
| 63 | + unsigned long offset = 0; |
| 64 | + while(rd_num = fread(buffer, sizeof(unsigned char), HPAGESIZE, fp)) |
| 65 | + { |
| 66 | + if(rd_num < HPAGESIZE) |
| 67 | + rd_num = HPAGESIZE; |
| 68 | + copy_mem2dev(buffer,rd_num, in_buffer+offset); |
| 69 | +// printf("rd_num=%d, offset=%d\n", rd_num, offset); |
| 70 | + offset += rd_num; |
| 71 | + } |
| 72 | + printf("copy_file2mem offset=%d\n",offset); |
| 73 | + fclose(fp); |
| 74 | + |
| 75 | + free(buffer); |
| 76 | + |
| 77 | + |
| 78 | + return 0; |
| 79 | +} |
| 80 | + |
| 81 | +int copy_mem2file(char *bin_file,uint32_t byte_num,unsigned long in_buffer) |
| 82 | +{ |
| 83 | + void *buffer = malloc(HPAGESIZE); |
| 84 | + if(buffer==NULL){ |
| 85 | + printf("cannot malloc buffer %d byte\n", HPAGESIZE); |
| 86 | + return -1; |
| 87 | + } |
| 88 | + |
| 89 | + FILE *fp; |
| 90 | + if( (fp = fopen(bin_file, "wb")) == NULL)fprintf(stderr,"CANNOT OPEN bin_file\n"); |
| 91 | + |
| 92 | + int x = byte_num; |
| 93 | + int addbyte; |
| 94 | + unsigned long offset = 0; |
| 95 | + while(addbyte=((x<HPAGESIZE)?x:(HPAGESIZE))) |
| 96 | + { |
| 97 | + copy_dev2mem((uint8_t *)buffer,addbyte, in_buffer+offset); |
| 98 | + fwrite(buffer , sizeof(unsigned char), addbyte, fp); |
| 99 | + x -= addbyte; |
| 100 | + offset += addbyte; |
| 101 | + } |
| 102 | + printf("copy_mem2file offset=%d\n",offset); |
| 103 | + |
| 104 | + |
| 105 | + fclose(fp); |
| 106 | + |
| 107 | + free(buffer); |
| 108 | + |
| 109 | + return 0; |
| 110 | +} |
| 111 | + |
| 112 | +double what_time_is_it_now() |
| 113 | +{ |
| 114 | + struct timeval time; |
| 115 | + if (gettimeofday(&time,NULL)){ |
| 116 | + return 0; |
| 117 | + } |
| 118 | + return (double)time.tv_sec + (double)time.tv_usec * .000001; |
| 119 | +} |
| 120 | + |
| 121 | +int FPGA_Acc(unsigned int ifm_addr, unsigned int ofm_addr, unsigned int weight_offset, unsigned int bias_offset, uint32_t k_s_pad_ltype, uint32_t iofm_num, uint32_t ifm_w_h, uint32_t ofm_w_h, |
| 122 | + uint32_t TRTC, uint32_t TMTN, int32_t NToy, int32_t NTox, int32_t NTof, int32_t NTcomb, int32_t NTif, uint8_t lmode, int32_t NTcomb_l, int16_t pad_val, int16_t div_kk, |
| 123 | + uint32_t IHW, uint32_t OHW, uint32_t KK_INumxKK, uint32_t en_bits, uint32_t weightQ, uint32_t biasQ, uint32_t ifmQ, uint32_t ofmQ, uint32_t avgQ, uint32_t interQ)//enable_bits[2:0]={IsReLU, LoadBias, IsNotConv} |
| 124 | +{ |
| 125 | + unsigned int ap_idle; |
| 126 | + unsigned int ap_done; |
| 127 | + |
| 128 | + unsigned long int PhysicalAddress = YOLO2_BASEADDR; |
| 129 | + int map_len = 0x120; |
| 130 | + int fd = open("/dev/mem", O_RDWR); |
| 131 | + |
| 132 | + unsigned char *xbase_address; |
| 133 | + xbase_address = (unsigned char *)mmap(NULL, map_len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, (off_t)PhysicalAddress); |
| 134 | + if(xbase_address == MAP_FAILED) |
| 135 | + { |
| 136 | + perror("1:Init Mapping memory for absolute memory access failed.\n"); |
| 137 | + return -1; |
| 138 | + } |
| 139 | + |
| 140 | + while(1) |
| 141 | + { |
| 142 | + ap_idle = ((ReadReg(xbase_address, XFPGA_ACC_CTRL_BUS_ADDR_AP_CTRL) >> 2) && 0x1); |
| 143 | + if(ap_idle) |
| 144 | + break; |
| 145 | + } |
| 146 | + |
| 147 | + WriteReg(xbase_address, XFPGA_ACC_CTRL_BUS_ADDR_IFM_V_DATA, ifm_addr); |
| 148 | + WriteReg(xbase_address, XFPGA_ACC_CTRL_BUS_ADDR_OFM_V_DATA, ofm_addr); |
| 149 | + WriteReg(xbase_address, XFPGA_ACC_CTRL_BUS_ADDR_WEIGHT_V_DATA, WEIGHT_BASE + weight_offset*2); |
| 150 | + WriteReg(xbase_address, XFPGA_ACC_CTRL_BUS_ADDR_BIAS_V_DATA, BETA_BASE + bias_offset*2); |
| 151 | + |
| 152 | + WriteReg(xbase_address, XFPGA_ACC_CTRL_BUS_ADDR_K_S_PAD_LTYPE_DATA, k_s_pad_ltype); |
| 153 | + WriteReg(xbase_address, XFPGA_ACC_CTRL_BUS_ADDR_IOFM_NUM_DATA, iofm_num); |
| 154 | + WriteReg(xbase_address, XFPGA_ACC_CTRL_BUS_ADDR_IFM_W_H_DATA, ifm_w_h); |
| 155 | + WriteReg(xbase_address, XFPGA_ACC_CTRL_BUS_ADDR_OFM_W_H_DATA, ofm_w_h); |
| 156 | + WriteReg(xbase_address, XFPGA_ACC_CTRL_BUS_ADDR_TRTC_DATA, TRTC); |
| 157 | + WriteReg(xbase_address, XFPGA_ACC_CTRL_BUS_ADDR_TMTN_DATA, TMTN); |
| 158 | + WriteReg(xbase_address, XFPGA_ACC_CTRL_BUS_ADDR_NTOY_DATA, NToy); |
| 159 | + WriteReg(xbase_address, XFPGA_ACC_CTRL_BUS_ADDR_NTOX_DATA, NTox); |
| 160 | + WriteReg(xbase_address, XFPGA_ACC_CTRL_BUS_ADDR_NTOF_DATA, NTof); |
| 161 | + WriteReg(xbase_address, XFPGA_ACC_CTRL_BUS_ADDR_NTCOMB_DATA, NTcomb); |
| 162 | + WriteReg(xbase_address, XFPGA_ACC_CTRL_BUS_ADDR_NTIF_DATA, NTif); |
| 163 | + WriteReg(xbase_address, XFPGA_ACC_CTRL_BUS_ADDR_LMODE_DATA, lmode); |
| 164 | + WriteReg(xbase_address, XFPGA_ACC_CTRL_BUS_ADDR_NTCOMB_L_DATA, NTcomb_l); |
| 165 | + WriteReg(xbase_address, XFPGA_ACC_CTRL_BUS_ADDR_PAD_VAL_DATA, pad_val); |
| 166 | + WriteReg(xbase_address, XFPGA_ACC_CTRL_BUS_ADDR_DIV_KK_DATA, div_kk); |
| 167 | + WriteReg(xbase_address, XFPGA_ACC_CTRL_BUS_ADDR_IHW_DATA, IHW); |
| 168 | + WriteReg(xbase_address, XFPGA_ACC_CTRL_BUS_ADDR_OHW_DATA, OHW); |
| 169 | + WriteReg(xbase_address, XFPGA_ACC_CTRL_BUS_ADDR_KK_INUMXKK_DATA, KK_INumxKK); |
| 170 | + WriteReg(xbase_address, XFPGA_ACC_CTRL_BUS_ADDR_EN_BITS_DATA, en_bits); |
| 171 | + WriteReg(xbase_address, XFPGA_ACC_CTRL_BUS_ADDR_WEIGHTQ_DATA, weightQ); |
| 172 | + WriteReg(xbase_address, XFPGA_ACC_CTRL_BUS_ADDR_BIASQ_DATA, biasQ); |
| 173 | + WriteReg(xbase_address, XFPGA_ACC_CTRL_BUS_ADDR_IFMQ_DATA, ifmQ); |
| 174 | + WriteReg(xbase_address, XFPGA_ACC_CTRL_BUS_ADDR_OFMQ_DATA, ofmQ); |
| 175 | + WriteReg(xbase_address, XFPGA_ACC_CTRL_BUS_ADDR_AVGQ_DATA, avgQ); |
| 176 | + WriteReg(xbase_address, XFPGA_ACC_CTRL_BUS_ADDR_INTERQ_DATA, interQ); |
| 177 | + |
| 178 | +// double time1,time2; |
| 179 | +// time1 = what_time_is_it_now(); |
| 180 | + WriteReg(xbase_address, XFPGA_ACC_CTRL_BUS_ADDR_GIE, 0x0); |
| 181 | + WriteReg(xbase_address, XFPGA_ACC_CTRL_BUS_ADDR_AP_CTRL, 0x1);//Start |
| 182 | + while(1) |
| 183 | + { |
| 184 | + ap_done = ((ReadReg(xbase_address, XFPGA_ACC_CTRL_BUS_ADDR_AP_CTRL) >> 1) && 0x1); |
| 185 | + if(ap_done) |
| 186 | + break; |
| 187 | + } |
| 188 | +// time2 = what_time_is_it_now(); |
| 189 | +// printf("START TO DONE in %f seconds.\n",time2 - time1); |
| 190 | + |
| 191 | + munmap((void *)xbase_address, map_len); |
| 192 | + close(fd); |
| 193 | + |
| 194 | + return 0; |
| 195 | +} |
0 commit comments