Customize Output Value of Real Divide HDL Optimized Block When Denominator Is Zero
This example shows how to customize the output value of the Real Divide HDL Optimized block when the denominator is zero.
Default Behavior for Fixed-Point Division by Zero
The default behavior for division by zero with fixed-point inputs is saturation:
If the numerator is greater than or equal to zero, the output at the y port is equal to
upperbound(OutputType)
.If the numerator is smaller than zero, the output at the y port is equal to
lowerbound(OutputType)
.
This behavior is consistent with the divide
function. A warning is displayed when division by zero occurs.
posDivByZero = divide(numerictype(1,18,10),fi(1,1,18,10),fi(0,1,18,10))
Warning: Division by zero occurred. Quotient was saturated.
posDivByZero = 127.9990 DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 18 FractionLength: 10
zeroDivByZero = divide(numerictype(1,18,10),fi(0,1,18,10),fi(0,1,18,10))
Warning: Division by zero occurred. Quotient was saturated.
zeroDivByZero = 127.9990 DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 18 FractionLength: 10
negDivByZero = divide(numerictype(1,18,10),fi(-1,1,18,10),fi(0,1,18,10))
Warning: Division by zero occurred. Quotient was saturated.
negDivByZero = -128 DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 18 FractionLength: 10
Customize Output Value for Division by Zero
In applications where a different behavior is preferred for division by zero, you can use the Show divide by zero parameter to enable the divideByZero port, combined with a Switch block, to override the default output values. This example shows how to configure the Real Divide HDL Optimized block to output 0
when division by zero occurs.
Open the realDivideDBZExample
model.
mdl = 'realDivideDBZExample';
open_system(mdl);
The model contains a Real Divide HDL Optimized block connected to a data source, which takes in arrays of inputs (numerators and denominators) and passes an input value from each array to the Real Divide HDL Optimized block on consecutive cycles. The output computed for each value is stored in a workspace variable. The simulation terminates when all inputs have been processed.
The divideByZero output port carries a Boolean flag that indicates if the corresponding denominator is zero. In this model, the divideByZero output port is connected to a Switch block. When the value at the divideByZero port is true
, the model overrides the output value by the constant 0.
When the value at the divideByZero port is false
, the output value is the output of Real Divide HDL Reciprocal block.
Define Input Data
Define the custom value of the output for divide by zero to be 0
.
dbzOutput = 0;
Define arrays of inputs, realDivideNumerators
and realDivideDenominators
.
rng('default');
inOutDataType = numerictype(1,18,10);
realDivideNumerators = fi(randn(10,1)-0.5,inOutDataType);
realDivideDenominators = fi(randn(10,1)-0.5,inOutDataType);
Specify every other denominators to be 0
.
realDivideDenominators(1:2:numel(realDivideDenominators)) = 0; dbzIndices = find(realDivideDenominators==0);
Define the output data type to be used in the model.
OutputType = inOutDataType;
Simulate Model and Verify Output Values
Simulate the model.
sim(mdl);
To examine the error of the calculation, compare the output of the Real Divide HDL Optimized block to the output of the divide
function.
Verify Output Values with Default Divide by Zero Output Value
Compare the output of the Real Divide HDL Optimized block to the output of the divide
function when the default divide by zero behavior is used.
expectedOutputDefault = divide(OutputType,realDivideNumerators,realDivideDenominators);
Warning: Division by zero occurred. Quotient was saturated.
Compute the maximum error between the expected values and the actual values.
maxErrorDefaultDbz = max(abs(expectedOutputDefault - realDivideOutputsDefaultDbz))
maxErrorDefaultDbz = 9.7656e-04 DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 19 FractionLength: 10
Show the default divide by zero output values. At division by zero, output values are saturated to the upper or lower bound of the output data type.
realDivideOutputsDefaultDbz(dbzIndices)
ans = 127.9990 -128.0000 -128.0000 -128.0000 127.9990 DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 18 FractionLength: 10
Verify Output Values with Custom Divide by Zero Output Value
Compare the output of the Real Divide HDL Optimized block to the output of the divide
function when a custom divide by zero behavior is used.
expectedOutputCustomizedDbz = expectedOutputDefault;
Replace the default division by zero output values with custom values. Compute the maximum error between the expected values and the actual values.
expectedOutputCustomizedDbz(dbzIndices) = dbzOutput; maxErrorCustomizedDbz = max(abs(expectedOutputCustomizedDbz - realDivideOutputsCustomizedDBZ))
maxErrorCustomizedDbz = 9.7656e-04 DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 19 FractionLength: 10
Show the customized divide by zero output values. At division by zero, the output values are set to the user-specified value of 0
.
realDivideOutputsCustomizedDBZ(dbzIndices)
ans = 0 0 0 0 0 DataTypeMode: Fixed-point: binary point scaling Signedness: Signed WordLength: 18 FractionLength: 10
See Also
Functions
Blocks
- Real Divide HDL Optimized | Complex Divide HDL Optimized | Real Reciprocal HDL Optimized | Normalized Reciprocal HDL Optimized