HLS中数据的合并与拆分
生活随笔
收集整理的這篇文章主要介紹了
HLS中数据的合并与拆分
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
HLS中數據的合并與拆分
在用HLS生成IP的過程中,由于需要充分使用接口的帶寬,所以一般我們在輸入端將高位寬的數據拆分后作為輸入使用,在輸出端對數據進行合并后再進行輸出。這是我們在設計IP中經常出現的問題,本文總結一下自己在最近的工作中進行數據拆分和合并的經驗。
數據拆分
1、拆分后的數據類型與原數據類型一致
//輸入的數據數量為IMAGE_SIZE,輸出的數據數量為(IMAGE_SIZE<<5) void data_split(ap_uint<512> *data_in,ap_uint<16> *data_out){int m,n;int start_addr = 0;ap_uint<16> data_out_temp;ap_uint<512> data_in_temp;for(m = 0;m < IMAGE_SIZE; m++){memcpy(&data_in_temp, &data_in[start_addr], 32 * sizeof(ap_uint<16>));for(n = 0; n < 32; n++){data_out_temp = data_in_temp(((n+1)<<4)-1,(n<<4));data_out[(m<<5)+n] = data_out_temp;}start_addr = start_addr + 1;}}2、拆分后的數據類型與原數據類型不一致
//輸入的數據數量為IMAGE_SIZE,輸出的數據數量為(IMAGE_SIZE<<5) void data_split(ap_uint<512> *data_in,ap_ufixed<16, 1, AP_TRN, AP_WRAP> *data_out){int m,n;int start_addr = 0;ap_uint<16> data_mid_temp;ap_ufixed<16, 1, AP_TRN, AP_WRAP> data_out_temp;ap_uint<512> data_in_temp;for(m = 0;m < IMAGE_SIZE; m++){memcpy(&data_in_temp, &data_in[start_addr], 32 * sizeof(ap_uint<16>));for(n = 0; n < 32; n++){data_mid_temp = data_in_temp(((n+1)<<4)-1,(n<<4));data_out_temp(15,0) = data_mid_temp(15,0);data_out[(m<<5)+n] = data_out_temp;}start_addr = start_addr + 1;}}注意數據類型不一致的時候需要再加一個中間變量data_out_temp。
數據合并
1、合并后的數據類型與原數據類型一致
//輸入的數據數量為IMAGE_SIZE,輸出的數據數量為(IMAGE_SIZE>>5) void data_merge(ap_uint<16> *data_in,ap_uint<512> *data_out){int i ,j;ap_uint<16> data_in_temp;ap_uint<512> data_out_temp;for(i = 0;i < (IMAGE_SIZE>>5); i++){for(j = 0; j < 32 ; j++){data_in_temp = data_in[(i<<5)+j];data_out_temp(((j+1)<<4)-1,(j<<4)) = data_in_temp(15,0);}data_out[i] = data_out_temp;}}2、合并后的數據類型與原數據類型不一致
//輸入的數據數量為IMAGE_SIZE,輸出的數據數量為(IMAGE_SIZE>>5) void data_merge(ap_ufixed<16, 1, AP_TRN, AP_WRAP> *data_in,ap_uint<512> *data_out){int i ,j ,k;ap_ufixed<16, 1, AP_TRN, AP_WRAP> data_in_temp;ap_uint<16> data_mid_temp;ap_uint<512> data_out_temp;ap_uint<1> bool_temp;for(i = 0;i < (IMAGE_SIZE>>5); i++){for(j = 0; j < 32 ; j++){data_in_temp = data_in[(i<<5)+j];for(k = 0; k < 16; k++){bool_temp = data_in_temp(k,k);data_mid_temp(k,k) = bool_temp;}data_out_temp(((j+1)<<4)-1,(j<<4)) = data_mid_temp(15,0);}data_out[i] = data_out_temp;}}經驗之談
自己總結的經驗就是在做數據間位寬和類型的轉換時,必須要保持其中的一項屬性與原數據相同;數據合并也是同理。
總結
以上是生活随笔為你收集整理的HLS中数据的合并与拆分的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自己动手写CPU(7)转移指令的实现
- 下一篇: Vivado中RTL封装IP流程