|
|
  |
Проблемы с real |
|
|
|
Dec 7 2016, 08:49
|
Участник

Группа: 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 Подскажите кто нибудь что это может быть???
|
|
|
|
|
Dec 7 2016, 09:31
|

я только учусь...
     
Группа: Модераторы
Сообщений: 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.
"Ты живешь в своих поступках, а не в теле. Ты — это твои действия, и нет другого тебя" Антуан де Сент-Экзюпери повесть "Маленький принц"
|
|
|
|
|
Dec 7 2016, 09:55
|
Участник

Группа: 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 вот так должно быть
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|