📄 modectrlnnn.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 + -