2015-05-26 2 views
0

Я пишу код в 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 снова.

Я надеюсь, Теперь я объясняю свою проблему хорошо.

любезно прояснить мое замешательство. Благодаря

+2

Настоятельно рекомендуем использовать numeric_std вместо std_logic_vector для арифметики. Кроме того, если вы используете Xilinx ISIM, включите его проверку диапазона (в «Свойствах процесса, расширенном представлении»). Моделирование практически бесполезно без этих проверок. –

+0

Да, я использовал этот номер-Std. Это не случай для waveform, я также проверяю вывод на терминале, но для меня такая же проблема. –

+0

Если вы вычтите большое число (например, 7) из меньшего (скажем, 2), какой результат вы ожидаете? –

ответ

1

Если вы можете использовать z <= x - y напрямую, это звучит, как вы используете один из пакетов Synopsys как ieee.std_logic_unsigned, но вместо этого вы можете рассмотреть вопрос об использовании Стандарт VHDL ieee.numeric_std, который используется в приведенном ниже примере.

std_logic_vector по умолчанию не имеет числового представления; это всего лишь массив из std_logic. unsigned типа в ieee.numeric_std пакете может указывать числовое представление std_logic_vector делает unsigned(x). Таким образом, приведенные выше выражение, используя беззнаковое вычитание будет:

z <= std_logic_vector(unsigned(x) - unsigned(z)); 

Любого опустошение/перерасход, как и с «г = 0x01-0x11», приведет к в обертке без каких-либо указаний.

+0

Я уже пробовал эту процедуру выше, но мой сигнал все еще показывает отрицательный результат. –

+0

@NabeelAnjum: Какое значение вы используете в 'z' как' std_logic_vector' после операции, такой как z = 0x01 - 0x11, в терминах «положительного» значения? –

+0

нравится. например, z = 2+ [0.2 * (-6)] = 0.8, который будет в формате фиксированной точки (0x000000cd) (24 целых, 8 дробных форматов): , но я получаю [0x0010 + (0x00000033 * (FFFFFFFA)] .. -6 в приведенном выше примере создает проблему для меня. –

1

Я думаю, что ваш вопрос нуждается в некоторой доработке. Я не знаю, почему это помечено verilog, шестнадцатеричные числа, которые вы указали, не подписаны, а std_logic_vector не является арифметикой (добавление такой интерпретации выполняется с помощью std_logic_arith или аналогичного, но предпочтительно использовать unsigned и signed from numeric_std). Таким образом, для вашего кода должно быть больше для того, чтобы вычитание работало, а отрицательные числа должны быть от чего-то другого; симулятор, может быть? Симуляторы и зрители осциллограмм имеют свои собственные настройки для интерпретации сигналов.

Итак, разверните образец, чтобы показать среду, в которой вы используете, и объясните, какую операцию вы фактически ищете. Вы имели в виду абсолютное значение разницы или использовали насыщенную арифметику?

+1

Удален тег Verilog, поскольку только связанный VHDL. –

+0

Я фактически умножаю номер фиксированной точки на операции std_logic_vector. поэтому вы можете предположить: Давайте скажем (0x00000080 * (0x00000001 - 0x00000011)) даст мне отрицательное шестизначное значение. Таким образом, я получаю отрицательный результат (например, 0xFFFxxxxx) >, которого не должно быть. ИЛИ > Выход 0xbf970a3d фактически равен -1.18 в float, что нежелательно. –

+0

Вычитание большего числа из нижнего числа приводит к отрицательной разнице. Если вы хотите что-то еще, вам придется решить, что такое, например, как арифметика по модулю, насыщенная арифметика или абсолютное значение.Ваш код выполняет modulo арифметику (что, вероятно, неуместно), вы, кажется, интерпретируете его как отрицательное значение, и вы еще не раскрыли, что вы на самом деле хотите, или почему. –

Смежные вопросы