用于Clarke和Park转换的Verilog代码
我想为Clarke和Park转换编写verilog代码,以实现foc算法。我是verilog的新手,我无法理解如何编写涉及cos、sin函数和实数的复杂方程的代码。谁能给我一个开始吗?下面是我试图编写的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
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中实现复杂的数字计算。你说它只是用于模拟,不需要合成?