Handling Constants in HDL and HLS Code Generation
When generating HDL or High-Level Synthesis (HLS) code from MATLAB®, handling constants efficiently is important for optimizing performance
and resource utilization. You can do this by using the functions coder.const
and coder.load
.
Specify Constants in Generated Code
To optimize the code, specify the constants in the generated code by using
coder.const
.
In the table, the MATLAB code consists of two functions, filter_lowpass
and calc_lowpass
. The filter_lowpass
function applies a low-pass filter to an input sample in and outputs a single value
representing the current filtered sample of the input signal. The
calc_lowpass
function calculates the filter coefficients
for a low-pass filter given a normalized cutoff frequency
fc
.
Using coder.const
in the filter_lowpass
function instructs the code generator to treat the coefficients as
constants.
MATLAB Code | MATLAB Test Bench |
---|---|
% MATLAB code function out=filter_lowpass(in) persistent delayline; if isempty(delayline) delayline=zeros(1,21); end fc = 0.3; coefficients=coder.const(calc_lowpass(fc)); delayline=[in delayline(1:20)]; out=sum(delayline.*coefficients); end function coeffs=calc_lowpass(fc) x = (-10:10)*fc; % sinc and gausswin are not supported with fi datatype % Cast it to single or double. coeffs=sinc(single(x)).*gausswin(single(21)).'; coeffs=coeffs/sum(coeffs); end |
n = 100; t = 0:n; signal=sin(2*pi*(t/n)/2.*(t)); filtered=zeros(size(signal)); for i=1:length(t) filtered(i)=filter_lowpass(signal(i)); end |
Load Compile-Time Constants from MAT-file
You can also load compile-time constants from external files into your MATLAB design by using coder.load
. The function
coder.load
loads data at compile time, not at run
time.
In this example, the MATLAB code defines a low-pass filter filter_lowpass
that uses coefficients loaded from a file coeffs.mat
to filter an
input signal. The MATLAB test bench generates the signals using
calc_lowpass
and then saves them in
coeffs.mat
.
MATLAB Code | MATLAB Test Bench |
---|---|
% MATLAB code function out=filter_lowpass(in) persistent delayline coeffs; if isempty(delayline) % load the mat file for the coeffs coeffs_struct = coder.load('coeffs.mat'); coeffs = coeffs_struct.coeffs; delayline=zeros(1,21); end delayline=[in delayline(1:20)]; out=sum(delayline.*coeffs); end function coeffs=calc_lowpass(fc) x = (-10:10)*fc; coeffs=sinc(single(x)).*gausswin(single(21)).'; coeffs=coeffs/sum(coeffs); end |
n = 100; t = 0:n; signal=sin(2*pi*(t/n)/2.*(t)); % create a mat file for the constant % coefficients from calc_lowpass function fc = fi(0.3, 0, 14, 15, hdlfimath); coeffs = calc_lowpass(fc); save coeffs.mat coeffs; filtered=zeros(size(signal)); for i=1:length(t) filtered(i)=filter_lowpass(signal(i)); end |
Generate HDL or HLS Code
To generate HDL or HLS code for the above defined MATLAB functions use these commands.
fname = 'filter_lowpass'; % HLS Codegen cfg = coder.config('hdl'); % cfg.workflow = "Generic ASIC/FPGA"; % For HDL code generation cfg.workflow = "High Level Synthesis"; tbname = [fname,'_tb']; cfg.TestBenchName = tbname; fixptCfg = coder.config('fixpt'); fixptCfg.TestBenchName = cfg.TestBenchName; outname = [fname,'_sc_fixpt']; codegen(fname,'-config',cfg,'-report','-float2fixed',fixptCfg);