190 lines
6.9 KiB
Verilog
190 lines
6.9 KiB
Verilog
module CPLD_Con (
|
|
input i_sys_clk,
|
|
input i_rst_n,
|
|
input i_con_exec,
|
|
input [23:0]i_freq_relay1,
|
|
input [23:0]i_freq_relay2,
|
|
input [23:0]i_freq_relay3,
|
|
input [23:0]i_freq_relay4,
|
|
output o_con_done,
|
|
output [3:0]o_OC_x01,
|
|
output [3:0]o_OC_x17,
|
|
output [18:0]o_DMM_EN,
|
|
output o_IO_RC1,
|
|
output [4:0]o_RC_Tx,
|
|
output o_err
|
|
);
|
|
|
|
//Relay Reg
|
|
reg [3:0]OC_x01 ;
|
|
reg [3:0]OC_x17 ;
|
|
reg [18:0]DMM_en ;
|
|
|
|
reg[4:0]RC_Tx;
|
|
reg io_RC;
|
|
|
|
//Flags
|
|
reg exec_flag;
|
|
reg err_flag;
|
|
reg [3:0]slot_exec_flag;
|
|
reg done_flag;
|
|
|
|
//Counter
|
|
reg [15:0]delay_cnt;
|
|
|
|
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
|
|
|
|
always @(posedge i_sys_clk) begin
|
|
if (i_rst_n == 1'b0) begin
|
|
exec_flag <= 1'b0;
|
|
err_flag <= 1'b0;
|
|
slot_exec_flag <= 'd0;
|
|
|
|
OC_x01 <= 'd0;
|
|
OC_x17 <= 'd0;
|
|
io_RC <= 'd0;
|
|
done_flag <= 'd1;
|
|
end
|
|
else begin
|
|
if ((i_con_exec == 1'b1) & (exec_flag == 1'b0)) begin
|
|
exec_flag <= 1'b1;
|
|
done_flag <= 1'b0;
|
|
//To DO: More Sanity Check?
|
|
if (i_freq_relay1[0] && i_freq_relay2[0] && i_freq_relay3[0] && i_freq_relay4[0]) begin
|
|
err_flag <= 1'b1;
|
|
end
|
|
else begin
|
|
slot_exec_flag[0] <= i_freq_relay1[0];
|
|
slot_exec_flag[1] <= i_freq_relay2[0];
|
|
slot_exec_flag[2] <= i_freq_relay3[0];
|
|
slot_exec_flag[3] <= i_freq_relay4[0];
|
|
RC_Tx <= i_freq_relay4[14:10];
|
|
end
|
|
end
|
|
else if (exec_flag == 1'b1) begin
|
|
io_RC <= i_freq_relay1[0] || i_freq_relay2[0] || i_freq_relay3[0] || i_freq_relay4[0];
|
|
case (slot_exec_flag)
|
|
4'b0001: begin
|
|
if (i_freq_relay1[9:1] < 9) begin
|
|
OC_x01 <= 4'b0001;
|
|
OC_x17 <= 'd0;
|
|
DMM_en <= 19'b000_0000_0000_0000_0001;
|
|
end
|
|
else if (i_freq_relay1[9:1] < 73) begin
|
|
DMM_en <= 19'b000_0000_0000_0000_0010;
|
|
OC_x01 <= 'd0;
|
|
OC_x17 <= 'd0;
|
|
end
|
|
else if (i_freq_relay1[9:1] < 137) begin
|
|
OC_x17 <= 4'b0001;
|
|
OC_x01 <= 'd0;
|
|
DMM_en <= 19'b000_0000_0000_0000_0100;
|
|
end
|
|
else begin
|
|
DMM_en <= 19'b000_0000_0000_0000_1000;
|
|
OC_x01 <= 'd0;
|
|
OC_x17 <= 'd0;
|
|
end
|
|
end
|
|
4'b0010: begin
|
|
if (i_freq_relay2[9:1] < 9) begin
|
|
OC_x01 <= 4'b0010;
|
|
OC_x17 <= 'd0;
|
|
DMM_en <= 19'b000_0000_0000_0001_0000;
|
|
end
|
|
else if (i_freq_relay2[9:1] < 73) begin
|
|
DMM_en <= 19'b000_0000_0000_0010_0000;
|
|
OC_x01 <= 'd0;
|
|
OC_x17 <= 'd0;
|
|
end
|
|
else if (i_freq_relay2[9:1] < 137) begin
|
|
OC_x17 <= 4'b0010;
|
|
OC_x01 <= 'd0;
|
|
DMM_en <= 19'b000_0000_0000_0100_0000;
|
|
end
|
|
else begin
|
|
OC_x01 <= 'd0;
|
|
OC_x17 <= 'd0;
|
|
DMM_en <= 19'b000_0000_0000_1000_0000;
|
|
end
|
|
end
|
|
4'b0100: begin
|
|
if (i_freq_relay3[9:1] < 9) begin
|
|
OC_x01 <= 'b0100;
|
|
OC_x17 <= 'd0;
|
|
DMM_en <= 19'b000_0000_0001_0000_0000;
|
|
end
|
|
else if ((i_freq_relay3[9:1] > 64)& (i_freq_relay3[9:1] < 73)) begin
|
|
OC_x01 <= 4'b0000;
|
|
OC_x17 <= 'd0;
|
|
DMM_en <= 19'b000_0000_0010_0000_0000;
|
|
end
|
|
else if (i_freq_relay3[9:1] < 137) begin
|
|
DMM_en <= 19'b000_0000_0100_0000_0000;
|
|
OC_x01 <= 'd0;
|
|
OC_x17 <= 'b0100;
|
|
end
|
|
else if (i_freq_relay3[9:1] < 201) begin
|
|
OC_x17 <= 4'd0;
|
|
OC_x01 <= 'd0;
|
|
DMM_en <= 16'b000_0000_1000_0000_0000;
|
|
end
|
|
end
|
|
4'b1000: begin
|
|
if (i_freq_relay4[9:1] < 9) begin
|
|
OC_x01 <= 4'b1000;
|
|
OC_x17 <= 'd0;
|
|
DMM_en <= 19'b000_0001_0000_0000_0000;
|
|
end
|
|
else if (i_freq_relay4[9:1] < 72) begin
|
|
DMM_en <= 19'b000_0010_0000_0000_0000;
|
|
OC_x01 <= 'd0;
|
|
OC_x17 <= 'd0;
|
|
end
|
|
else if (i_freq_relay4[9:1] < 137) begin
|
|
OC_x17 <= 4'b1000;
|
|
OC_x01 <= 'd0;
|
|
DMM_en <= 19'b000_0100_0000_0000_0000;
|
|
end
|
|
else begin
|
|
OC_x01 <= 'd0;
|
|
OC_x17 <= 'd0;
|
|
DMM_en <= 19'b000_1000_0000_0000_0000;
|
|
end
|
|
end
|
|
default: begin
|
|
OC_x01 <= 4'b0000;
|
|
OC_x17 <= 4'b0000;
|
|
DMM_en <= 'd0;
|
|
end
|
|
endcase
|
|
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_DMM_EN = DMM_en;
|
|
assign o_OC_x01 = OC_x01;
|
|
assign o_OC_x17 = OC_x17;
|
|
assign o_IO_RC1 = io_RC;
|
|
assign o_err = err_flag;
|
|
assign o_RC_Tx = RC_Tx;
|
|
|
|
|
|
endmodule |