Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "conv.h"
- F_DATA data_buf[3][20][30];
- F_WEIGHT weight_buf[3][3][3];
- F_ACC bias_buf[18][28];
- F_ACC ans_buf[18][28];
- void conv(u8 data[3][20][30], u8 weight[3][3][3], u32 bias[18][28], u32 ans[18][28]) {
- #pragma HLS INTERFACE m_axi depth=512 port=ans bundle=DATA
- #pragma HLS INTERFACE s_axilite depth=512 port=ans bundle=CTRL
- #pragma HLS INTERFACE m_axi depth=512 port=bias bundle=DATA
- #pragma HLS INTERFACE s_axilite depth=512 port=bias bundle=CTRL
- #pragma HLS INTERFACE m_axi depth=512 port=weight bundle=DATA
- #pragma HLS INTERFACE s_axilite depth=512 port=weight bundle=CTRL
- #pragma HLS INTERFACE s_axilite register port=data bundle=CTRL
- #pragma HLS INTERFACE m_axi depth=512 port=data bundle=DATA
- #pragma HLS INTERFACE s_axilite register port=return bundle=CTRL
- data_to_buf(data, data_buf);
- weight_to_buf(weight, weight_buf);
- bias_to_buf(bias, bias_buf);
- set_bias(bias_buf, ans_buf);
- compute(data_buf, weight_buf, ans_buf);
- ans_to_ddr(ans_buf, ans);
- return;
- }
- void data_to_buf(u8 data[3][20][30], F_DATA data_buf[3][20][30]) {
- for (int i = 0; i < 3; ++i) {
- for (int j = 0; j < 20; ++j) {
- #pragma HLS PIPELINE
- for (int k = 0; k < 30; ++k) {
- #pragma HLS UNROLL
- data_buf[i][j][k] = data[i][j][k];
- }
- }
- }
- }
- void weight_to_buf(u8 weight[3][3][3], F_WEIGHT weight_buf[3][3][3]) {
- for (int i = 0; i < 3; ++i) {
- for (int j = 0; j < 3; ++j) {
- #pragma HLS PIPELINE
- for (int k = 0; k < 3; ++k) {
- #pragma HLS UNROLL
- weight_buf[i][j][k] = weight[i][j][k];
- }
- }
- }
- }
- void bias_to_buf(u32 bias[18][28], F_ACC bias_buf[18][28]) {
- for (int i = 0; i < 18; ++i) {
- #pragma HLS PIPELINE
- for (int j = 0; j < 28; ++j) {
- #pragma HLS UNROLL
- bias_buf[i][j] = bias[i][j];
- }
- }
- }
- void set_bias(F_ACC bias_buf[18][28], F_ACC ans_buf[18][28]) {
- #pragma HLS ARRAY_PARTITION variable=ans_buf complete dim=1
- #pragma HLS ARRAY_PARTITION variable=bias_buf complete dim=1
- for (int i = 0; i < 18; ++i) {
- #pragma HLS PIPELINE
- for (int j = 0; j < 28; ++j) {
- #pragma HLS UNROLL
- ans_buf[i][j] = bias_buf[i][j];
- }
- }
- }
- F_ACC compute_element(
- F_DATA data0, F_WEIGHT weight0,
- F_DATA data1, F_WEIGHT weight1,
- F_DATA data2, F_WEIGHT weight2,
- F_DATA data3, F_WEIGHT weight3,
- F_DATA data4, F_WEIGHT weight4,
- F_DATA data5, F_WEIGHT weight5,
- F_DATA data6, F_WEIGHT weight6,
- F_DATA data7, F_WEIGHT weight7,
- F_DATA data8, F_WEIGHT weight8,
- F_DATA data9, F_WEIGHT weight9,
- F_DATA data10, F_WEIGHT weight10,
- F_DATA data11, F_WEIGHT weight11,
- F_DATA data12, F_WEIGHT weight12,
- F_DATA data13, F_WEIGHT weight13,
- F_DATA data14, F_WEIGHT weight14,
- F_DATA data15, F_WEIGHT weight15,
- F_DATA data16, F_WEIGHT weight16,
- F_DATA data17, F_WEIGHT weight17,
- F_DATA data18, F_WEIGHT weight18,
- F_DATA data19, F_WEIGHT weight19,
- F_DATA data20, F_WEIGHT weight20,
- F_DATA data21, F_WEIGHT weight21,
- F_DATA data22, F_WEIGHT weight22,
- F_DATA data23, F_WEIGHT weight23,
- F_DATA data24, F_WEIGHT weight24,
- F_DATA data25, F_WEIGHT weight25,
- F_DATA data26, F_WEIGHT weight26
- ) {
- F_ACC ans = data0 * weight0 + data1 * weight1 + data2 * weight2 +
- data3 * weight3 + data4 * weight4 + data5 * weight5 +
- data6 * weight6 + data7 * weight7 + data8 * weight8 +
- data9 * weight9 + data10 * weight10 + data11 * weight11 +
- data12 * weight12 + data13 * weight13 + data14 * weight14 +
- data15 * weight15 + data16 * weight16 + data17 * weight17 +
- data18 * weight18 + data19 * weight19 + data20 * weight20 +
- data21 * weight21 + data22 * weight22 + data23 * weight23 +
- data24 * weight24 + data25 * weight25 + data26 * weight26;
- return ans;
- }
- void compute(F_DATA data_buf[3][20][30], F_WEIGHT weight_buf[3][3][3], F_ACC ans_buf[18][28]) {
- #pragma HLS ARRAY_PARTITION variable=data_buf complete dim=1
- #pragma HLS ARRAY_PARTITION variable=weight_buf complete dim=1
- #pragma HLS ARRAY_PARTITION variable=ans_buf complete dim=1
- for (int i = 0; i < 18; ++i) {
- #pragma HLS PIPELINE
- for (int j = 0; j < 28; ++j) {
- #pragma HLS UNROLL
- ans_buf[i][j] += compute_element(
- data_buf[0][i+0][j+0] , weight_buf[0][0][0],
- data_buf[0][i+0][j+1] , weight_buf[0][0][1],
- data_buf[0][i+0][j+2] , weight_buf[0][0][2],
- data_buf[0][i+1][j+0] , weight_buf[0][1][0],
- data_buf[0][i+1][j+1] , weight_buf[0][1][1],
- data_buf[0][i+1][j+2] , weight_buf[0][1][2],
- data_buf[0][i+2][j+0] , weight_buf[0][2][0],
- data_buf[0][i+2][j+1] , weight_buf[0][2][1],
- data_buf[0][i+2][j+2] , weight_buf[0][2][2],
- data_buf[1][i+0][j+0] , weight_buf[1][0][0],
- data_buf[1][i+0][j+1] , weight_buf[1][0][1],
- data_buf[1][i+0][j+2] , weight_buf[1][0][2],
- data_buf[1][i+1][j+0] , weight_buf[1][1][0],
- data_buf[1][i+1][j+1] , weight_buf[1][1][1],
- data_buf[1][i+1][j+2] , weight_buf[1][1][2],
- data_buf[1][i+2][j+0] , weight_buf[1][2][0],
- data_buf[1][i+2][j+1] , weight_buf[1][2][1],
- data_buf[1][i+2][j+2] , weight_buf[1][2][2],
- data_buf[2][i+0][j+0] , weight_buf[2][0][0],
- data_buf[2][i+0][j+1] , weight_buf[2][0][1],
- data_buf[2][i+0][j+2] , weight_buf[2][0][2],
- data_buf[2][i+1][j+0] , weight_buf[2][1][0],
- data_buf[2][i+1][j+1] , weight_buf[2][1][1],
- data_buf[2][i+1][j+2] , weight_buf[2][1][2],
- data_buf[2][i+2][j+0] , weight_buf[2][2][0],
- data_buf[2][i+2][j+1] , weight_buf[2][2][1],
- data_buf[2][i+2][j+2] , weight_buf[2][2][2]
- );
- }
- }
- }
- void ans_to_ddr(F_ACC ans_buf[18][28], u32 ans[18][28]) {
- for (int i = 0; i < 18; ++i) {
- #pragma HLS PIPELINE
- for (int j = 0; j < 28; ++j) {
- #pragma HLS UNROLL
- ans[i][j] = ans_buf[i][j];
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement