Clarke和Park变换的Verilog代码

时间:2016-09-15 07:56:48

标签: 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_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 

1 个答案:

答案 0 :(得分:0)

我会从这样的事情开始:

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;

不确定您要对这些功能做些什么。但是像这样:

但请注意,您尚未定义theta,它位于您的端口列表中,但未定义为输入或真实。

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
{p> $cos$sin在ieee 1800-2012的第20.8节中有所描述。