Я пишу код в VHDL для арифметических операций с сигналами. Я объявил сигналы следующим образом:Арифметическая операция неподвижной точки с Std_logic_vector в VHDL
signal x : std_logic_vector (7 downto 0);
signal y: std_logic_vector (7 downto 0);
signal z: std_logic_vector ( 7 downto 0);
z<= x-y ;
в деталях:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
USE ieee.std_logic_arith.conv_std_logic_vector;
library ieee_proposed;
use ieee_proposed.fixed_pkg.all;
signal heat0,heat1,heat2 : std_logic_vector(31 downto 0);
signal Data_In, M_AXIS_TDATA Fixed_input_tdata: std_logic_vector (31 downto 0);
shared variable float, h0,h1,h2,fixed1,fixed2,fixed3,fixed_shift :ufixed (23 downto -8);
shared variable fixed_64: ufixed (31 downto -32);
float := to_ufixed(unsigned (Fixed_input_tdata), 23,-8);
h2 := to_ufixed(unsigned(Data_In),23,-8);
heat1 <= Data_in;
h1 := to_ufixed(unsigned(heat1),23,-8);
heat0<= heat1;
h0 := to_ufixed(unsigned(heat0),23,-8);
heat1_mult := std_logic_vector(unsigned(heat1) sll 1);
fixed_shift := to_ufixed(unsigned (heat1_mult), 23,-8);
fixed1 := fixed_shift+h2;
fixed2 := h0-fixed1;
fixed_64 := fixed2 *float;
fixed3 := h1+fixed_64;--(23 downto -8);
M_AXIS_TDATA <= std_logic_vector (fixed3);
Так это правильный способ делать арифметические операции std_logic-вектора с фиксированной точкой?
так давайте возьмем пример, z = 0x01-0x11. это даст отрицательный результат (0xF0): Но я не хочу отрицательный вывод. Я хочу, чтобы это значение было позитивным. Я даже пытался изменить эти типы сигналов как unsigned, но все равно не смог добиться успеха. На самом деле у меня есть некоторые сложные математические операции в vhdl, поэтому я просто приводил здесь пример, чтобы сделать мой смысл понятным. Я не хочу использовать подписанные значения. Как отправить положительный вывод без знака?
Еще один пример: если мой вывод равен bf978000, он будет отображаться как отрицательное число -1.18. Я хочу, чтобы он был положительным, а не отрицательным.
Позвольте мне другой пример:
г = 2+ [0,2 * (4-10)] = 0,8. 0,8 в формате фиксированной точки (0x000000cd) (24 целых, 8 дробных форматов): 0,2 - 0x00000033 в формате с фиксированной точкой. (24 число, 8 дробно формат) , но я получаю [0x00000002 + (0x00000033 * (0x00000004-0x0000000A)] = FFFFFED0. (Который является отрицательным числом). Как представить, что выход в 0.8 снова.
Я надеюсь, Теперь я объясняю свою проблему хорошо.
любезно прояснить мое замешательство. Благодаря
Настоятельно рекомендуем использовать numeric_std вместо std_logic_vector для арифметики. Кроме того, если вы используете Xilinx ISIM, включите его проверку диапазона (в «Свойствах процесса, расширенном представлении»). Моделирование практически бесполезно без этих проверок. –
Да, я использовал этот номер-Std. Это не случай для waveform, я также проверяю вывод на терминале, но для меня такая же проблема. –
Если вы вычтите большое число (например, 7) из меньшего (скажем, 2), какой результат вы ожидаете? –