Main Content

Generate HDL-Compatible Lookup Table Function Replacements Using coder.approximate

This example shows MATLAB® code generation from a floating-point MATLAB design that is not ready for code generation. Use coder.approximate function to generate a lookup table based MATLAB function. This newly generated function is ready for HDL code generation (not shown in this demo).

The MATLAB code used in this example is a sigmoid function, which is used for threshold detection and decision making problems. For example, neural networks use sigmoid functions with appropriate thresholds to train systems for learning patterns.

MATLAB Design

design_name = 'mlhdlc_approximate_sigmoid';
testbench_name = 'mlhdlc_approximate_sigmoid_tb';

The mlhdlc_approximate_sigmoid.m file contains the MATLAB code for a sigmoid function.

type(design_name);
%   Copyright 2014-2015 The MathWorks, Inc.

function y = mlhdlc_approximate_sigmoid( x )
    y = 1./(1+exp(-x));
end

The mlhdlc_approximate_sigmoid_tb.m file is a MATLAB test bench script used for verifying the functionality and performance of the LUT-based sigmoid approximation generated by mlhdlc_approximate_sigmoid function.

type(testbench_name);
%   Copyright 2014-2015 The MathWorks, Inc.

close all

x = linspace(-10,10,1e3);
for itr = 1e3:-1:1
    y(itr) = mlhdlc_approximate_sigmoid( x(itr) );
end
plot( x, y );
title('Sigmoid function')

Simulate the Design

Simulate the design with the testbench prior to code generation to make sure there are no runtime errors.

mlhdlc_approximate_sigmoid_tb;

Generate Fixed-Point Lookup-Table Replacements

Use coder.approximate to generate a lookup-table based replacement function for mlhdlc_approximate_sigmoid.

repCfg = coder.approximation('Function','mlhdlc_approximate_sigmoid','CandidateFunction',@mlhdlc_approximate_sigmoid,...
                             'NumberOfPoints',50,'InputRange',[-10,10],'FunctionNamePrefix','repsig_');
coder.approximate(repCfg);
### Generating approximation for 'mlhdlc_approximate_sigmoid' : <a href="matlab:edit('/tmp/Bdoc24b_2679053_1563486/tpb3cb6057/hdlcoder-ex41562150/repsig_lookuptable.m')">repsig_lookuptable.m</a>
### Generating testbench for 'mlhdlc_approximate_sigmoid' : <a href="matlab:edit('/tmp/Bdoc24b_2679053_1563486/tpb3cb6057/hdlcoder-ex41562150/repsig_lookuptable_tb.m')">repsig_lookuptable_tb.m</a>
### LookupTable replacement for function 'mlhdlc_approximate_sigmoid' used 50 data points

The fixed-point conversion completes with appropriate function replacements generates the MATLAB files repsig_lookuptable_tb, and repsig_lookuptable containing the testbench and design respectively.

Test the Replacement Functions

To visually see the degree of match between lookup-table based replacement function and the original function use the testbench,

repsig_lookuptable_tb();
iteration 1 repsig_lookuptable(-10) = 4.5398e-05
iteration 2 repsig_lookuptable(-9.8658) = 5.2923e-05
iteration 3 repsig_lookuptable(-9.7315) = 6.0447e-05
iteration 4 repsig_lookuptable(-9.5973) = 6.7972e-05
iteration 5 repsig_lookuptable(-9.4631) = 7.9134e-05
iteration 6 repsig_lookuptable(-9.3289) = 9.0451e-05
iteration 7 repsig_lookuptable(-9.1946) = 0.00010177
iteration 8 repsig_lookuptable(-9.0604) = 0.00011832
iteration 9 repsig_lookuptable(-8.9262) = 0.00013534
iteration 10 repsig_lookuptable(-8.7919) = 0.00015236
iteration 11 repsig_lookuptable(-8.6577) = 0.00017691
iteration 12 repsig_lookuptable(-8.5235) = 0.0002025
iteration 13 repsig_lookuptable(-8.3893) = 0.0002281
iteration 14 repsig_lookuptable(-8.255) = 0.00026448
iteration 15 repsig_lookuptable(-8.1208) = 0.00030297
iteration 16 repsig_lookuptable(-7.9866) = 0.00034146
iteration 17 repsig_lookuptable(-7.8523) = 0.00039538
iteration 18 repsig_lookuptable(-7.7181) = 0.00045325
iteration 19 repsig_lookuptable(-7.5839) = 0.00051112
iteration 20 repsig_lookuptable(-7.4497) = 0.000591
iteration 21 repsig_lookuptable(-7.3154) = 0.000678
iteration 22 repsig_lookuptable(-7.1812) = 0.00076501
iteration 23 repsig_lookuptable(-7.047) = 0.00088328
iteration 24 repsig_lookuptable(-6.9128) = 0.0010141
iteration 25 repsig_lookuptable(-6.7785) = 0.0011448
iteration 26 repsig_lookuptable(-6.6443) = 0.0013199
iteration 27 repsig_lookuptable(-6.5101) = 0.0015164
iteration 28 repsig_lookuptable(-6.3758) = 0.0017129
iteration 29 repsig_lookuptable(-6.2416) = 0.0019717
iteration 30 repsig_lookuptable(-6.1074) = 0.0022668
iteration 31 repsig_lookuptable(-5.9732) = 0.0025619
iteration 32 repsig_lookuptable(-5.8389) = 0.0029445
iteration 33 repsig_lookuptable(-5.7047) = 0.0033873
iteration 34 repsig_lookuptable(-5.5705) = 0.0038302
iteration 35 repsig_lookuptable(-5.4362) = 0.0043948
iteration 36 repsig_lookuptable(-5.302) = 0.0050586
iteration 37 repsig_lookuptable(-5.1678) = 0.0057224
iteration 38 repsig_lookuptable(-5.0336) = 0.0065543
iteration 39 repsig_lookuptable(-4.8993) = 0.0075477
iteration 40 repsig_lookuptable(-4.7651) = 0.0085411
iteration 41 repsig_lookuptable(-4.6309) = 0.0097641
iteration 42 repsig_lookuptable(-4.4966) = 0.011247
iteration 43 repsig_lookuptable(-4.3624) = 0.01273
iteration 44 repsig_lookuptable(-4.2282) = 0.014522
iteration 45 repsig_lookuptable(-4.094) = 0.016727
iteration 46 repsig_lookuptable(-3.9597) = 0.018932
iteration 47 repsig_lookuptable(-3.8255) = 0.021546
iteration 48 repsig_lookuptable(-3.6913) = 0.024806
iteration 49 repsig_lookuptable(-3.557) = 0.028067
iteration 50 repsig_lookuptable(-3.4228) = 0.031855
iteration 51 repsig_lookuptable(-3.2886) = 0.036636
iteration 52 repsig_lookuptable(-3.1544) = 0.041418
iteration 53 repsig_lookuptable(-3.0201) = 0.046856
iteration 54 repsig_lookuptable(-2.8859) = 0.053784
iteration 55 repsig_lookuptable(-2.7517) = 0.060711
iteration 56 repsig_lookuptable(-2.6174) = 0.068417
iteration 57 repsig_lookuptable(-2.4832) = 0.07828
iteration 58 repsig_lookuptable(-2.349) = 0.088142
iteration 59 repsig_lookuptable(-2.2148) = 0.098865
iteration 60 repsig_lookuptable(-2.0805) = 0.11256
iteration 61 repsig_lookuptable(-1.9463) = 0.12626
iteration 62 repsig_lookuptable(-1.8121) = 0.14081
iteration 63 repsig_lookuptable(-1.6779) = 0.15919
iteration 64 repsig_lookuptable(-1.5436) = 0.17757
iteration 65 repsig_lookuptable(-1.4094) = 0.19669
iteration 66 repsig_lookuptable(-1.2752) = 0.22024
iteration 67 repsig_lookuptable(-1.1409) = 0.2438
iteration 68 repsig_lookuptable(-1.0067) = 0.26785
iteration 69 repsig_lookuptable(-0.87248) = 0.29633
iteration 70 repsig_lookuptable(-0.73826) = 0.32481
iteration 71 repsig_lookuptable(-0.60403) = 0.35351
iteration 72 repsig_lookuptable(-0.4698) = 0.38561
iteration 73 repsig_lookuptable(-0.33557) = 0.41771
iteration 74 repsig_lookuptable(-0.20134) = 0.44984
iteration 75 repsig_lookuptable(-0.067114) = 0.48328
iteration 76 repsig_lookuptable(0.067114) = 0.51672
iteration 77 repsig_lookuptable(0.20134) = 0.55016
iteration 78 repsig_lookuptable(0.33557) = 0.58229
iteration 79 repsig_lookuptable(0.4698) = 0.61439
iteration 80 repsig_lookuptable(0.60403) = 0.64649
iteration 81 repsig_lookuptable(0.73826) = 0.67519
iteration 82 repsig_lookuptable(0.87248) = 0.70367
iteration 83 repsig_lookuptable(1.0067) = 0.73215
iteration 84 repsig_lookuptable(1.1409) = 0.7562
iteration 85 repsig_lookuptable(1.2752) = 0.77976
iteration 86 repsig_lookuptable(1.4094) = 0.80331
iteration 87 repsig_lookuptable(1.5436) = 0.82243
iteration 88 repsig_lookuptable(1.6779) = 0.84081
iteration 89 repsig_lookuptable(1.8121) = 0.85919
iteration 90 repsig_lookuptable(1.9463) = 0.87374
iteration 91 repsig_lookuptable(2.0805) = 0.88744
iteration 92 repsig_lookuptable(2.2148) = 0.90113
iteration 93 repsig_lookuptable(2.349) = 0.91186
iteration 94 repsig_lookuptable(2.4832) = 0.92172
iteration 95 repsig_lookuptable(2.6174) = 0.93158
iteration 96 repsig_lookuptable(2.7517) = 0.93929
iteration 97 repsig_lookuptable(2.8859) = 0.94622
iteration 98 repsig_lookuptable(3.0201) = 0.95314
iteration 99 repsig_lookuptable(3.1544) = 0.95858
iteration 100 repsig_lookuptable(3.2886) = 0.96336
iteration 101 repsig_lookuptable(3.4228) = 0.96815
iteration 102 repsig_lookuptable(3.557) = 0.97193
iteration 103 repsig_lookuptable(3.6913) = 0.97519
iteration 104 repsig_lookuptable(3.8255) = 0.97845
iteration 105 repsig_lookuptable(3.9597) = 0.98107
iteration 106 repsig_lookuptable(4.094) = 0.98327
iteration 107 repsig_lookuptable(4.2282) = 0.98548
iteration 108 repsig_lookuptable(4.3624) = 0.98727
iteration 109 repsig_lookuptable(4.4966) = 0.98875
iteration 110 repsig_lookuptable(4.6309) = 0.99024
iteration 111 repsig_lookuptable(4.7651) = 0.99146
iteration 112 repsig_lookuptable(4.8993) = 0.99245
iteration 113 repsig_lookuptable(5.0336) = 0.99345
iteration 114 repsig_lookuptable(5.1678) = 0.99428
iteration 115 repsig_lookuptable(5.302) = 0.99494
iteration 116 repsig_lookuptable(5.4362) = 0.99561
iteration 117 repsig_lookuptable(5.5705) = 0.99617
iteration 118 repsig_lookuptable(5.7047) = 0.99661
iteration 119 repsig_lookuptable(5.8389) = 0.99706
iteration 120 repsig_lookuptable(5.9732) = 0.99744
iteration 121 repsig_lookuptable(6.1074) = 0.99773
iteration 122 repsig_lookuptable(6.2416) = 0.99803
iteration 123 repsig_lookuptable(6.3758) = 0.99829
iteration 124 repsig_lookuptable(6.5101) = 0.99848
iteration 125 repsig_lookuptable(6.6443) = 0.99868
iteration 126 repsig_lookuptable(6.7785) = 0.99886
iteration 127 repsig_lookuptable(6.9128) = 0.99899
iteration 128 repsig_lookuptable(7.047) = 0.99912
iteration 129 repsig_lookuptable(7.1812) = 0.99923
iteration 130 repsig_lookuptable(7.3154) = 0.99932
iteration 131 repsig_lookuptable(7.4497) = 0.99941
iteration 132 repsig_lookuptable(7.5839) = 0.99949
iteration 133 repsig_lookuptable(7.7181) = 0.99955
iteration 134 repsig_lookuptable(7.8523) = 0.9996
iteration 135 repsig_lookuptable(7.9866) = 0.99966
iteration 136 repsig_lookuptable(8.1208) = 0.9997
iteration 137 repsig_lookuptable(8.255) = 0.99974
iteration 138 repsig_lookuptable(8.3893) = 0.99977
iteration 139 repsig_lookuptable(8.5235) = 0.9998
iteration 140 repsig_lookuptable(8.6577) = 0.99982
iteration 141 repsig_lookuptable(8.7919) = 0.99985
iteration 142 repsig_lookuptable(8.9262) = 0.99986
iteration 143 repsig_lookuptable(9.0604) = 0.99988
iteration 144 repsig_lookuptable(9.1946) = 0.9999
iteration 145 repsig_lookuptable(9.3289) = 0.99991
iteration 146 repsig_lookuptable(9.4631) = 0.99992
iteration 147 repsig_lookuptable(9.5973) = 0.99993
iteration 148 repsig_lookuptable(9.7315) = 0.99994
iteration 149 repsig_lookuptable(9.8658) = 0.99995
iteration 150 repsig_lookuptable(10) = 0.99995
###### Error Metrics for replacement function #####
Absolute Error = '6.7763e-21   0.0018675'
Relative Error = '0.00067538'
Mean-square Error = '8.4089e-07'