sonycman 0 September 9, 2021 Posted September 9, 2021 · Report post Так этот код: outdata_reg <= ((indata + (32'd1<<31)) >> 16) - (16'd1<<15); для входного значения - 1 даст на выходе ту же - 1, а не 0. Это будет не indata/65536. Quote Share this post Link to post Share on other sites More sharing options...
Halfback 0 September 9, 2021 Posted September 9, 2021 · Report post 52 минуты назад, sonycman сказал: Так этот код: outdata_reg <= ((indata + (32'd1<<31)) >> 16) - (16'd1<<15); для входного значения - 1 даст на выходе ту же - 1, а не 0. Это будет не indata/65536. Да, Вы правы. чтобы был "0" надо прибавить "1". outdata_reg <= ((indata + (32'd1<<31)) >> 16) - (16'd1<<15)+1; Quote Share this post Link to post Share on other sites More sharing options...
sonycman 0 September 9, 2021 Posted September 9, 2021 · Report post 18 minutes ago, Halfback said: Да, Вы правы. чтобы был "0" надо прибавить "1". outdata_reg <= ((indata + (32'd1<<31)) >> 16) - (16'd1<<15)+1; А тогда при входном 0 результат будет 1 :) Quote Share this post Link to post Share on other sites More sharing options...
Halfback 0 September 9, 2021 Posted September 9, 2021 · Report post 4 часа назад, sonycman сказал: А тогда при входном 0 результат будет 1 :) тогда так ;) outdata_reg <= ((indata + (32'd1<<31)) >> 16) - (16'd1<<15)+indata[31]; Quote Share this post Link to post Share on other sites More sharing options...
misyachniy 0 September 19, 2021 Posted September 19, 2021 · Report post On 9/7/2021 at 10:35 AM, Halfback said: Надо по сути 32-разрядное знаковое число сократить до 16-разрядного знакового. по сути это будет outdata_reg <= indata/65536; По правилам "С" при преобразовании, просто отбрасывается старшие 16 бит. Априори программист должен быть уверен что значение числа занимает 15 бит плюс знаковый. Для Verilog аналогично. Или нужно заменить деление на сдвиг? Quote Share this post Link to post Share on other sites More sharing options...