⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 voapidtune.v

📁 FPGA verilog
💻 V
字号:
module VOAPIDTune(
	EN,
	CLK,
	Ramp,
	Ki,
	Kp,
	NextPoint,
	Target,
	PIDResult
);
input			EN;
input			CLK;
input			Ramp;
input	[31:0] 	Ki;
input	[31:0] 	Kp;
input	[31:0] 	NextPoint;
input	[31:0] 	Target;
output	[11:0] 	PIDResult;

reg		[11:0] 	PIDResult;

reg		[31:0] 	SumError; //Q8

reg		[31:0]	TargetReg;

wire			Update;
reg		[9:0]	Counter;


wire	[48:0] Err_P;
wire	[48:0] Err_I;

wire	[31:0]	I_Err;

wire 	[31:0] 	Error,Error_Single;

wire	[31:0]	Result;

wire			OverHi,OverLo;
wire			IOver;

wire	[31:0]	AbsResult0,AbsResult1,Tmp;

lpm_sub_signed_32	b2v_inst(.dataa({7'b00000,TargetReg[31:7]}),//Q8
					.datab({7'b00000,NextPoint[31:7]}),//Q8
					.result(Error));

lpm_add_signed_32	b2v_inst6(.dataa(SumError),
					.datab(Error),
					.result(Error_Single));
					
lpm_mult_signed_32x32_hard	b2v_inst2(.dataa(I_Err),
					.datab(Ki),
					.result(Err_I));

lpm_mult_signed_32x32_hard	b2v_inst5(.dataa(Error),
					.datab(Kp),
					.result(Err_P));

lpm_add_signed_32	b2v_inst1(.dataa(Err_I[31:0]),
					.datab(Err_P[31:0]),
					.result(Result));

assign Update = Counter[9]==1'b1;

assign OverLo = Result[31]==1;
assign OverHi = Result[30:20]!=11'b00000000000;

lpm_abs_32 ErrorAbs0(.data(Error),.result(AbsResult0));

lpm_abs_32 ErrorAbs1(.data(SumError),.result(AbsResult1));

lpm_sub_signed_32	b2v_inst8(.dataa(32'd2147483647),
					.datab(AbsResult1),
					.result(Tmp));
					
assign IOver = (Error[31]==SumError[31])&(AbsResult0>Tmp);
assign I_Err = (IOver)?SumError:Error_Single;

always @(posedge CLK)
begin
	if (EN)
	begin
		if (Update)
		begin
			if (TargetReg[31:7]<Target[31:7])
				TargetReg <= TargetReg + 8'b10000000;
			else if (TargetReg[31:7]>Target[31:7])
				TargetReg <= TargetReg - 8'b10000000;
			else
				TargetReg <= Target;
		end
	end
end

always @(posedge CLK)
begin
	if (EN)
	begin
		if (Update&&(!IOver))
			SumError <= Error_Single;
	end
	else
		SumError <= 0;
end

always @(posedge CLK)
begin
	if (EN)
	begin
		if (Update)
		begin
			if (TargetReg>327)//0.01
			begin
				if (OverLo)
					PIDResult <= 12'h000;
				else if (OverHi)
					PIDResult <= 12'hFFF;
				else
					PIDResult <= Result[19:8];
			end
			else
				PIDResult <= 12'h000;
			Counter <= 10'd0;
		end
		else
			Counter <= Counter + 1'b1;
	end
end
endmodule

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -