用于Clarke和Park转换的Verilog代码

用于Clarke和Park转换的Verilog代码,verilog,Verilog,我想为Clarke和Park转换编写verilog代码,以实现foc算法。我是verilog的新手,我无法理解如何编写涉及cos、sin函数和实数的复杂方程的代码。谁能给我一个开始吗?下面是我试图编写的verilog代码 timescale 1ns/1ps module clarke_park(iR_i,iY_i,iB_i,theta,iD_o,iQ_o); output real iD_o; output real iQ_o; input real iR_i; input real iY

我想为Clarke和Park转换编写verilog代码,以实现foc算法。我是verilog的新手,我无法理解如何编写涉及cos、sin函数和实数的复杂方程的代码。谁能给我一个开始吗?下面是我试图编写的verilog代码

timescale 1ns/1ps


module clarke_park(iR_i,iY_i,iB_i,theta,iD_o,iQ_o);
output real iD_o;
output real iQ_o;

input real iR_i;
input real iY_i;
input real iB_i;

real k = 0.66;
output real  ialpha;
output real  ibeta;
output real  iY_r;//real part
output real  iY_c;//complex part
output real  iB_r;
output real  iB_c;
output real  ibeta_r;
output real  ibeta_c;

function sin(input real theta);

function cos(input real theta); 

iY_r = -1*(iY_i)*(0.5);
iY_c = (iY_i)*(0.866);
iB_r = -1*(iB_i)*(0.5);
iB_c = -1*(iB_i)*(0.866);

ialpha = k*iR;
ibeta_r = k*(0.866)*(iY_r-iB_r);
ibeta_c = k*(0.866)*(iY_c-iB_c);

real a1 = sin(theta);
real a2 = cos(theta);

iD_r = (a1*(ialpha)) + ((sin(theta))*(ibeta_r));
iD_c = a2*(ibeta_c);
iQ_r = - (1*a2*(ialpha)) + (a1*(ibeta_r));
iQ_c = a1*(ibeta_c);

endfunction


assign iD_o = {iD_r,iD_c};
assign iQ_o = {iQ_r,iQ_c};

endmodule 

我将从以下内容开始:

module clarke_park(
  output real iD_o,
  output real iQ_o,

  input real iR_i,
  input real iY_i,
  input real iB_i,

  output real  ialpha,
  output real  ibeta,
  output real  iY_r,//real part
  output real  iY_c,//complex part
  output real  iB_r,
  output real  iB_c,
  output real  ibeta_r,
  output real  ibeta_c
);

localparam k = 0.66;
不确定您试图对这些函数做什么。但有点像:

但请注意,您没有定义θ,它在端口列表中,但没有定义为输入或实值

real a1;
real a2;

always @* begin
  iY_r = -1*(iY_i)*(0.5);
  iY_c = (iY_i)*(0.866);
  iB_r = -1*(iB_i)*(0.5);
  iB_c = -1*(iB_i)*(0.866);

  ialpha = k*iR;
  ibeta_r = k*(0.866)*(iY_r-iB_r);
  ibeta_c = k*(0.866)*(iY_c-iB_c);

  a1 = $sin(theta);
  a2 = $cos(theta);

  iD_r = (a1*(ialpha)) + ((sin(theta))*(ibeta_r));
  iD_c = a2*(ibeta_c);
  iQ_r = - (1*a2*(ialpha)) + (a1*(ibeta_r));
  iQ_c = a1*(ibeta_c);
end

ieee 1800-2012第20.8节描述了
$cos
$sin

我将从以下内容开始:

module clarke_park(
  output real iD_o,
  output real iQ_o,

  input real iR_i,
  input real iY_i,
  input real iB_i,

  output real  ialpha,
  output real  ibeta,
  output real  iY_r,//real part
  output real  iY_c,//complex part
  output real  iB_r,
  output real  iB_c,
  output real  ibeta_r,
  output real  ibeta_c
);

localparam k = 0.66;
不确定您试图对这些函数做什么。但有点像:

但请注意,您没有定义θ,它在端口列表中,但没有定义为输入或实值

real a1;
real a2;

always @* begin
  iY_r = -1*(iY_i)*(0.5);
  iY_c = (iY_i)*(0.866);
  iB_r = -1*(iB_i)*(0.5);
  iB_c = -1*(iB_i)*(0.866);

  ialpha = k*iR;
  ibeta_r = k*(0.866)*(iY_r-iB_r);
  ibeta_c = k*(0.866)*(iY_c-iB_c);

  a1 = $sin(theta);
  a2 = $cos(theta);

  iD_r = (a1*(ialpha)) + ((sin(theta))*(ibeta_r));
  iD_c = a2*(ibeta_c);
  iQ_r = - (1*a2*(ialpha)) + (a1*(ibeta_r));
  iQ_c = a1*(ibeta_c);
end

ieee 1800-2012第20.8节描述了
$cos
$sin

可以编辑问题,以包括结果是否需要合成。Real是不可合成的,如果FPGA或ASIC(而不仅仅是模拟)需要Real,则您需要使用浮点核心。Real不需要合成,并且它是纯粹为了测试目的而开发的。可以编辑问题,以包括结果是否需要合成。实数是不可合成的,如果FPGA或ASIC需要实数,而不仅仅是模拟,那么您需要使用浮点核。它不需要可合成,而且是纯粹为了测试目的而开发的。实数是不可合成的,所以我需要开发一个小的verilog模块,它接收二进制值,然后将它们转换为在上述模块中可用的实际值。我想在我的算法中使用10位输入,但我无法理解如何在verilog中实现复杂的数字计算。你说它仅用于模拟,不需要合成?实数是不可合成的,所以我需要开发一个小的verilog模块,它接收二进制值,然后将它们转换为在上述模块中可用的实际值。我想在我的算法中使用10位输入,但我无法理解如何在verilog中实现复杂的数字计算。你说它只是用于模拟,不需要合成?