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

Сложение signed разной разрядности

reg signed [23:0] KI;
reg signed [22:0] KP;
reg signed [24:0] freq_offest;

always @(posedge clk_i or posedge rst_i)    
begin 
  .....
	freq_offset<= KI + KP;

Отладка в Vivado 2019:

KI===  -(24'd50973);

KP===  (23'd1099);

на следующем такте вижу: freq_offset == 25'd54456;

Как так ?? Что делаю не правильно ??

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


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

module pipa ;

  reg signed [23:0] KI;
  reg signed [22:0] KP;
  reg signed [24:0] freq_offset;

  initial begin
    KI = -(24'd50973);

    KP = (23'd1099);

    freq_offset = KI + KP;

    $display("%0d", freq_offset);

    $stop;
  end

endmodule
Quote

# -49874

все работает. Может быть в этом причина
 

Quote

 

reg signed [24:0] freq_offest

freq_offset<= KI + KP;

 

 

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


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

Just now, des00 said:

  reg signed [23:0] KI;
  reg signed [22:0] KP;
  reg signed [24:0] freq_offset;
  reg [1:0]cnt; 
/*========================================================================*/
always @(posedge clk or posedge rst)    
begin 
if(rst) 
	begin
    KI <= -(24'd50973);
    KP <= (23'd1099);
	freq_offset <= 0;
	cnt<= 1'b0;
	end
else
	begin
	freq_offset <= KI + KP;
	cnt<= cnt + 1'b1;
	if(&cnt)
		begin
		$display("freq_offset=%0d", freq_offset);
        $finish;  
		end
	end
end

Спасибо !!

 

# KERNEL: freq_offset=-49874

Смотрю значение на следующем такте.

В aldec при моделировании работает.

А в Vivado 2019, в кристалле  - нет.

Может, какие опции компиляции ?
 

 

 

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


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

А что показывает синтезированный нетлист? По идее должно использовать DSP, иначе не получится через обычный сумматор

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


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

On 2/20/2021 at 5:14 PM, gosha said:

 

ну какие опции. этож банальная математика курса средней школы. ее нельзя по другому выполнить. Максимум что может произойти это отсутствие расширения знака у чисел с меньшей разряностью.

-(24'd50973) = 24'hFF_38E3,  (23'd1099) = 23'h00_044B. При сложении с неправильным расширением знака будет 25'h0FF_3D2E (25'd16727342). При правильном  25'h1FF_3D2E = -(25'd49874). Ваши 25'd54456 = 25'hD4B8 ну никак не получаются. От слова совсем.

Если в функциональном симуляторе у вас все работает, а в вивадо и его симуляторе нет, то либо вы смотрите не туда, либо это временная симуляция с неправильными таймингами.

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


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

Используйте 'sd или 'sh, разрядность в битах можно опустить.

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

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


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

В прошлом сталкивался с подобным поведением сложения знаковых переменных с разной разрядностью в среде Xilinx.
код был схож с тем что выше.
Так вот там сумма была и правильной и неправильной. результат зависел от порядка переменных. То есть сумма меняла значение от перестановки слагаемых.

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


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

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

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

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

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

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

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

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

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

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