Advertisement
Guest User

Untitled

a guest
Jul 24th, 2020
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.25 KB | None | 0 0
  1. #include "conv.h"
  2.  
  3. F_DATA data_buf[3][20][30];
  4. F_WEIGHT weight_buf[3][3][3];
  5. F_ACC bias_buf[18][28];
  6. F_ACC ans_buf[18][28];
  7.  
  8.  
  9. void conv(u8 data[3][20][30], u8 weight[3][3][3], u32 bias[18][28], u32 ans[18][28]) {
  10. #pragma HLS INTERFACE m_axi depth=512 port=ans bundle=DATA
  11. #pragma HLS INTERFACE s_axilite depth=512 port=ans bundle=CTRL
  12. #pragma HLS INTERFACE m_axi depth=512 port=bias bundle=DATA
  13. #pragma HLS INTERFACE s_axilite depth=512 port=bias bundle=CTRL
  14. #pragma HLS INTERFACE m_axi depth=512 port=weight bundle=DATA
  15. #pragma HLS INTERFACE s_axilite depth=512 port=weight bundle=CTRL
  16. #pragma HLS INTERFACE s_axilite register port=data bundle=CTRL
  17. #pragma HLS INTERFACE m_axi depth=512 port=data bundle=DATA
  18. #pragma HLS INTERFACE s_axilite register port=return bundle=CTRL
  19.     data_to_buf(data, data_buf);
  20.     weight_to_buf(weight, weight_buf);
  21.     bias_to_buf(bias, bias_buf);
  22.     set_bias(bias_buf, ans_buf);
  23.     compute(data_buf, weight_buf, ans_buf);
  24.     ans_to_ddr(ans_buf, ans);
  25.     return;
  26. }
  27.  
  28. void data_to_buf(u8 data[3][20][30], F_DATA data_buf[3][20][30]) {
  29.  
  30.     for (int i = 0; i < 3; ++i) {
  31.         for (int j = 0; j < 20; ++j) {
  32. #pragma HLS PIPELINE
  33.             for (int k = 0; k < 30; ++k) {
  34. #pragma HLS UNROLL
  35.                 data_buf[i][j][k] = data[i][j][k];
  36.             }
  37.         }
  38.     }
  39. }
  40.  
  41. void weight_to_buf(u8 weight[3][3][3], F_WEIGHT weight_buf[3][3][3]) {
  42.     for (int i = 0; i < 3; ++i) {
  43.         for (int j = 0; j < 3; ++j) {
  44. #pragma HLS PIPELINE
  45.             for (int k = 0; k < 3; ++k) {
  46. #pragma HLS UNROLL
  47.                 weight_buf[i][j][k] = weight[i][j][k];
  48.             }
  49.         }
  50.     }
  51. }
  52.  
  53. void bias_to_buf(u32 bias[18][28], F_ACC bias_buf[18][28]) {
  54.     for (int i = 0; i < 18; ++i) {
  55. #pragma HLS PIPELINE
  56.         for (int j = 0; j < 28; ++j) {
  57. #pragma HLS UNROLL
  58.             bias_buf[i][j] = bias[i][j];
  59.         }
  60.     }
  61. }
  62.  
  63. void set_bias(F_ACC bias_buf[18][28], F_ACC ans_buf[18][28]) {
  64. #pragma HLS ARRAY_PARTITION variable=ans_buf complete dim=1
  65. #pragma HLS ARRAY_PARTITION variable=bias_buf complete dim=1
  66.     for (int i = 0; i < 18; ++i) {
  67. #pragma HLS PIPELINE
  68.         for (int j = 0; j < 28; ++j) {
  69. #pragma HLS UNROLL
  70.             ans_buf[i][j] = bias_buf[i][j];
  71.         }
  72.     }
  73. }
  74.  
  75. F_ACC compute_element(
  76.     F_DATA data0, F_WEIGHT weight0,
  77.     F_DATA data1, F_WEIGHT weight1,
  78.     F_DATA data2, F_WEIGHT weight2,
  79.     F_DATA data3, F_WEIGHT weight3,
  80.     F_DATA data4, F_WEIGHT weight4,
  81.     F_DATA data5, F_WEIGHT weight5,
  82.     F_DATA data6, F_WEIGHT weight6,
  83.     F_DATA data7, F_WEIGHT weight7,
  84.     F_DATA data8, F_WEIGHT weight8,
  85.     F_DATA data9, F_WEIGHT weight9,
  86.     F_DATA data10, F_WEIGHT weight10,
  87.     F_DATA data11, F_WEIGHT weight11,
  88.     F_DATA data12, F_WEIGHT weight12,
  89.     F_DATA data13, F_WEIGHT weight13,
  90.     F_DATA data14, F_WEIGHT weight14,
  91.     F_DATA data15, F_WEIGHT weight15,
  92.     F_DATA data16, F_WEIGHT weight16,
  93.     F_DATA data17, F_WEIGHT weight17,
  94.     F_DATA data18, F_WEIGHT weight18,
  95.     F_DATA data19, F_WEIGHT weight19,
  96.     F_DATA data20, F_WEIGHT weight20,
  97.     F_DATA data21, F_WEIGHT weight21,
  98.     F_DATA data22, F_WEIGHT weight22,
  99.     F_DATA data23, F_WEIGHT weight23,
  100.     F_DATA data24, F_WEIGHT weight24,
  101.     F_DATA data25, F_WEIGHT weight25,
  102.     F_DATA data26, F_WEIGHT weight26
  103. ) {
  104.     F_ACC ans = data0 * weight0 + data1 * weight1 + data2 * weight2 +
  105.      data3 * weight3 + data4 * weight4 + data5 * weight5 +
  106.      data6 * weight6 + data7 * weight7 + data8 * weight8 +
  107.      data9 * weight9 + data10 * weight10 + data11 * weight11 +
  108.      data12 * weight12 + data13 * weight13 + data14 * weight14 +
  109.      data15 * weight15 + data16 * weight16 + data17 * weight17 +
  110.      data18 * weight18 + data19 * weight19 + data20 * weight20 +
  111.      data21 * weight21 + data22 * weight22 + data23 * weight23 +
  112.      data24 * weight24 + data25 * weight25 + data26 * weight26;
  113.      return ans;
  114.  
  115.  
  116. }
  117.  
  118. void compute(F_DATA data_buf[3][20][30], F_WEIGHT weight_buf[3][3][3], F_ACC ans_buf[18][28]) {
  119. #pragma HLS ARRAY_PARTITION variable=data_buf complete dim=1
  120. #pragma HLS ARRAY_PARTITION variable=weight_buf complete dim=1
  121. #pragma HLS ARRAY_PARTITION variable=ans_buf complete dim=1
  122.     for (int i = 0; i < 18; ++i) {
  123. #pragma HLS PIPELINE
  124.         for (int j = 0; j < 28; ++j) {
  125. #pragma HLS UNROLL
  126.             ans_buf[i][j] += compute_element(
  127.                 data_buf[0][i+0][j+0] , weight_buf[0][0][0],
  128.                 data_buf[0][i+0][j+1] , weight_buf[0][0][1],
  129.                 data_buf[0][i+0][j+2] , weight_buf[0][0][2],
  130.                 data_buf[0][i+1][j+0] , weight_buf[0][1][0],
  131.                 data_buf[0][i+1][j+1] , weight_buf[0][1][1],
  132.                 data_buf[0][i+1][j+2] , weight_buf[0][1][2],
  133.                 data_buf[0][i+2][j+0] , weight_buf[0][2][0],
  134.                 data_buf[0][i+2][j+1] , weight_buf[0][2][1],
  135.                 data_buf[0][i+2][j+2] , weight_buf[0][2][2],
  136.                 data_buf[1][i+0][j+0] , weight_buf[1][0][0],
  137.                 data_buf[1][i+0][j+1] , weight_buf[1][0][1],
  138.                 data_buf[1][i+0][j+2] , weight_buf[1][0][2],
  139.                 data_buf[1][i+1][j+0] , weight_buf[1][1][0],
  140.                 data_buf[1][i+1][j+1] , weight_buf[1][1][1],
  141.                 data_buf[1][i+1][j+2] , weight_buf[1][1][2],
  142.                 data_buf[1][i+2][j+0] , weight_buf[1][2][0],
  143.                 data_buf[1][i+2][j+1] , weight_buf[1][2][1],
  144.                 data_buf[1][i+2][j+2] , weight_buf[1][2][2],
  145.                 data_buf[2][i+0][j+0] , weight_buf[2][0][0],
  146.                 data_buf[2][i+0][j+1] , weight_buf[2][0][1],
  147.                 data_buf[2][i+0][j+2] , weight_buf[2][0][2],
  148.                 data_buf[2][i+1][j+0] , weight_buf[2][1][0],
  149.                 data_buf[2][i+1][j+1] , weight_buf[2][1][1],
  150.                 data_buf[2][i+1][j+2] , weight_buf[2][1][2],
  151.                 data_buf[2][i+2][j+0] , weight_buf[2][2][0],
  152.                 data_buf[2][i+2][j+1] , weight_buf[2][2][1],
  153.                 data_buf[2][i+2][j+2] , weight_buf[2][2][2]
  154.             );
  155.         }
  156.     }
  157. }
  158.  
  159. void ans_to_ddr(F_ACC ans_buf[18][28], u32 ans[18][28]) {
  160.     for (int i = 0; i < 18; ++i) {
  161. #pragma HLS PIPELINE
  162.         for (int j = 0; j < 28; ++j) {
  163. #pragma HLS UNROLL
  164.             ans[i][j] = ans_buf[i][j];
  165.         }
  166.     }
  167. }
  168.  
  169.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement