Пример #1
0
bit4_t digitrec( digit input ) 
{
  #include "training_data.h"

  // This array stores K minimum distances per training set
  bit6_t knn_set[10][K_CONST];

  // Initialize the knn set
  for ( int i = 0; i < 10; ++i )
    for ( int k = 0; k < K_CONST; ++k )
      // Note that the max distance is 49
      knn_set[i][k] = 50; 

  L1800: for ( int i = 0; i < TRAINING_SIZE; ++i ) {
    L10: for ( int j = 0; j < 10; j++ ) {
      // Read a new instance from the training set
      digit training_instance = training_data[j][i];
      // Update the KNN set
      update_knn( input, training_instance, knn_set[j] );
    }
  } 

  // Compute the final output
  return knn_vote( knn_set ); 
}
Пример #2
0
void DigitRec(long * global_training_set, long * global_test_set, int* global_results) {
#pragma HLS INTERFACE m_axi port=global_training_set offset=slave bundle=gmem
#pragma HLS INTERFACE m_axi port=global_test_set offset=slave bundle=gmem
#pragma HLS INTERFACE m_axi port=global_results offset=slave bundle=gmem
#pragma HLS INTERFACE s_axilite port=global_training_set bundle=control
#pragma HLS INTERFACE s_axilite port=global_test_set bundle=control
#pragma HLS INTERFACE s_axilite port=global_results bundle=control
#pragma HLS INTERFACE s_axilite port=return bundle=control

    // This array stores K minimum distances per training set
    int knn_set[10][K_CONST];
#pragma HLS array_partition variable=knn_set complete dim=0

    int i = 0;
    int j = 0;

    long training_set [TRAINING_SIZE][40] ;
#pragma HLS array_partition variable=training_set complete dim=2
    //#pragma HLS array_partition variable=training_set complete dim=3

    long test_set    [TEST_SIZE][4];
#pragma HLS array_partition variable=test_set complete dim=2
    int results      [RESULT_SIZE];

    for (i = 0; i < 10; i ++ )
    {
        for (j = 0; j < TRAINING_SIZE ; j ++ )
        {
            training_set[j][i*4+0] = global_training_set[4*i*TRAINING_SIZE+4*j + 0];
            training_set[j][i*4+1] = global_training_set[4*i*TRAINING_SIZE+4*j + 1];
            training_set[j][i*4+2] = global_training_set[4*i*TRAINING_SIZE+4*j + 2];
            training_set[j][i*4+3] = global_training_set[4*i*TRAINING_SIZE+4*j + 3];
        }
    }

    for ( i = 0; i < TEST_SIZE; ++i)
    {
        test_set[i][0] = global_test_set[i*4 + 0];
        test_set[i][1] = global_test_set[i*4 + 1];
        test_set[i][2] = global_test_set[i*4 + 2];
        test_set[i][3] = global_test_set[i*4 + 3];
    }

    for (int t = 0; t < TEST_SIZE; ++t) {

        // Initialize the knn set
        for ( i = 0; i < 10 ; ++i )
        {
            for (j = 0; j < K_CONST; j ++ )

                // Note that the max distance is 256
                knn_set[i][j] = 256;
        }

TRAINING_LOOP:
        for ( i = 0; i < TRAINING_SIZE; ++i ) {
#pragma HLS pipeline
DIGIT_UNROLL:
            for ( j = 0; j < 10; j++ ) {
#pragma HLS UNROLL factor=10

                // Read a new instance from the training set
                long training_instance[4];
                training_instance[0]  = training_set[i][j*4+0];
                training_instance[1]  = training_set[i][j*4+1];
                training_instance[2]  = training_set[i][j*4+2];
                training_instance[3]  = training_set[i][j*4+3];
                // Update the KNN set
                update_knn( test_set[t], training_instance, knn_set[j] );
            }
        }

        // Compute the final output
        results[t] = knn_vote(knn_set);
    }

    for ( i = 0; i < RESULT_SIZE; ++i) {
        global_results[i] = results[i];
    }

    return;

}