Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: проблема со знаковыми числами
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
Виталий_Ж
проектирую цифровой фильтр в ISE от xilinx. пробовал в схематике и на vhdl. проблема общего плана: допустим, первый коэффициент фильтра равен -20(возьмем ких-фильтр), допустим выход фильтра 10-разрядный. В симуляторе я подаю на вход единичный импульс, по идее на выходе я должен получить импульсную характеристику, но первый отсчет выходного сигнала мне выдает не -20, что в двоичном знаковом представлении при числе разрядов = 10 должно быть равно 1000010100(старший разряд - знак), а 1111101100, что соотвествует 1024-20. то есть полная лажа какая то , на выходе в итоге я получаю громадное число, уже при единичном сигнале...
Может сталкивался кто с подобной проблемой?
заранее благодарен за участие
andrew_b
Цитата(Виталий_Ж @ Mar 12 2009, 15:33) *
но первый отсчет выходного сигнала мне выдает не -20, что в двоичном знаковом представлении при числе разрядов = 10 должно быть равно 1000010100(старший разряд - знак)
Вы что-то путаете.
Цитата
а 1111101100, что соотвествует 1024-20. то есть полная лажа какая то
Всё правильно. Это в двоично-дополнительном коде. Вся математика делается в нём.
Виталий_Ж
Цитата(andrew_b @ Mar 12 2009, 15:45) *
Вы что-то путаете.
Всё правильно. Это в двоично-дополнительном коде. Вся математика делается в нём.

тогда как быть с громадностью выходного сигнала? я ведь получаю 1024-20=1004

Цитата(Виталий_Ж @ Mar 12 2009, 15:49) *
тогда как быть с громадностью выходного сигнала? я ведь получаю 1024-20=1004

точнее как перейти обратно к "беззнаковому" варианту?
andrew_b
Цитата(Виталий_Ж @ Mar 12 2009, 15:50) *
тогда как быть с громадностью выходного сигнала? я ведь получаю 1024-20=1004
Вы знаете, что такое двоично-дополнительный код?

Цитата
точнее как перейти обратно к "беззнаковому" варианту?точнее как перейти обратно к "беззнаковому" варианту?
У вас же отрицательные числа. Куда вы собрались переходить?

P.S. http://telesys.ru/wwwboards/fpga/323/messages/41674.shtml
Михаил_K
Цитата(Виталий_Ж @ Mar 12 2009, 15:33) *
проектирую цифровой фильтр в ISE от xilinx. пробовал в схематике и на vhdl. проблема общего плана: допустим, первый коэффициент фильтра равен -20(возьмем ких-фильтр), допустим выход фильтра 10-разрядный. В симуляторе я подаю на вход единичный импульс, по идее на выходе я должен получить импульсную характеристику, но первый отсчет выходного сигнала мне выдает не -20, что в двоичном знаковом представлении при числе разрядов = 10 должно быть равно 1000010100(старший разряд - знак), а 1111101100, что соотвествует 1024-20. то есть полная лажа какая то , на выходе в итоге я получаю громадное число, уже при единичном сигнале...
Может сталкивался кто с подобной проблемой?
заранее благодарен за участие

Вы путаете прямой код и дополнительный код. Xilinx, как и другие производит вычисления в дополнительном коде, где 1111101100 и есть -20
qxov
Цитата(Виталий_Ж @ Mar 12 2009, 15:33) *
проектирую цифровой фильтр в ISE от xilinx. пробовал в схематике и на vhdl. проблема общего плана: допустим, первый коэффициент фильтра равен -20(возьмем ких-фильтр), допустим выход фильтра 10-разрядный. В симуляторе я подаю на вход единичный импульс, по идее на выходе я должен получить импульсную характеристику, но первый отсчет выходного сигнала мне выдает не -20, что в двоичном знаковом представлении при числе разрядов = 10 должно быть равно 1000010100(старший разряд - знак), а 1111101100, что соотвествует 1024-20. то есть полная лажа какая то , на выходе в итоге я получаю громадное число, уже при единичном сигнале...
Может сталкивался кто с подобной проблемой?
заранее благодарен за участие

Код
    0000010100 + // 10
    1111101100 = // -10
(1)0000000000    // 0
Ionistor
Двоичная арифметика выполняется в дополнительном коде, что связано с некоторыми особенностями АЛУ.
Вообще отрицательные числа можно представить в:
- прямом коде: пишется то же число, только в старший (знаковый) разряд записывается "1", что соответствует отрицательному числу. -(0000010100) = 1000010100(пр.код) - это наиболее естественная с точки зрения арифметики форма представления отрицательных чисел;
- обратном коде: все разряды числа инвертируются, в знаковый разряд пишется "1". -(0000010100) = 1111101011(обр.код);
- дополнительном коде: к обратному коду отрицательного числа прибавляется единица. -(0000010100) = 1111101100(доп.код);

Отрицательное число, представленное в дополнительном коде, в прямой код можно преобразовать через обратный код:
- из числа в дополнительном коде вычесть "1" (или, если нужно выполнить преобразование аппаратно в дополнительном коде, а не просто "в уме для себя" то прибавить 1111111111 - доп.код минус единицы);
- полученное число в обратном коде проинвертировать поразрядно, не трогая старший. знаковый разряд - получите отрицательное число в прямом коде.
P.S.: понимаю, что автор темы, заглохшей месяц назад, вряд ли нуждается в ответе, но ведь кто-то может и через поиск наткнуться на эту страничку.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.