реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Проблемы с real
Striburn
сообщение Dec 7 2016, 08:49
Сообщение #1


Участник
*

Группа: Validating
Сообщений: 15
Регистрация: 7-12-16
Пользователь №: 94 537



Добрый день.

Столкнулся со следующей проблемой:

Есть блок с алгоритмом Герцеля (Код ниже) написанный на systemverilog.

Если использую переменные типа real, всё работает идеально(проверял в modelSim), но не компилируется в Quartus 16.1( пишет отсутствие поддержки типа real).
Начинаю переводить в целочисленную логику, блок перестаёт работать.

Код с real:
CODE
module Goertzel#(parameter int SampleSize=60,parameter real Ft=1/0.0024)
(
input logic reset,
input logic inclk,
input logic Din_valid,
input logic[31:0] InData,

output logic signed[31:0] Signal,
output logic Dout_valid

);
parameter real Fs=25000;
parameter real n=SampleSize;


parameter int k=n*Ft/Fs;
parameter real w=2*3.1415926535897932384626433832795*k/n;
parameter real cosw=$cos(w);
parameter real sinw=$sin(w);
parameter real coeff=2*cosw;

shortint SC;

longint Q0,Q1,Q2;
longint Amp;
int Amp_sqrt;
longint realp,imagp;

assign Signal=(Dout_valid)?Amp_sqrt/60:12'd0;
assign Amp=realp*realp+imagp*imagp;
assign realp=Q1-Q2*cosw;
assign imagp=Q2*sinw;

always_ff@(posedge inclk, posedge reset)
begin
if(reset)
begin
SC=0;
end
else
begin
if(Din_valid)
begin
if(SC<SampleSize)SC=SC+1;
else SC=1;
end
end
end


always_ff@(posedge inclk, posedge reset)
begin
if(reset)
begin
Q1=0;
Q2=0;
Q0=0;
Dout_valid=0;
end
else
begin
if(Din_valid)
begin
Q0=(unsigned'(InData))+(Q1*coeff)-Q2;
Q2=Q1;
Q1=Q0;
if(SC==SampleSize)
begin
Dout_valid=1;
end
end
else
begin
if(SC==SampleSize)
begin
Q1=0;
Q2=0;
Dout_valid=0;
end
end
end
end



SQRT sqrt
(
.radical(Amp),
.q(Amp_sqrt),
.remainder()
);
endmodule


Код с int :
CODE
module Goertzel#(
parameter int SampleSize=60,
parameter int cosw=65176,
parameter int sinw=6850,
parameter int coeff=130353
)
(
input logic reset,
input logic inclk,
input logic Din_valid,
input logic[31:0] InData,

output logic signed[31:0] Signal,
output logic Dout_valid

);



shortint SC;

longint Q0,Q1,Q2;
longint Amp;
int Amp_sqrt;
longint realp,imagp;

assign Signal=(Dout_valid)?Amp_sqrt/60:12'd0;
assign Amp=realp*realp+imagp*imagp;
assign realp=Q1-(Q2*cosw)/65536;
assign imagp=(Q2*sinw)/65536;

always_ff@(posedge inclk, posedge reset)
begin
if(reset)
begin
SC=0;
end
else
begin
if(Din_valid)
begin
if(SC<SampleSize)SC=SC+1'd1;
else SC=16'd1;
end
end
end


always_ff@(posedge inclk, posedge reset)
begin
if(reset)
begin
Q1=0;
Q2=0;
Q0=0;
Dout_valid=0;
end
else
begin
if(Din_valid)
begin
Q0=(unsigned'(InData))+(Q1*coeff)/65536-Q2;
Q2=Q1;
Q1=Q0;
if(SC==SampleSize)
begin
Dout_valid=1;
end
end
else
begin
if(SC==SampleSize)
begin
Q1=0;
Q2=0;
Dout_valid=0;
end
end
end
end



SQRT sqrt
(
.radical(Amp),
.q(Amp_sqrt),
.remainder()
);
endmodule


Подскажите кто нибудь что это может быть???
Go to the top of the page
 
+Quote Post
Maverick
сообщение Dec 7 2016, 09:31
Сообщение #2


я только учусь...
******

Группа: Модераторы
Сообщений: 3 447
Регистрация: 29-01-07
Из: Украина
Пользователь №: 24 839



Цитата(Striburn @ Dec 7 2016, 10:49) *
Добрый день.

Столкнулся со следующей проблемой:

Есть блок с алгоритмом Герцеля (Код ниже) написанный на systemverilog.

Если использую переменные типа real, всё работает идеально(проверял в modelSim), но не компилируется в Quartus 16.1( пишет отсутствие поддержки типа real).
Начинаю переводить в целочисленную логику, блок перестаёт работать.

Код с real:
CODE
module Goertzel#(parameter int SampleSize=60,parameter real Ft=1/0.0024)
(
input logic reset,
input logic inclk,
input logic Din_valid,
input logic[31:0] InData,

output logic signed[31:0] Signal,
output logic Dout_valid

);
parameter real Fs=25000;
parameter real n=SampleSize;


parameter int k=n*Ft/Fs;
parameter real w=2*3.1415926535897932384626433832795*k/n;
parameter real cosw=$cos(w);
parameter real sinw=$sin(w);
parameter real coeff=2*cosw;

shortint SC;

longint Q0,Q1,Q2;
longint Amp;
int Amp_sqrt;
longint realp,imagp;

assign Signal=(Dout_valid)?Amp_sqrt/60:12'd0;
assign Amp=realp*realp+imagp*imagp;
assign realp=Q1-Q2*cosw;
assign imagp=Q2*sinw;

always_ff@(posedge inclk, posedge reset)
begin
if(reset)
begin
SC=0;
end
else
begin
if(Din_valid)
begin
if(SC<SampleSize)SC=SC+1;
else SC=1;
end
end
end


always_ff@(posedge inclk, posedge reset)
begin
if(reset)
begin
Q1=0;
Q2=0;
Q0=0;
Dout_valid=0;
end
else
begin
if(Din_valid)
begin
Q0=(unsigned'(InData))+(Q1*coeff)-Q2;
Q2=Q1;
Q1=Q0;
if(SC==SampleSize)
begin
Dout_valid=1;
end
end
else
begin
if(SC==SampleSize)
begin
Q1=0;
Q2=0;
Dout_valid=0;
end
end
end
end



SQRT sqrt
(
.radical(Amp),
.q(Amp_sqrt),
.remainder()
);
endmodule


Код с int :
CODE
module Goertzel#(
parameter int SampleSize=60,
parameter int cosw=65176,
parameter int sinw=6850,
parameter int coeff=130353
)
(
input logic reset,
input logic inclk,
input logic Din_valid,
input logic[31:0] InData,

output logic signed[31:0] Signal,
output logic Dout_valid

);



shortint SC;

longint Q0,Q1,Q2;
longint Amp;
int Amp_sqrt;
longint realp,imagp;

assign Signal=(Dout_valid)?Amp_sqrt/60:12'd0;
assign Amp=realp*realp+imagp*imagp;
assign realp=Q1-(Q2*cosw)/65536;
assign imagp=(Q2*sinw)/65536;

always_ff@(posedge inclk, posedge reset)
begin
if(reset)
begin
SC=0;
end
else
begin
if(Din_valid)
begin
if(SC<SampleSize)SC=SC+1'd1;
else SC=16'd1;
end
end
end


always_ff@(posedge inclk, posedge reset)
begin
if(reset)
begin
Q1=0;
Q2=0;
Q0=0;
Dout_valid=0;
end
else
begin
if(Din_valid)
begin
Q0=(unsigned'(InData))+(Q1*coeff)/65536-Q2;
Q2=Q1;
Q1=Q0;
if(SC==SampleSize)
begin
Dout_valid=1;
end
end
else
begin
if(SC==SampleSize)
begin
Q1=0;
Q2=0;
Dout_valid=0;
end
end
end
end



SQRT sqrt
(
.radical(Amp),
.q(Amp_sqrt),
.remainder()
);
endmodule


Подскажите кто нибудь что это может быть???

у Вас скорее всего описание сугобо для симуляции....
тип real для синтеза не поддерживается
попробуйте в квартусе использовать IPcore фурье преобразования


--------------------
If it doesn't work in simulation, it won't work on the board.

"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
Go to the top of the page
 
+Quote Post
Striburn
сообщение Dec 7 2016, 09:55
Сообщение #3


Участник
*

Группа: Validating
Сообщений: 15
Регистрация: 7-12-16
Пользователь №: 94 537



Цитата(Maverick @ Dec 7 2016, 12:31) *
у Вас скорее всего описание сугобо для симуляции....
тип real для синтеза не поддерживается


да я это понял поэтому и переделываю под int значения.

Всё решил проблему. был косяк в самом алгоритме работы. Я не там искал ошибку.

CODE
module Goertzel#(
parameter int SampleSize=60,
parameter int cosw=65176,
parameter int sinw=6850,
parameter int coeff=130353,
parameter int N=60
)
(
input logic reset,
input logic inclk,
input logic Din_valid,
input logic[31:0] InData,

output logic signed[31:0] Signal,
output logic Dout_valid

);



shortint SC;

longint Q0,Q1,Q2;
longint Amp;
int Amp_sqrt;
longint realp,imagp;

assign Signal=(Dout_valid)?Amp_sqrt/60:12'd0;
assign Amp=realp*realp+imagp*imagp;
assign realp=Q1-((Q2*cosw)/65536);
assign imagp=((Q2*sinw)/65536);

always_ff@(posedge inclk, posedge reset)
begin
if(reset)
begin
SC=0;
end
else
begin
if(Din_valid)
begin
if(SC<SampleSize)SC=SC+1'd1;
else SC=16'd1;
end
end
end


always_ff@(posedge inclk, posedge reset)
begin
if(reset)
begin
Q1=0;
Q2=0;
Q0=0;
Dout_valid=0;
end
else
begin
if(Din_valid)
begin
Q0=(unsigned'(InData))+((Q1*coeff)/65536)-Q2;
Q2=Q1;
Q1=Q0;
if(SC==SampleSize)
begin
Dout_valid=1;
end
end
else
begin
if(SC==SampleSize || SC==N)
begin
Q1=0;
Q2=0;
Dout_valid=0;
end
end
end
end



SQRT sqrt
(
.radical(Amp),
.q(Amp_sqrt),
.remainder()
);
endmodule


вот так должно быть
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 00:34
Рейтинг@Mail.ru


Страница сгенерированна за 0.01391 секунд с 7
ELECTRONIX ©2004-2016