The AMD FIR IP block can be called within a C++ design using the library hls_fir.h. This section explains how the FIR can be configured in your C++ code.
To use the FIR in your C++ code:
- Include the hls_fir.h library in the code.
- Set the static parameters using the predefined struct
hls::ip_fir::params_t
. - Call the FIR function.
- Optionally, define a runtime input configuration to modify some parameters dynamically.
The following code examples provide a summary of how each of these steps is performed. Each step is discussed in more detail below.
First, include the FIR library in the source code. This header file resides in the include directory in the Vitis HLS installation area. This directory is automatically searched when Vitis HLS executes. There is no need to specify the path to this directory if compiling inside Vitis HLS.
#include "hls_fir.h"
Define the static parameters of the FIR. This includes such static
attributes such as the input width, the coefficients, the filter rate (single
, decimation
,
hilbert
). The FIR library includes a
parameterization struct hls::ip_fir::params_t
which
can be used to initialize all static parameters with default values.
In this example, the coefficients are defined as residing in array
coeff_vec
and the default values for the number
of coefficients, the input width and the quantization mode are over-ridden using a
user a user-defined struct myconfig
based on the
predefined struct.
struct myconfig : hls::ip_fir::params_t {
static const double coeff_vec[sg_fir_srrc_coeffs_len];
static const unsigned num_coeffs = sg_fir_srrc_coeffs_len;
static const unsigned input_width = INPUT_WIDTH;
static const unsigned quantization = hls::ip_fir::quantize_only;
};
Create an instance of the FIR function using the HLS namespace with
the defined static parameters (myconfig
in this
example) and then call the function with the run
method to execute the function. The function arguments are, in order, input data and
output data.
static hls::FIR<param1> fir1;
fir1.run(fir_in, fir_out);
Optionally, a runtime input configuration can be used. In some modes of the FIR, the data on this input determines how the coefficients are used during interleaved channels or when coefficient reloading is required. This configuration can be dynamic and is therefore defined as a variable. For a complete description of which modes require this input configuration, refer to the FIR Compiler LogiCORE IP Product Guide (PG149).
When the runtime input configuration is used, the FIR function is called with three arguments: input data, output data and input configuration.
// Define the configuration type
typedef ap_uint<8> config_t;
// Define the configuration variable
config_t fir_config = 8;
// Use the configuration in the FFT
static hls::FIR<param1> fir1;
fir1.run(fir_in, fir_out, &fir_config);
hls::stream
for arguments. Refer to
Vitis HLS Introductory
Examples for more information.