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

 
 
> Проблемы с 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

Сообщений в этой теме


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

 


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


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