Files
NewInstrCalBoard_CPLD/CPLD1/CPLD_Con.v
T
Jeremy Shen 1ab71827c7 Feat:
CPLD1: Add DPS Related Pin Defination
CPLD1: Add DPS Related Functions
Fix:
CPLD1: Remove unused pins
Improve:
CPLD1: PMU Logics
2026-06-15 10:40:38 +08:00

548 lines
24 KiB
Verilog

module CPLD_Con (
input i_sys_clk,
input i_rst_n,
input i_con_exec,
// Freq Relay Control
input [23:0]i_freq_relay1,
input [23:0]i_freq_relay2,
input [23:0]i_freq_relay3,
input [23:0]i_freq_relay4,
// DC related Control
input [23:0]i_DC_Con1,
input [23:0]i_DC_Con2,
input [23:0]i_DC_Con3,
input [23:0]i_DC_Con4,
//Output RELAYs
output [18:0]o_DMM_EN,
output o_IO_RC1,
output [5:0]o_RC_Tx,
//PMU OC Control
output [31:0]o_PMU_OC_1 ,
output [31:0]o_PMU_OC_2 ,
output [31:0]o_PMU_OC_3 ,
output [31:0]o_PMU_OC_4 ,
//DPS OC Control
output [15:0]o_DPS_FS_1 ,
output [15:0]o_DPS_FS_2 ,
output [15:0]o_DPS_FS_3 ,
output [15:0]o_DPS_FS_4 ,
output [3:0]o_DPS_FSMC ,
output [5:0]o_DPS_FSMMC ,
output o_DPSFS_RC1 ,
// DMM Mode Sel
output o_RC_VSel,
output o_RC_ISel,
// Force/Sense Control
output [1:0]o_RC_LOFS,
// Output RLoad Sel
output [17:0]o_RC_RLSel,
// FLAGs
output o_con_done,
output o_err
);
//Relay Reg
reg [3:0]OC_x01 ;
reg [3:0]OC_x17 ;
reg [18:0]DMM_en ;
reg[5:0]RC_Tx;
reg io_RC;
reg RC_VSel;
reg RC_ISel;
reg [1:0]RC_LOFS;
reg [17:0]RC_RLSel ;
reg [31:0]PMU_OC_1 ;
reg [31:0]PMU_OC_2 ;
reg [31:0]PMU_OC_3 ;
reg [31:0]PMU_OC_4 ;
reg [31:0]DPS_FS_1 ;
reg [31:0]DPS_FS_2 ;
reg [31:0]DPS_FS_3 ;
reg [31:0]DPS_FS_4 ;
reg [3:0]DPS_FSMC ;
reg [5:0]DPS_FSMMC ;
reg DPSFS_RC1 ;
//Condition Tester
reg [3:0]en_t ;
reg [3:0]freq_t;
reg [3:0]dc_t;
//Flags
reg exec_flag;
reg err_flag;
reg [3:0]freq_slot_flag;
reg [3:0]dc_slot_flag ;
reg done_flag;
//Counter
reg [15:0]delay_cnt;
//Reg Parsing
//Shift Counter
wire [4:0]OC_Shifter1 = (i_DC_Con1[8:1] - 1) >> 3; // Channel Number div 8
wire [2:0]DMM_Shifter1 = i_DC_Con1[8:7] ; // Channel Number div 64
wire [4:0]RC_RLShifter1 = i_DC_Con1[21:17] ; // RC_RL Shifter
wire [4:0]OC_Shifter2 = (i_DC_Con2[8:1] - 1) >> 3; // Channel Number div 8
wire [2:0]DMM_Shifter2 = i_DC_Con2[8:7] ; // Channel Number div 64
wire [4:0]RC_RLShifter2 = i_DC_Con2[21:17] ; // RC_RL Shifter
wire [4:0]OC_Shifter3 = (i_DC_Con3[8:1] - 1) >> 3; // Channel Number div 8
wire [2:0]DMM_Shifter3 = i_DC_Con3[8:7] ; // Channel Number div 64
wire [4:0]RC_RLShifter3 = i_DC_Con3[21:17] ; // RC_RL Shifter
wire [4:0]OC_Shifter4 = (i_DC_Con4[8:1] - 1) >> 3; // Channel Number div 8
wire [2:0]DMM_Shifter4 = i_DC_Con4[8:7] ; // Channel Number div 64
wire [4:0]RC_RLShifter4 = i_DC_Con4[21:17] ; // RC_RL Shifter
//Channels
wire [8:0]Channel_1 = i_DC_Con1[9:1] ;
wire [8:0]Channel_2 = i_DC_Con2[9:1] ;
wire [8:0]Channel_3 = i_DC_Con3[9:1] ;
wire [8:0]Channel_4 = i_DC_Con4[9:1] ;
wire [3:0]DC_OC1 = {PMU_OC_4[0],PMU_OC_3[0],PMU_OC_2[0],PMU_OC_1[0]} ;
wire [3:0]DC_OC17 = {PMU_OC_4[16],PMU_OC_3[16],PMU_OC_2[16],PMU_OC_1[16]} ;
always @(posedge i_sys_clk) begin
if (i_rst_n == 1'b0) begin
delay_cnt <= 'd0;
end
else begin
if (exec_flag == 1'b1) begin
delay_cnt <= delay_cnt + 1'd1;
end
else begin
delay_cnt <= 'd0;
end
end
end
//Function Identify
always @(posedge i_sys_clk) begin
if (i_rst_n == 1'b0) begin
en_t <= 'd0;
freq_t <= 'd0;
dc_t <= 'd0;
end
else begin
en_t <= (i_freq_relay1[0] + i_freq_relay2[0] + i_freq_relay3[0] + i_freq_relay4[0]) + (i_DC_Con1[0] +i_DC_Con2[0] +i_DC_Con3[0] +i_DC_Con4[0] );
freq_t <= i_freq_relay1[0] + i_freq_relay2[0] + i_freq_relay3[0] + i_freq_relay4[0];
dc_t <= i_DC_Con1[0] +i_DC_Con2[0] +i_DC_Con3[0] +i_DC_Con4[0];
end
end
// Main Controller Function
always @(posedge i_sys_clk) begin
if (i_rst_n == 1'b0) begin
exec_flag <= 1'b0;
err_flag <= 1'b0;
freq_slot_flag <= 'd0;
dc_slot_flag <= 'd0;
DMM_en <= 'd0;
RC_VSel <= 'd1; //Vpk HIGH Disable, LOW Enable
RC_ISel <= 'd1; //Apk HIGH Disable, LOW Enable
RC_LOFS <= 'hf; //HIGH Disable, LOW Enable
RC_RLSel <='hfffff;
RC_Tx <= 'd0 ;
//PMU
PMU_OC_1 <= 'd0 ;
PMU_OC_2 <= 'd0 ;
PMU_OC_3 <= 'd0 ;
PMU_OC_4 <= 'd0 ;
//DPS
//DPS Switches LOW Enable
DPS_FS_1 <= 32'hFFFFFFFF;
DPS_FS_2 <= 32'hFFFFFFFF;
DPS_FS_3 <= 32'hFFFFFFFF;
DPS_FS_4 <= 32'hFFFFFFFF;
DPS_FSMC <= 4'b1111;
DPS_FSMMC <= 6'b11_1111;
DPSFS_RC1 <= 1'b1;
done_flag <= 'd1;
end
else begin
if ((i_con_exec == 1'b1) & (exec_flag == 1'b0)) begin
//To DO: More Sanity Check?
if (en_t > 'd1) begin //Only ONE Enable bit should be set!
err_flag <= 1'b1;
end
else begin
exec_flag <= 1'b1;
done_flag <= 1'b0;
err_flag <= 1'b0;
freq_slot_flag[0] <= i_freq_relay1[0];
freq_slot_flag[1] <= i_freq_relay2[0];
freq_slot_flag[2] <= i_freq_relay3[0];
freq_slot_flag[3] <= i_freq_relay4[0];
RC_Tx <= i_freq_relay4[17:12]; //Special Relay for slot4
dc_slot_flag[0] <= i_DC_Con1[0];
dc_slot_flag[1] <= i_DC_Con2[0];
dc_slot_flag[2] <= i_DC_Con3[0];
dc_slot_flag[3] <= i_DC_Con4[0];
end
end
else if (exec_flag == 1'b1) begin
if (freq_t == 1'b1) begin
io_RC <= i_freq_relay1[0] || i_freq_relay2[0] || i_freq_relay3[0] || i_freq_relay4[0];
case (freq_slot_flag)
4'b0001: begin
if (Channel_1 < 9) begin
PMU_OC_1 <= 'd1;
DMM_en <= 19'b000_0000_0000_0000_0001;
end
else if (Channel_1 < 73) begin
DMM_en <= 19'b000_0000_0000_0000_0010;
PMU_OC_1 <= 'd0;
end
else if (Channel_1 < 137) begin
PMU_OC_1 <= 1'b1 << 16;
DMM_en <= 19'b000_0000_0000_0000_0100;
end
else begin
DMM_en <= 19'b000_0000_0000_0000_1000;
PMU_OC_1 <= 'd0;
end
end
4'b0010: begin
if (Channel_2 < 9) begin
PMU_OC_2 <= 'd1;
DMM_en <= 19'b000_0000_0000_0001_0000;
end
else if (Channel_2 < 73) begin
DMM_en <= 19'b000_0000_0000_0010_0000;
PMU_OC_2 <= 'd0;
end
else if (Channel_2 < 137) begin
PMU_OC_2 <= 1'b1 << 16;
DMM_en <= 19'b000_0000_0000_0100_0000;
end
else begin
PMU_OC_2 <= 'd0;
DMM_en <= 19'b000_0000_0000_1000_0000;
end
end
4'b0100: begin
if (Channel_3 < 9) begin
PMU_OC_3 <= 'd1;
DMM_en <= 19'b000_0000_0001_0000_0000;
end
else if ((Channel_3 > 64)& (Channel_3 < 73)) begin
PMU_OC_3 <= 'd0;
DMM_en <= 19'b000_0000_0010_0000_0000;
end
else if (Channel_3 < 137) begin
DMM_en <= 19'b000_0000_0100_0000_0000;
PMU_OC_3 <= 1'b1 << 16;
end
else if (Channel_3 < 201) begin
PMU_OC_3 <= 'd0;
DMM_en <= 19'b000_0000_1000_0000_0000;
end
end
4'b1000: begin
if (Channel_4 < 9) begin
PMU_OC_4 <= 'd1;
DMM_en <= 19'b000_0001_0000_0000_0000;
end
else if (Channel_4 < 72) begin
DMM_en <= 19'b000_0010_0000_0000_0000;
PMU_OC_4 <= 'd0;
end
else if (Channel_4 < 137) begin
PMU_OC_4 <= 1'b1 << 16;
DMM_en <= 19'b000_0100_0000_0000_0000;
end
else begin
PMU_OC_4 <= 'd0;
DMM_en <= 19'b000_1000_0000_0000_0000;
end
end
default: begin // You Should NOT be HERE
PMU_OC_1 <= 'd0;
PMU_OC_2 <= 'd0;
PMU_OC_3 <= 'd0;
PMU_OC_4 <= 'd0;
DMM_en <= 'd0;
end
endcase
end
else if (dc_t == 1'b1) begin
case (dc_slot_flag)
4'b0001: begin
//Here Set Mode and F/S
if (i_DC_Con1[22] == 1'b1) begin
RC_VSel <= 1'b1; //Select Current
RC_ISel <= 1'b0;
RC_LOFS <= 2'b01;
end
else begin
RC_VSel <= 1'b0; //Select Voltage
RC_ISel <= 1'b1;
RC_LOFS <= 2'b10;
end
//Sanity Check
if ((i_DC_Con1[21:17] < 1) || (i_DC_Con1[21:17] > 18)) begin
err_flag <= 1'b1;
end
else begin
RC_RLSel <= (RC_RLShifter1 >= 1 && RC_RLShifter1 <= 18)
? ~(18'b1 << (RC_RLShifter1 - 1))
: 18'h3FFFF; //Set RLoad
if (i_DC_Con1[23] == 1'b0) begin //Select PMU
if ((Channel_1 < 1) || (Channel_1 > 256)) begin
err_flag <= 1'b1;
end
else begin
PMU_OC_1 <= (32'b0000_0000_0000_0000_0000_0000_0000_0001)<<(OC_Shifter1);
DMM_en <= (19'b000_0000_0000_0000_0001)<<(DMM_Shifter1);
end
end
else if (i_DC_Con1[23] == 1'b1) begin //Select DPS
//Sanity Check
if ((Channel_1 < 1) || (Channel_1 > 32)) begin
err_flag <= 1'b1;
end
else begin
DPS_FS_1 <= ~(32'b1 << ( Channel_1 - 1));
DPS_FSMC <= 4'b1110;
DPS_FSMMC <= 6'b10_1110;
DPSFS_RC1 <= 1'b0;
end
end
end
end
4'b0010: begin
if (i_DC_Con2[22] == 1'b1) begin
RC_VSel <= 1'b1; //Select Current
RC_ISel <= 1'b0;
RC_LOFS <= 2'b01;
end
else begin
RC_VSel <= 1'b0; //Select Voltage
RC_ISel <= 1'b1;
RC_LOFS <= 2'b10;
end
//Sanity Check
if ((i_DC_Con2[21:17] < 1) || (i_DC_Con2[21:17] > 18)) begin
err_flag <= 1'b1;
end
else begin
RC_RLSel <= (RC_RLShifter2 >= 1 && RC_RLShifter2 <= 18)
? ~(18'b1 << (RC_RLShifter2 - 1))
: 18'h3FFFF; // 否则1(即不置 0
if (i_DC_Con2[23] == 1'b0) begin //Select PMU
if ((i_DC_Con2[9:1] < 1) || (i_DC_Con2[9:1] > 256)) begin
err_flag <= 1'b1;
end
else begin
//Sanity Check
if ((Channel_2 < 1) || (Channel_2 > 32)) begin
err_flag <= 1'b1;
end
else begin
PMU_OC_2 <= (32'b0000_0000_0000_0000_0000_0000_0000_0001)<<(OC_Shifter2);
DMM_en <= (19'b000_0000_0000_0001_0000)<<(DMM_Shifter2);
end
end
end
else if (i_DC_Con2[23] == 1'b1) begin //Select DPS
DPS_FS_2 <= ~(32'b1 << ( Channel_2 - 1));
DPS_FSMC <= 4'b1101;
DPS_FSMMC <= 6'b10_1101;
DPSFS_RC1 <= 1'b0;
end
end
end
4'b0100:begin
if (i_DC_Con3[22] == 1'b1) begin
RC_VSel <= 1'b1; //Select Current
RC_ISel <= 1'b0;
RC_LOFS <= 2'b01;
end
else begin
RC_VSel <= 1'b0; //Select Voltage
RC_ISel <= 1'b1;
RC_LOFS <= 2'b10;
end
//Sanity Check
if ((i_DC_Con3[21:17] < 1) || (i_DC_Con3[21:17] > 18)) begin
err_flag <= 1'b1;
end
else begin
RC_RLSel <= (RC_RLShifter3 >= 1 && RC_RLShifter3 <= 18)
? ~(18'b1 << (RC_RLShifter3 - 1))
: 18'h3FFFF; // 否则1(即不置 0
if (i_DC_Con3[23] == 1'b0) begin //Select PMU
if ((i_DC_Con3[9:1] < 1) || (i_DC_Con3[9:1] > 256)) begin
err_flag <= 1'b1;
end
else begin
PMU_OC_3 <= (32'b0000_0000_0000_0000_0000_0000_0000_0001)<<(OC_Shifter3);
DMM_en <= (19'b000_0000_0001_0000_0000)<<(DMM_Shifter3);
end
end
else if (i_DC_Con3[23] == 1'b1) begin //Select DPS
//Sanity Check
if ((Channel_3 < 1) || (Channel_3 > 32)) begin
err_flag <= 1'b1;
end
else begin
DPS_FS_3 <= ~(32'b1 << ( Channel_3 - 1));
DPS_FSMC <= 4'b1011;
DPS_FSMMC <= 6'b01_1011;
DPSFS_RC1 <= 1'b0;
end
end
end
end
4'b1000:begin
if (i_DC_Con4[22] == 1'b1) begin
RC_VSel <= 1'b1; //Select Current
RC_ISel <= 1'b0;
RC_LOFS <= 2'b01;
end
else begin
RC_VSel <= 1'b0; //Select Voltage
RC_ISel <= 1'b1;
RC_LOFS <= 2'b10;
end
//Sanity Check
if ((i_DC_Con4[21:17] < 1) || (i_DC_Con4[21:17] > 18)) begin
err_flag <= 1'b1;
end
else begin
RC_RLSel <= (RC_RLShifter4 >= 1 && RC_RLShifter4 <= 18)
? ~(18'b1 << (RC_RLShifter4 - 1))
: 18'h3FFFF; // 否则1(即不置 0
if (i_DC_Con4[23] == 1'b0) begin //Select PMU
if ((i_DC_Con4[9:1] < 1) || (i_DC_Con4[9:1] > 256)) begin
err_flag <= 1'b1;
end
else begin
//Parsing Channel
//We need Speacial Handling for tthe "freq" channels
if (Channel_4 == 'd66 || Channel_4 == 'd68) begin
RC_Tx <= 'd1;
end
else if (Channel_4 == 'd70 || Channel_4 == 'd72) begin
RC_Tx <= 6'b00_0010;
end
else if (Channel_4 == 'd130 || Channel_4 == 'd132) begin
RC_Tx <= 6'b00_0100;
end
else if (Channel_4 == 'd134 || Channel_4 == 'd136) begin
RC_Tx <= 6'b00_1000;
end
else if (Channel_4 == 'd194 || Channel_4 == 'd196) begin
RC_Tx <= 6'b01_0000;
end
else if (Channel_4 == 'd198 || Channel_4 == 'd200) begin
RC_Tx <= 6'b10_0000;
end
else begin
RC_Tx <= 'd0;
end
PMU_OC_4 <= (32'b0000_0000_0000_0000_0000_0000_0000_0001)<<(OC_Shifter4);
DMM_en <= (19'b000_0001_0000_0000_0000)<<(DMM_Shifter4);
end
end
else if (i_DC_Con4[23] == 1'b1) begin //Select DPS
//Sanity Check
if ((Channel_4 < 1) || (Channel_4 > 32)) begin
err_flag <= 1'b1;
end
else begin
DPS_FS_4 <= ~(32'b1 << ( Channel_4 - 1));
DPS_FSMC <= 4'b0111;
DPS_FSMMC <= 6'b01_0111;
DPSFS_RC1 <= 1'b0;
end
end
end
end
default:begin // You Should NOT be HERE
RC_VSel <= 'd1;
RC_ISel <= 'd1;
RC_RLSel <= 'hf;
RC_LOFS <= 'hf;
PMU_OC_1 <= 'd0 ;
PMU_OC_2 <= 'd0 ;
PMU_OC_3 <= 'd0 ;
PMU_OC_4 <= 'd0 ;
DMM_en <= 'd0;
//DPS Switches LOW Enable
DPS_FS_1 <= 32'hFFFFFFFF;
DPS_FS_2 <= 32'hFFFFFFFF;
DPS_FS_3 <= 32'hFFFFFFFF;
DPS_FS_4 <= 32'hFFFFFFFF;
DPS_FSMC <= 4'b1111;
DPS_FSMMC <= 6'b11_1111;
DPSFS_RC1 <= 1'b1;
end
endcase
end
done_flag <= 1'b1;
end
end
if (done_flag == 1) begin
exec_flag <= 1'b0;
end
end
assign o_con_done = done_flag;
assign o_err = err_flag;
assign o_DMM_EN = DMM_en;
assign o_IO_RC1 = io_RC;
assign o_RC_Tx = RC_Tx;
assign o_RC_VSel = RC_VSel;
assign o_RC_ISel = RC_ISel;
assign o_RC_LOFS = RC_LOFS;
assign o_RC_RLSel = RC_RLSel;
assign o_PMU_OC_1 = PMU_OC_1;
assign o_PMU_OC_2 = PMU_OC_2;
assign o_PMU_OC_3 = PMU_OC_3;
assign o_PMU_OC_4 = PMU_OC_4;
assign o_DPS_FS_1 = DPS_FS_1[15:0];
assign o_DPS_FS_2 = DPS_FS_2[15:0];
assign o_DPS_FS_3 = DPS_FS_3[15:0];
assign o_DPS_FS_4 = DPS_FS_4[15:0];
assign o_DPS_FSMC = DPS_FSMC;
assign o_DPS_FSMMC = DPS_FSMMC;
assign o_DPSFS_RC1 = DPSFS_RC1;
endmodule