2016-09-15 2 views
1

foc 알고리즘 구현을위한 Clarke 및 Park 변형을위한 Verilog 코드를 작성하고 싶습니다. 저는 Verilog을 처음 접했고 cos, sin 함수 및 실수와 같은 복잡한 방정식에 대한 코드를 작성하는 방법을 이해하지 못했습니다. 누군가 나에게 시작을 줄 수 있습니까? 필자가 작성하려고했던 Verilog 코드는 다음과 같다.Clarke 및 Park 변형을위한 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

결과를 합성해야하는 경우 포함 할 질문을 편집 할 수 있습니다. 실수는 합성이 불가능합니다. 시뮬레이션이 아닌 FPGA 나 ASIC에서 필요하다면 부동 소수점 코어를 사용해야 할 것입니다. – Morgan

+0

합성이 가능할 필요는 없으며 테스트 목적으로 만 개발되었습니다. – SACHIN

답변

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 

$cos$sin는 IEEE 1800년부터 2012년까지의 섹션 20.8에 설명되어있다.

+0

사실 실수는 합성 할 수 없습니다. 따라서 바이너리 값을 가져 와서 위 모듈에서 사용할 수있는 실제 값으로 변환하는 작은 Verilog 모듈을 개발해야합니다. 내 알고리즘에 대한 10 비트 입력을 사용하고 싶지만 복잡한 구현 방법을 이해할 수 없습니다. Verilog에서 계산. – SACHIN

+0

당신은 시뮬레이션만을위한 것이고, 합성 할 필요가 없다고하셨습니까? – Morgan