2017-01-23 2 views
0

Я пытаюсь вычислить среднее значение сигнала на 4 последовательных значениях. Этот сигнал подписан, и я действительно не уверен в правильном вычислении.Средняя работа по подписанным сигналам в VHDL

SIGNAL my_signed_signal : std_logic_vector(15 DOWNTO 0) := (OTHERS => '0'); 
SIGNAL average_sum  : signed(17 DOWNTO 0) := (OTHERS => '0'); 
SIGNAL average_result : signed(15 DOWNTO 0) := (OTHERS => '0'); 

... 

-- within my process 

average_sum <= average_sum + signed(my_signed_signal); -- loop 4 times 

... 

average_result <= average_sum(17 DOWNTO 2); -- how I finally get the result (div by 4) 

Я знаю, что это должно работать для неподписанных сигналов, но я уверен, что это не для знакопеременных те из-за подписанного немного. Но я не знаю, что изменить. У кого-нибудь есть идея?

+0

Мой VHDL чрезвычайно ржавый, но я считаю, что расширение знака должно происходить автоматически с учетом задействованных типов. В качестве альтернативы вы можете смещать значения в неподписанный диапазон путем инвертирования MSB входов, а затем unbias результат без знака в подписанный диапазон, снова инвертируя MSB. Это эквивалентно добавлению 0x8000 к входам и вычитанию 0x8000 * 4 на выходе для отмены смещения. – doynax

+0

Ответ должен быть в библиотеке 'numeric_std', где вы можете изучить определения операторов' + '. –

+1

Нет ничего, что я могу видеть, что выглядит неправильно из предоставленного вами фрагмента. Если вы хотите убедиться, что добавление работает на векторах того же размера, вы можете использовать функцию «resize()», которая расшифровывает расширение для подписанных типов, то есть 'resize (signed (my_signed_signal), average_sum'length)' Be что вам нужно будет сбросить average_sum между 4-мя тактовыми вычислениями. Усечение также оставит вас с полубитным отрицательным смещением в результате. Полный пример поможет узнать, находится ли проблема в остальной части кода. – sv65536

ответ

1

Да, это работает и для signed типов.

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