File: ../../Sources/A11_error_mapping.vhd
0: ----------------------------------------------------------------------------------
1: -- Engineer: Vitor Mendes Camilo
2: --
3: -- Module Name: A11_error_mapping - Behavioral
4: --
5: -- Description: Code segment A.11
6: -- Error mapping to non-negative values
7: --
8: ----------------------------------------------------------------------------------
9:
10: library ieee;
11: use ieee.std_logic_1164.all;
12: use ieee.numeric_std.all;
13: use work.openjls_pkg.all;
14:
15: entity a11_error_mapping is
16: generic (
17: N_WIDTH : natural := CO_NQ_WIDTH_STD;
18: B_WIDTH : natural := CO_BQ_WIDTH_STD;
19: K_WIDTH : natural := CO_K_WIDTH_STD;
20: ERROR_WIDTH : natural := CO_ERROR_VALUE_WIDTH_STD;
21: MAPPED_ERROR_VAL_WIDTH : natural := CO_MAPPED_ERROR_VAL_WIDTH_STD
22: );
23: port (
24: iK : in unsigned (K_WIDTH - 1 downto 0);
25: iBq : in signed (B_WIDTH - 1 downto 0);
26: iNq : in unsigned (N_WIDTH - 1 downto 0);
27: iErrorVal : in signed (ERROR_WIDTH - 1 downto 0);
28: oMappedErrorVal : out unsigned (MAPPED_ERROR_VAL_WIDTH - 1 downto 0)
29: );
30: end entity a11_error_mapping;
31:
32: architecture behavioral of a11_error_mapping is
33:
34: -- Control flags
35: signal sSpecialMap : std_logic;
36: signal sErrEqualGreaterZero : std_logic;
37:
38: -- Width-extended compare for 2*B <= -N (avoid overflow and mismatched lengths)
39: signal sBExt : signed(B_WIDTH downto 0);
40: signal sNExt : signed(B_WIDTH downto 0);
41: signal sErrorValExt : signed((2 * MAPPED_ERROR_VAL_WIDTH) - 1 downto 0); -- so that abs(ErrorVal) fits
42:
43: -- Precomputed mapping candidates (parallel)
44: signal sErrU, sErrAbsU : unsigned (oMappedErrorVal'range);
45: signal sMapErrorSpecialPos : unsigned (oMappedErrorVal'range);
46: signal sMapErrorSpecialNeg : unsigned (oMappedErrorVal'range);
47: signal sMapErrorRegPos : unsigned (oMappedErrorVal'range);
48: signal sMapErrorRegNeg : unsigned (oMappedErrorVal'range);
49:
50: begin
51:
52: sErrorValExt <= resize(iErrorVal, sErrorValExt'length);
53: -- Extend and compare: 2*B <= -N with one extra bit to prevent overflow
54: sBExt <= resize(iBq, sBExt'length);
55: -- Zero-extend N before the signed reinterpretation: N reaches RESET (64), whose
56: -- bit pattern sets the MSB of the N_WIDTH-bit vector, so signed(iNq) would read
57: -- it as negative and wrongly trigger the special map. Widen first => sign bit 0.
58: sNExt <= signed(resize(iNq, sBExt'length));
59:
60: sSpecialMap <= '1' when (iK = 0 and 2 * sBExt <= - sNExt) else
61: '0';
62:
63: -- Error sign flag
64: sErrEqualGreaterZero <= '1' when iErrorVal >= 0 else
65: '0';
66:
67: -- Magnitudes for mapping
68: sErrU <= resize(unsigned(iErrorVal), sErrU'length); -- Only used when ErrorVal >= 0, conversion is safe
69: sErrAbsU <= resize(unsigned(abs(sErrorValExt)), sErrAbsU'length);
70:
71: -- Special mapping
72: sMapErrorSpecialPos <= resize((2 * sErrU) + 1, sMapErrorSpecialPos'length);
73: sMapErrorSpecialNeg <= resize((2 * sErrAbsU) - 2, sMapErrorSpecialNeg'length);
74:
75: -- Regular mapping
76: sMapErrorRegPos <= resize(2 * sErrU, sMapErrorRegPos'length);
77: sMapErrorRegNeg <= resize((2 * sErrAbsU) - 1, sMapErrorRegNeg'length);
78:
79: -- Final selection (purely combinational)
80: oMappedErrorVal <= sMapErrorSpecialPos when (sSpecialMap = '1' and sErrEqualGreaterZero = '1') else
81: sMapErrorSpecialNeg when (sSpecialMap = '1' and sErrEqualGreaterZero = '0') else
82: sMapErrorRegPos when (sSpecialMap = '0' and sErrEqualGreaterZero = '1') else
83: sMapErrorRegNeg; -- last case (Errval<0)
84:
85: end architecture behavioral;