Добрый день.
Столкнулся со следующей проблемой:
Есть блок с алгоритмом Герцеля (Код ниже) написанный на 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
Подскажите кто нибудь что это может быть???