Я разработал элемент обработки, который должен иметь возможность вычислять две разные функции, в которых L_a, L_b и u_s являются операндами. B_l_i выбирает, будет ли вычислена та или иная функция. Реализованный в моем окончательном проекте, он действует не так, как предполагается: проблемная часть c связана с вычислением функции (L_a) (- 1) ^ (u_s) + (L_b), что приводит к вычислению 1 + 1 = -2. Для определения знака выхода используется sign_g в этом случае.
entity pe is
GENERIC (
q: integer := 8 );
PORT(
L_a_abs: IN std_logic_vector (q-2 DOWNTO 0); --Input LLR: magnitude
L_b_abs: IN std_logic_vector(q-2 DOWNTO 0); --Input LLR: magnitude
L_a_sign: IN Std_logic; --Input LLR: Sign
L_b_sign: IN Std_logic; --Input LLR: SIGN
u_s: IN std_logic; --Partial SUM
B_l_i: IN std_logic; --Select f or g
L_out_abs: OUT std_logic_vector(q-2 DOWNTO 0); --Output LLR: magnitude
L_out_sign: OUT STD_logic --Output LLR: sign
);
end pe;
...
--G-Function:
comp <= (L_a_abs >= L_b_abs);
sign_g <= L_b_sign when (comp = FALSE) else
dbg_xor;
dbg_xor <= L_a_sign XOR u_s;
Я ожидаю, что sign_g и dbg_xor будут равны '0', когда L_a_sign = '0' и u_s = '0'. Но во время симуляции, показанной на рисунке ниже, dbg_xor = '1'. Поэтому знак вывода неверен. В схеме c это простой XOR с входами L_a_sign и u_s и выходом dbg_xor. У вас есть объяснение этому странному поведению?
![During Simulation](https://i.stack.imgur.com/QqnuU.png)
При моделировании только одного элемента обработки это странное поведение не отображается. Он вычисляет правильный знак и величину с теми же входными данными. Но реализованный во всей конструкции (массив таких элементов обработки), он действует таким образом в этом цикле тактовой частоты, что приводит к ошибкам в следующих вычислениях. Но даже при моделировании массива элементов обработки с одними и теми же входными данными, элемент обработки действует как следует. Поэтому трудно привести минимальный воспроизводимый пример.
Спасибо за помощь!