Jump to content

Математические формулы с знаковыми числами


Plisovik
 Share

Recommended Posts

Здравствуйте! Подскажите пж. как правильно работать (складывать, вычитать делить  и т. д.) с числами многобитными, знаковыми (signed) если входное число имеет битность одну, допустим [13:0] , а выходное, сильно его больше, допустим раз в 100.

Подробнее. Мне нужно сигнал 14-битный с АЦП, входящий с частотой "clock", пересчитывать в другое число по формуле. И вход формулы и выход могут быть как отрицательным так и положительным числом. При этом выходное число раз в 100 может превышать входное (симуляция усилителя), т.е. его битность должна быть как минимум на 7 битов больше.  Выходной сигнал на данном такте зависит как от входного на данном такте, так и от входного и выходного на предыдущих тактах.

Далее мой код (частично:

...

input signed [13:0] signal_in,

output  signed [13+7:0] signal_out,

...

reg signed [13:0] inputsig [2:0];
reg signed [13+7:0] outputsig [2:0];

always @ (posedge clock) begin
    inputsig[2]<=inputsig[1];
    inputsig[1]<=signal_in; / / Входной сигнал сбрасываю в память, чтоб хранить его за 2 предыдущих такта

    outputsig[2]<=outputsig[1];
    outputsig[1]<=signal_out; / / вЫходной сигнал сбрасываю в память, чтоб хранить его за 2 предыдущих такта

end    

assign    y1B = (outputsig[1])*2'd2*alpha/12'd100;                    // alpha - по идее дробное число (0,98), поэтому я его делаю целым (98), а потом делю   
assign    y2B = (outputsig[2])*alpha/12'd100*alpha/12'd100;    //слагаемое на сто
assign    X0A = signal_in;
assign    X1A = (inputsig[1])*alpha/12'd100 + (inputsig[1])*alpha/tau*T/12'd100; // задал 4 слагаемых, определяющих выходной сигнал
    
assign    signal_out = (y1B - y2B + X0A - X1A); // полный выходной сигнал, складываю слагаемые , которые ранее задал

...

Вопрос, как правильно перейти из 14-битного числа в (7+14) битное (тоже +/- знаковое), чтобы формула работала? Правильно ли я умножаю на альфу и делю на 100? А то что я ни делаю, какая-то кракозябла получается...Буду благодарен за помощь!

Link to comment
Share on other sites

  • 2 weeks later...

@Plisovik Подход нормальный, но все составляющие выражения надо сделать знаковыми. И константы тоже. Так как если одно из чисел в выражении попадётся беззнаковое, то и результат будет таким же.
Число 100 проще в двоичном виде записать, приклеив к нему нулевой бит слева как знаковый, и обернув директивой $signed({1'b0, A}). 

Разрядность для результирующего сигнала надо сделать соответствующей. В худшем случае при сложении +1 разряд добавляется, а при умножении количество разрядов равно сумме разрядностей перемножаемых чисел (если правильно помню). 

Полезная статья - http://www.labfor.ru/articles/arithmetic_verilog

3D модели радиодеталей + макросы

С уважением, Михаил.

Link to comment
Share on other sites

Приглашаем на вебинар «Источники питания MEAN WELL для промавтоматики и серверного оборудования в новых условиях» (02.06.2022)

Приглашаем всех желающих на вебинар, посвященный линейке продукции MEAN WELL для промышленной автоматизации и оборудования, систем охраны, серверного, телекоммуникационного оборудования и базовых станций 4G/5G. 

На вебинаре мы также рассмотрим продукцию компании MEAN WELL, которая может заменить часть источников питания от производителей, в данный момент ушедших с российского рынка, разберем, на что нужно обращать внимание при подборе той или иной замены, и какими особенностями обладает продукция MW для различных приложений. Подробнее>>

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Сообщения

    • Вряд ли при увеличении падения напряжения на стабилизаторе в 2 раза, температура меняется от "всё хорошо" до 110о . Скорее проблема здесь У разных производителей это напряжение разное.
    • Приветствую! Сразу суть: испоьзую такую структуру/объединение union errbyte{ struct error_status {     unsigned bit0_Tank_Empty:1;     unsigned bit1_Tank_Sens_Min:1;     unsigned bit2_Tank_Sens_Max:1;     unsigned bit3_Tank_Filling_Valve_Not_Set:1;      unsigned bit4_Tank_Auto_Filling_Off:1;      unsigned bit5_Mode_1_Valve_Not_Set:1;     unsigned bit6_Mode_2_Valve_Not_Set:1;     unsigned bit7_Mode_3_Valve_Not_Set:1;     unsigned bit8_Mode_4_Valve_Not_Set:1;     unsigned bit9_Flash_Setting_Error:1;     unsigned bit10_M1_4_Timeout;     unsigned bit11_Mode_5_Valve_Not_Set:1;     unsigned bit12_Mode_6_Valve_Not_Set:1;     unsigned bit13_Mode_7_Valve_Not_Set:1;     unsigned bit14:1;     unsigned bit15:1; }error_bits; uint8_t error_bitfield_8[2]; uint16_t error_bitfield_16; }; В error_bitfield_16 записывается в два байта вся структура, в error_bitfield_8 соотвественно побайтно. error_bitfield_8 опустим. Так вот в чём проблема, если выставляется бит 9, то error_bitfield_16=0x0200, сброс error_bitfield_16 в 0 соответственно сбарсывает бит 9 тоже в 0 (всё ОК). Идём далее... А если выставляется бит 10 и выше, то error_bitfield_16 = 0 (error_bitfield_8 тоже по нулям). В чём может быть дело?  
    • Ну разве что извратиться и выпилить из заводских китайских, ибо рядом стоят стабилизаторы и электролиты и никак не влезут без изменения радиаторов... Попробую вначале вариант на 818 и 819.  Спасибо за советы. Буду эксперементировать и дорабатывать ПП. 
    • Я игрался с 6н2п-ев. Тоже с КП во второй половинке. Сначала выбрал анодное 150к и катодное в КП 150к. Но потом понял, что это не очень оптимальный режим в том плане, что КП при хорошем размахе заходит в режим сеточных токов. В общем поставил в анод 2 по 150к и 100к в катод КП. И всё это приправил конденсатором, чтоб получилась вольтодобавка. Тут уже манипуляции с напряжением смещения мало влияют на вторую гармонику, но зато резко уменьшается треться. И всё это происходит на мощности в 5 ватт. Если начать убавлять, то гармоники снова приобретают классический вид. Вариант поставить в КП более токовую лампу не подходит, т.к. изначально планировалось делать на пентоде EF80. Потом решил попробовать классику. Кстати, так подумал, если два резистора по 150к зашунтировать резистором в 300к. Логика мне подсказывает, что нагрузочная линия будет примерно выглядеть, как красная пунктирная линия Чёрная линия - нагрузочная кривая при сопротивлении 150к и 375 анодного. Зелёная - 300к и 375 вольт. А вот красная должна будет быть, если зашунтировать два 150к резистора 300 килоомами. Т.е. как бы наклон как для 300к(при условии, что вольтодобавка превратит 2 по 150к в бесконечность), а рабочая точка как при 150к. В идеале хотелось бы попробовать 6ж52п в триоде, но он падла прожоливый. У меня и так не хватает анодного. 390 вольт при полной нагрузке остаётся. А если ещё два драйвера впихнуть, каждый из которых жрёт по 20 мА тока, то дай бог 370 останется. Так что продолжу играться с 6н2п. Как вариант, можно перепаять питание, да воткнуть 12ах7
    • Не могу понять. Уже все пересмотрел. Можно как-то коррекцию выравнивающую сделать, например, между удвоителем и инвертором?
    • Вот с этим полностью согласен.  Нужно придумать какоето переключение.
    • Так когда покупал, трогал- ничего не грелось, а как подключил, так и случилось неожиданное.
×
×
  • Create New...