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

📄 modectrlnnn.v

📁 FPGA verilog
💻 V
字号:

module ModeCtrl(
		CLK,
		EN,
		OP_MODE_Set,
		LOSMODE_Set,
		AUTO_MUTE_Set,
		APC_KP_Set,
		APC_KI_Set,
		PLIM_Set,
		GLIM_Set,
		AGC_KP_Set,
		AGC_KI_Set,
		ISP_AUTO_Set,
		CURR_SET_Set,
		TARGET_GAIN_Set,
		TARGET_PWR_Set,
		EYESAFE_PWR_Set,
		MUTEON_Set,
		PUMPON_Set,	
		Pump_Protect_Alarm,
		Ramp,
		Input_LOS_Alarm,
		Reflection_Alarm,
		Amplifier_Disable_Input,
		Output_Mute_Input,
		OutputPwrAsmW,
		Gain,
		POutsig,
		FeedForwardData,
		OpModeOut,
		PumpDown,
		RampStart,
		Mst,
		OutputLim,
		Pump_DacData
);
	`include "parameter.v"
	input	CLK;
	input	EN;
	input	Amplifier_Disable_Input;
	input	Output_Mute_Input;
	input	Pump_Protect_Alarm;
	input	Ramp;
	input	Input_LOS_Alarm;
	input	Reflection_Alarm;
	input	AUTO_MUTE_Set;
	input	ISP_AUTO_Set;
	input	[11:0]	CURR_SET_Set;
	input	MUTEON_Set;
	input	PUMPON_Set;	
	input	[1:0]	LOSMODE_Set;
	input	[1:0]	OP_MODE_Set;
	input	[31:0]	APC_KP_Set,
					APC_KI_Set,
					PLIM_Set,
					GLIM_Set,
					AGC_KP_Set,
					AGC_KI_Set,
					TARGET_GAIN_Set,
					TARGET_PWR_Set,
					EYESAFE_PWR_Set;
	
	input	[31:0] 	Gain,
					OutputPwrAsmW,
					POutsig;
	input	[11:0]	FeedForwardData;
					
	output	[2:0] 	OpModeOut;
	output			PumpDown;
	output			RampStart;
	output	[2:0]	Mst;
	output			OutputLim;
	output	[11:0] 	Pump_DacData;
			
	reg				PumpDown;
	reg				RampStart;
	reg		[31:0] 	Ki;
	reg		[31:0] 	Kp;
	reg		[31:0] 	NextPoint;
	reg		[31:0] 	RampTarget;
	reg		[31:0]	PIDTarget;
	reg		[31:0] 	TargetReg;
	wire	[31:0] 	CompareTarget;
	reg		[11:0]	Pump_DacOutSaved;	
	wire	[11:0]	Pump_DacSignal;	
	
	
	wire			FeedForwardEN;
	wire			Amplifier_Disable_Input_Single;
	wire			Output_Mute_Input_Single;
	
	wire	Lim_Signal,Dis_Signal,Es_Signal;	
	
	reg [1:0]	OpMode,NextMode,OrgOpMode;
	
	reg	[21:0]	LimCounter;
	reg			LimReg;
	reg	[5:0]	TimeCounter;
	
	reg			ESReg;
	reg	[21:0]	ESCounter;
	
	wire		APREN;
	
	wire   		GainOver,APROver,POutOver;
	
	wire	isAGCMode;

	wire		isACCMode;
	wire		PIDEN;
	
	wire	[31:0]	DBTime;
	
	assign CompareTarget = PIDEN?PIDTarget:RampTarget;
	
	assign  DBTime = (isACCMode)?32'd10:32'd1000;
	
	assign 	OutputLim = GainOver||POutOver||Es_Signal;
	
	assign 	isACCMode = OpMode==ACC_MODE;
	
	
	assign  PIDEN = (~isACCMode)|ISP_AUTO_Set;
	
	assign	OpModeOut = OpMode;

	assign Lim_Signal =LimReg;//
	assign Dis_Signal = (OpMode==PD_MODE);
	assign Es_Signal =  APREN&APROver;
	assign Mst = {Dis_Signal,ESReg,Lim_Signal};
	
	assign  FeedForwardEN  = (isAGCMode);
	assign 	isAGCMode = OrgOpMode==AGC_MODE;

	assign  APREN = Output_Mute_Input_Single||Reflection_Alarm&&AUTO_MUTE_Set||MUTEON_Set;

	InputFilter Amplifier_Disable_KeyFilter(
				.CLK(CLK),
				.KeyInput(Amplifier_Disable_Input),
				.KeyOutput(Amplifier_Disable_Input_Single));

	InputFilter Output_Mute_KeyFilter(
				.CLK(CLK),
				.KeyInput(Output_Mute_Input),
				.KeyOutput(Output_Mute_Input_Single));

	PIDTune	modePIDTune(
			.EN(EN&PIDEN),
			.FeedForwardEN(FeedForwardEN),
			.FeedForwardData(FeedForwardData),
			.CLK(CLK),
			.Ki(AGC_KI_Set),
			.Kp(AGC_KP_Set),
			.NextPoint(NextPoint),
			.Target(TargetReg),
			.PIDResult(Pump_DacSignal));


OverAlarmMonitor GainOverMonitor(
				.EN(EN),
				.SYS_CLK(CLK),
				.Param(Gain),
				.Debounce_Time_Set(DBTime),
				.THR_Set(GLIM_Set),
				.Alarm_Output(GainOver));

OverAlarmMonitor POutOverMonitor(
				.EN(EN),
				.SYS_CLK(CLK),
				.Param(OutputPwrAsmW),
				.Debounce_Time_Set(DBTime),
				.THR_Set(PLIM_Set),
				.Alarm_Output(POutOver));

OverAlarmMonitor APROverMonitor(
				.EN(EN),
				.SYS_CLK(CLK),
				.Param(OutputPwrAsmW),
				.Debounce_Time_Set(DBTime),
				.THR_Set(EYESAFE_PWR_Set),
				.Alarm_Output(APROver));

	always @(posedge CLK)
	begin
		if  (Es_Signal)
		begin
			ESReg <= 1'b1;
			ESCounter <= 21'b0;
		end
		else begin
			if (ESCounter[21])
				ESReg <= 1'b0;
			else
				ESCounter <= ESCounter + 1'b1;
		end
	end

	always @(posedge CLK)
	begin
		if  (POutOver|GainOver)
		begin
			LimReg <= 1'b1;
			LimCounter <= 21'b0;
		end
		else begin
			if (LimCounter[21])
				LimReg <= 1'b0;
			else
				LimCounter <= LimCounter + 1'b1;
		end
	end
	
	always @(posedge CLK)
	begin
		if (NextMode==PD_MODE)
			PumpDown = 1'b1; 
		else
			PumpDown = 1'b0; 
	end

	always @(posedge CLK)
	begin
	always @(posedge CLK)
	begin
		if (PIDEN)
			Pump_DacOutSaved <= Pump_DacSignal;
		else
			Pump_DacOutSaved <= TargetReg[11:0];
	end
	end
	
	always @(posedge CLK)
	begin
		if (OpMode == NextMode)
		begin
			if (isACCMode)
			begin
				if (TimeCounter[5])
				begin
					if (OutputLim)
					begin
						if (TargetReg >32'd0)
							TargetReg <= TargetReg - 1'b1;
					end
					else begin
						if (TargetReg < CompareTarget)
							TargetReg <= TargetReg + 1'b1;
						else if (TargetReg>CompareTarget)
							TargetReg <= TargetReg - 1'b1;
						else
							TargetReg <= CompareTarget;
					end
					TimeCounter <= 6'b00000;
				end
				else
					TimeCounter <= TimeCounter + 1'b1;
			end
			else begin
				if (OutputLim)
				begin
					if (TargetReg >32'd1)
						TargetReg <= TargetReg - 2'b10;
				end
				else begin
					if (TargetReg[31:2]<CompareTarget[31:2])
						TargetReg <= TargetReg + 2'b10;
					else if (TargetReg[31:2]>CompareTarget[31:2])
						TargetReg <= TargetReg - 2'b10;
					else
						TargetReg <= CompareTarget;
				end
			end
		end
		else begin
			OpMode <= NextMode;
			if (NextMode!=IDLE_MODE)
			begin
				case (NextMode)
					AGC_MODE:	TargetReg <= Gain;
					APC_MODE:	TargetReg <= POutsig;
					ACC_MODE:	TargetReg <= {20'h00000,Pump_DacOutSaved};
					default:	TargetReg <= 0;
				endcase
				if (NextMode!=ACC_MODE)
					OrgOpMode <= NextMode;
			end
		end
	end
	
    always @(Amplifier_Disable_Input_Single or 
			PUMPON_Set or 
			Input_LOS_Alarm or 
			LOSMODE_Set or 
			OP_MODE_Set or
			Pump_Protect_Alarm) 
	begin
		if (Amplifier_Disable_Input_Single||OP_MODE_Set==PD_MODE||
			(!PUMPON_Set)||Pump_Protect_Alarm)
			NextMode = PD_MODE;
		else if (Input_LOS_Alarm)
		begin
			if (OP_MODE_Set==AGC_MODE)
			begin
				if (LOSMODE_Set==LM_AGC_DIS)
					NextMode = PD_MODE;
				else
					NextMode = OP_MODE_Set;
			end
			else begin
				if (LOSMODE_Set==LM_NO_EFFECT)
					NextMode = OP_MODE_Set;
				else
					NextMode = PD_MODE;
			end
		end
		else
			NextMode = OP_MODE_Set;
	end

	always @(OpMode or
			TARGET_GAIN_Set or
			TARGET_PWR_Set or 
			CURR_SET_Set)
	begin
		case (OpMode)
			AGC_MODE: RampTarget = TARGET_GAIN_Set;
			APC_MODE: RampTarget = TARGET_PWR_Set;
			ACC_MODE: RampTarget = {20'h00000,CURR_SET_Set};
			default:  RampTarget = 0;
		endcase
	end
	
	always @(OrgOpMode or
			TARGET_GAIN_Set or
			Gain or
			POutsig or
			TARGET_PWR_Set or 
			CURR_SET_Set
			)
	begin
		case (OrgOpMode)
			AGC_MODE:
				begin
					PIDTarget = TARGET_GAIN_Set;
					NextPoint = Gain;
				end
			APC_MODE:
				begin
					PIDTarget = TARGET_PWR_Set;
					NextPoint = POutsig;
				end
			default:
				begin
					PIDTarget = 0;
					NextPoint = 0;
				end
		endcase
	end
	
endmodule

⌨️ 快捷键说明

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