// source: https://github.com/FelixWinterstein/Vivado-KMeans/tree/b1121f826bdac8db9502e4bf0c8f3b08425bc061/lloyds_algorithm_HLS/source /********************************************************************** * Felix Winterstein, Imperial College London * * File: lloyds_algorithm_top.cpp * * Revision 1.01 * Additional Comments: distributed under a BSD license, see LICENSE.txt * **********************************************************************/ #include "lloyds_algorithm_top.h" #include "lloyds_algorithm_util.h" // global array for the data (keep it local to this file) data_type data_int_memory[N]; data_type centre_positions[K*P]; centre_type centre_buffer[K*P]; // top-level function of the design void lloyds_algorithm_top( volatile data_type *data, volatile data_type *cntr_pos_init, node_pointer n, centre_index_type k, volatile coord_type_ext *distortion_out, volatile data_type *clusters_out) { // set the interface properties #pragma HLS interface ap_none register port=n #pragma HLS interface ap_none register port=k #pragma HLS interface ap_fifo port=data depth=256 #pragma HLS interface ap_fifo port=cntr_pos_init depth=256 #pragma HLS interface ap_fifo port=distortion_out depth=256 #pragma HLS interface ap_fifo port=clusters_out depth=256 /* #pragma HLS data_pack variable=data #pragma HLS data_pack variable=cntr_pos_init #pragma HLS data_pack variable=clusters_out */ #pragma HLS data_pack variable=data_int_memory #pragma HLS data_pack variable=centre_positions #pragma HLS data_pack variable=centre_buffer // specify the type of memory instantiated for these arrays: two-port block ram #pragma HLS resource variable=data_int_memory core=RAM_2P_BRAM #pragma HLS resource variable=centre_positions core=RAM_2P_BRAM #pragma HLS resource variable=centre_buffer core=RAM_2P_LUTRAM // partition the arrays according to the parallelism degree P // NOTE: the part. factor must be updated if P is changed (in lloyds_alogrithm_top.h) ! #pragma HLS array_partition variable=centre_buffer block factor=40 dim=1 #pragma HLS array_partition variable=centre_positions block factor=40 dim=1 init_node_memory(data,n); centre_type filt_centres_out[K]; data_type new_centre_positions[K]; // more struct-packing #pragma HLS data_pack variable=filt_centres_out #pragma HLS data_pack variable=filt_centres_out // iterate over a constant number of outer clustering iterations it_loop: for (uint l=0; l=n-P+1) { //if (i>=n) { break; } } // readout centres read_out_centres_loop: for(centre_index_type i=0; i<=k; i++) { #pragma HLS pipeline II=1 coord_type_ext arr_count[P]; coord_type_ext arr_sum_sq[P]; coord_type_vector_ext arr_wgtCent[P]; #pragma HLS array_partition variable=arr_count complete #pragma HLS array_partition variable=arr_sum_sq complete #pragma HLS array_partition variable=arr_wgtCent complete for (uint p=0; p