Перейти к содержанию
    

Усиление сигнала через знаковое умножение.

Дано. Сигнал dataIn рязрядностью N.

Выходной сигнал dataOut разрядностью N.

Усиление gain, разрядностью N.

 

Необходимо домножить dataIn на gain и приравнять старшие разряды к dataOut.

 

 

Если записать так, то на выходе используется только последний разряд dataOut

dataOut    <= ((dataIn * gain) >>> N);

 

Данную операцию можно было бы сделать через промежуточный сигнал temp, разрядностью 2*N

temp <= dataIn * gain;
dataOut <= temp >>> N;

Это работает, но как записать в одну строчку без сигнала temp ?

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это работает, но как записать в одну строчку без сигнала temp ?

как-то так

dataOut    <= (({{{N{dataIN[N-1]}},dataIn} * gain) >>> N);

 

но лучше конечно 2 строчки - читаемость кода!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

как-то так

dataOut    <= (({{{N{dataIN[N-1]}},dataIn} * gain) >>> N);

 

но лучше конечно 2 строчки - читаемость кода!

Этот способ тоже понятно .

Есть еще идея , не проверял , к умножению dataIn * gain прибавить ноль в разрядности 2*N. Т.е datain * gain + {2*N{1'b0}}

 

Гы..рабоает, причем работает в таком виде

dataOut    <= (dataIn * gain + 0) >>> N;

 

Но скорее всего будут проблемы, если рязрадность больше 16 бит. Так как 0 это 32 бита. Или 64 ? :)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а можно и так

 

wire [2*N - 1 : 0] GainedDataIn;

assign GainedDataIn = dataIn * gain;

 

 

dataOut <= GainedDataIn [2*N - 1 -: N]

Ну это тоже самое, что и выше с temp.

Да и писанины много с квадратными скобками, вся соль в использовании сдвига >>>

по умолчанию 32 бита.

да,верно, даже не смотря на то, что синтезатор в 64битном режиме запушен.

 

Но вместо нуля я записал 64'h0. Так более универсально.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дано. Сигнал dataIn рязрядностью N.

Выходной сигнал dataOut разрядностью N.

Усиление gain, разрядностью N.

 

Необходимо домножить dataIn на gain и приравнять старшие разряды к dataOut.

 

В данном случае вариант с temp будет оптимальным

Изменено пользователем thodnev

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

temp <= dataIn * gain;
dataOut <= temp >>> N;

Это работает, но как записать в одну строчку без сигнала temp ?

 

Теоретически, должна работать следующая конструкция:

 

assign R = ( (N*2)'(A*B) ) >> N;

 

Но Квартус, к примеру, ее синтезирует в 0.

 

Для Квартуса годится конструкция подлиннее:

 

assign R = ((N*2)'(A) * (N*2)'(B)) >> N;

 

Есть еще вариант с временной переменной, но в одну строчку:

 

input  [15:0] A, B;
output [15:0] R;

logic [15:0] T;

assign {R,T} = (A * B);

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

чего то ISE не оценил конструкции вида

10'(Signal) и (10)'(Signal) и послал меня с синтаксической ошибкой...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

чего то ISE не оценил конструкции вида

10'(Signal) и (10)'(Signal) и послал меня с синтаксической ошибкой...

 

Конструкция легальная. В ISE не пробовал, а Квартус не жалуется - правда желаемый результат выдает только с последними 2-мя вариантами.

 

Покажите тестовый код и сообщение об ошибке - может действительно где-нибудь ошибка случайно вышла...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ERROR:HDLCompiler:806 - "\\vboxsrv\octonusrepository\SYNC_MOTOR\FPGA\StatisticModule_v3_00.v" Line 395: Syntax error near "'".

359 линия это

BitSendCounter <= 5'(BitSendCounter - 1'b1);

или

BitSendCounter <= 5'(BitSendCounter - 1);

или

BitSendCounter <= 5'(BitSendCounter) - 1;

или

BitSendCounter <= (5)'(BitSendCounter) - 1;

или

BitSendCounter <= (BIT_TO_SEND_COUNT)'(BitSendCounter) - 1;

 

или

 

ERROR:HDLCompiler:806 - "\\vboxsrv\octonusrepository\SYNC_MOTOR\FPGA\StatisticModule_v3_00.v" Line 395: Syntax error near "itSendCounter"

BitSendCounter <= 5'BitSendCounter - 1;

ну потому что 5'B - распозналось

 

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ERROR:HDLCompiler:806 - "\\vboxsrv\octonusrepository\SYNC_MOTOR\FPGA\StatisticModule_v3_00.v" Line 395: Syntax error near "'".

А это потому, что конструкция SV, а Вы компилируете ваш файл как Verilog (что, в принципе, соответствует его расширению). :smile3046: Поменяйте настройки компиляции так, чтобы StatisticModule_v3_00.v ISE компилировал как SystemVerilog и будет Вам счастье. :)

или

 

ERROR:HDLCompiler:806 - "\\vboxsrv\octonusrepository\SYNC_MOTOR\FPGA\StatisticModule_v3_00.v" Line 395: Syntax error near "itSendCounter"

BitSendCounter <= 5'BitSendCounter - 1;

ну потому что 5'B - распозналось

Дело в том, что конструкция должна быть именно size'( expression ) - т.е. последние скобки обязательны. Если size тоже выражение, то и его придется заключить в скобки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...