Initializing ap_[u]fixpt Types
(Ask a Question)The ap_[u]fixpt
types can be constructed and assigned from other fixed
points, the ap_[u]int
types, C++ integer and floating point types, as well
as concatenations and bit selections. They can also be initialized from a hexadecimal
string describing the exact bits. Note that construction and assignment will always trigger
the quantization and overflow handling of the ap_[u]fixpt
being
constructed or assigned to, except when copying from the exact same type, or initializing
from a hexadecimal string. For logical assignments of bits, bit selection assignments can
be used, as well as the from_raw_bits
function, or the
ap_[u]int
to_fixpt<I_W>()
functions in the case of ap_[u]int
types.
Initializing ap_[u]fixpt
types from floating point types in
hardware is expensive, and should be avoided when possible. However, initializing
ap_[u]fixpt
from floating point literals is free, and happens at
compile time.
#include "hls/ap_int.hpp" #include "hls/ap_fixpt.hpp" #include <iostream> #include <stdio.h> using namespace hls;
//... // Initialized to -13.75 ap_fixpt<8, 4> fixed1 = -13.75; std::cout << "fixed1 = " << fixed1 << std::endl; // Initialized to 135 ap_ufixpt<8, 8> fixed2 = 135; std::cout << "fixed2 = " << fixed2 << std::endl; // Initialized to -112 // Could also write "0x9" // 0x is optional ap_fixpt<4, 8> fixed3("9"); std::cout << "fixed3 = " << fixed3 << std::endl; // Initialized to 14 ap_ufixpt<10, 4> fixed4 = ap_uint<16>(14); std::cout << "fixed4 = " << fixed4 << std::endl; // Initialized to -1 (AP_SAT triggered) ap_fixpt<4, 1, AP_TRN, AP_SAT> fixed5 = -4; std::cout << "fixed5 = " << fixed5 << std::endl; // Initialized to 1.5 (AP_RND triggered) ap_ufixpt<4, 3, AP_RND> fixed6 = 1.25; std::cout << "fixed6 = " << fixed6 << std::endl; // Initialized to 15.75 from a logical string of bits ap_ufixpt<8, 4> fixed7; fixed7(7, 0) = ap_uint<8>("FC"); std::cout << "fixed7 = " << fixed7 << std::endl; // Assign an existing ap_uint variable to an ap_ufixpt variable ap_uint<8> ap_uint_var = 15; ap_ufixpt<8, 4> fixed8; fixed8(7, 0) = ap_uint_var; std::cout << "fixed8 = " << fixed8 << std::endl; // Initialize to 13 from a logical string of bits ap_fixpt<6, 5> fixed9; fixed9.from_raw_bits(ap_uint<6>(26)); std::cout << "fixed9 = " << fixed9 << std::endl; // Initialize to -32 from a logical string of bits // (First convert ap_uint<4> to ap_fixpt<4, 6> logically, // then perform fixed point assignment) ap_fixpt<1, 6> fixed10 = ap_uint<4>("8").to_fixpt<6>(); std::cout << "fixed10 = " << fixed10 << std::endl; // Initialize to 32 from a logical string of bits // (First convert ap_int<4> to ap_ufixpt<4, 6> logically, // then perform fixed point assignment) ap_ufixpt<1, 6> fixed11 = ap_int<4>("8").to_ufixpt<6>(); std::cout << "fixed11 = " << fixed1 << std::endl;