# PoC.arith.scalerΒΆ

A flexible scaler for fixed-point values. The scaler is implemented for a set of multiplier and divider values. Each individual scaling operation can arbitrarily select one value from each these sets.

The computation calculates: `unsigned(arg) * MULS(msel) / DIVS(dsel)`

rounded to the nearest (tie upwards) fixed-point result of the same precision
as `arg`

.

The computation is started by asserting `start`

to high for one cycle. If a
computation is running, it will be restarted. The completion of a calculation
is signaled via `done`

. `done`

is high when no computation is in progress.
The result of the last scaling operation is stable and can be read from
`res`

. The weight of the LSB of `res`

is the same as the LSB of `arg`

.
Make sure to tap a sufficient number of result bits in accordance to the
highest scaling ratio to be used in order to avoid a truncation overflow.

Entity Declaration:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | ```
entity arith_scaler is
generic (
MULS : T_POSVEC := (0 => 1); -- The set of multipliers to choose from in scaling operations.
DIVS : T_POSVEC := (0 => 1) -- The set of divisors to choose from in scaling operations.
);
port (
clk : in std_logic;
rst : in std_logic;
start : in std_logic; -- Start of Computation
arg : in std_logic_vector; -- Fixed-point value to be scaled
msel : in std_logic_vector(log2ceil(MULS'length)-1 downto 0) := (others => '0');
dsel : in std_logic_vector(log2ceil(DIVS'length)-1 downto 0) := (others => '0');
done : out std_logic; -- Completion
res : out std_logic_vector -- Result
);
end entity arith_scaler;
``` |