`timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// // Company: // Engineer: // // Create Date: 19:54:29 09/06/2021 // Design Name: // Module Name: mgc_ctrl // Project Name: // Target Devices: // Tool versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // ////////////////////////////////////////////////////////////////////////////////// module mgc_ctrl( input i_sys_clk , input i_rst_n , input i_TR_SW_F , input i_TP_EN_F , input i_CAL_F , input i_T_MGC_EN_F , input i_R_MGC_EN_F , input [15:0] i_fre_code , input [7:0] i_tx_mgc , input [7:0] i_rx1_mgc , input [7:0] i_rx2_mgc , input [7:0] i_rx3_mgc , input [7:0] i_rx4_mgc , input [3:0] i_ceshi_module, output [15:0] o_current_fre_code, output [15:0] o_cal_fre_code, output [15:0] o_hop_fre_code, output o_adf4371_hop1, output o_adf4371_hop2, output o_SW, output o_SW2, output o_SW3, output o_SW_C1, //发射通道MGC控制,高衰。31dB,步进1dB。初始态直通(全置1) output o_T_MGC_1dB, output o_T_MGC_2dB, output o_T_MGC_4dB, output o_T_MGC_8dB, output o_T_MGC_16dB, //接收通道1MGC控制,高衰。31dB,步进1dB。初始态直通(全置1) output reg[7:0] o_R_MGC_1, //接收通道2MGC控制,高衰。31dB,步进1dB。初始态直通(全置1) output reg[7:0] o_R_MGC_2, //接收通道3MGC控制,高衰。31dB,步进1dB。初始态直通(全置1) output reg[7:0] o_R_MGC_3, //接收通道4MGC控制,高衰。31dB,步进1dB。初始态直通(全置1) output reg[7:0] o_R_MGC_4 ); reg TR_SW_F; reg [2:0] TP_EN_r; reg [2:0] T_MGC_EN_r; reg [2:0] R_MGC_EN_r; reg [2:0] R_CAL_F; reg [15:0] hop_fre_code; reg [15:0] current_fre_code; wire [15:0] cal_fre_code; reg [47:0] fre_code_a_b; reg hop_en; reg hop_en_r; reg hop_en_rr; reg cfg_en; reg cfg_en_r; reg cfg_en_rr; reg hmc704_1_hop; reg hmc704_2_hop; reg [1:0] cnt_cfg; reg [1:0] cnt_hop; reg sw1; reg sw2; reg sw3; reg SW_C1; reg T_MGC_1dB_r ; reg T_MGC_2dB_r ; reg T_MGC_4dB_r ; reg T_MGC_8dB_r ; reg T_MGC_16dB_r; assign o_SW = sw1; assign o_SW2 = sw2; assign o_SW3 = sw3; assign o_SW_C1 = SW_C1; assign o_current_fre_code= current_fre_code; assign o_cal_fre_code = cal_fre_code; assign o_hop_fre_code = hop_fre_code; assign o_adf4371_hop1 = hmc704_1_hop; assign o_adf4371_hop2 = hmc704_2_hop; assign o_T_MGC_1dB = T_MGC_1dB_r ; assign o_T_MGC_2dB = T_MGC_2dB_r ; assign o_T_MGC_4dB = T_MGC_4dB_r ; assign o_T_MGC_8dB = T_MGC_8dB_r ; assign o_T_MGC_16dB = T_MGC_16dB_r ; always@(posedge i_sys_clk or negedge i_rst_n)begin if(!i_rst_n)begin TR_SW_F <= 1'b0; TP_EN_r <= 3'b0; T_MGC_EN_r <= 3'b0; R_MGC_EN_r <= 3'b0; R_CAL_F <= 3'b0; end else begin TR_SW_F <= i_TR_SW_F; TP_EN_r <= {TP_EN_r[1:0] ,i_TP_EN_F}; T_MGC_EN_r <= {T_MGC_EN_r[1:0] ,i_T_MGC_EN_F}; R_MGC_EN_r <= {R_MGC_EN_r[1:0] ,i_R_MGC_EN_F}; R_CAL_F <= {R_CAL_F[1:0] ,i_CAL_F}; end end always@(posedge i_sys_clk or negedge i_rst_n)begin if(!i_rst_n)begin SW_C1 <= 1'b0; current_fre_code <= 16'h6d6 ; end else begin current_fre_code <= hop_en ? hop_fre_code : current_fre_code ; if(TR_SW_F==1'b1)begin if(current_fre_code<=1500)//20.375Ghz~21.875Ghz SW_C1 <= 1'b1; else //21.875Ghz~23.875Ghz SW_C1 <= 1'b0; end else begin SW_C1 <= SW_C1; end end end assign cal_fre_code = R_CAL_F==3'b001 ? hop_fre_code : cal_fre_code ; always@(posedge i_sys_clk or negedge i_rst_n)begin if(!i_rst_n)begin fre_code_a_b <= 48'h0000000006d6; end else if(cfg_en)begin fre_code_a_b <= {fre_code_a_b[31:0],i_fre_code}; end else begin fre_code_a_b <= fre_code_a_b; end end always@(posedge i_sys_clk or negedge i_rst_n)begin if(!i_rst_n)begin hop_en <= 1'b0; end else if(TP_EN_r==3'b011)begin hop_en <= 1'b1; end else begin hop_en <= 1'b0; end end always@(posedge i_sys_clk or negedge i_rst_n)begin if(!i_rst_n)begin hop_fre_code <= 16'h6d6; end else begin hop_fre_code <= i_fre_code; end end always@(posedge i_sys_clk or negedge i_rst_n)begin if(!i_rst_n)begin cfg_en <= 1'b0; end else if(hop_fre_code != i_fre_code)begin cfg_en <= 1'b1; end else begin cfg_en <= 1'b0; end end always @ (posedge i_sys_clk or negedge i_rst_n)begin if(!i_rst_n)begin hop_en_r <= 1'b0; hop_en_rr <= 1'b0; end else begin hop_en_r <= hop_en; hop_en_rr <= hop_en_r; end end always @ (posedge i_sys_clk or negedge i_rst_n)begin if(!i_rst_n)begin cfg_en_r <= 1'b0; cfg_en_rr <= 1'b0; end else begin cfg_en_r <= cfg_en; cfg_en_rr <= cfg_en_r; end end reg [15:0] pre_hop_fre_code; always @ (posedge i_sys_clk or negedge i_rst_n)begin if(!i_rst_n)begin cnt_hop <= 2'b00; end else if(cnt_hop == 2'b10)begin cnt_hop <= 2'b00; end else if(~hop_en_r & hop_en && (pre_hop_fre_code!=hop_fre_code ))begin cnt_hop <= cnt_hop + 1'b1; end else begin cnt_hop <= cnt_hop; end end always @ (posedge i_sys_clk or negedge i_rst_n)begin if(!i_rst_n)begin cnt_cfg <= 2'b00; end else if(cnt_cfg == 2'b10)begin cnt_cfg <= 2'b00; end else if(~cfg_en_r&cfg_en)begin cnt_cfg <= cnt_cfg + 1'b1; end else begin cnt_cfg <= cnt_cfg; end end always @ (posedge i_sys_clk or negedge i_rst_n)begin if(!i_rst_n) pre_hop_fre_code<=16'h6d6; else if(hop_en_rr) pre_hop_fre_code<=hop_fre_code; else pre_hop_fre_code<=pre_hop_fre_code; end always @ (posedge i_sys_clk or negedge i_rst_n)begin if(!i_rst_n)begin sw1 <= 1'b1; sw2 <= 1'b1; sw3 <= 1'b0; end else if(i_ceshi_module==4'ha)//自动校准开关到a begin sw1 <= 1'b0; sw2 <= 1'b0; sw3 <= 1'b1; end else if(i_ceshi_module==4'hb)//自动校准开关到b begin sw1 <= 1'b1; sw2 <= 1'b1; sw3 <= 1'b0; end else if(hop_en_rr && pre_hop_fre_code != hop_fre_code)begin if(cnt_hop == 2'b01)begin sw1 <= 1'b0; sw2 <= 1'b0; sw3 <= 1'b1; end else begin sw1 <= 1'b1; sw2 <= 1'b1; sw3 <= 1'b0; end end else begin sw1 <= sw1; sw2 <= sw2; sw3 <= sw3; end end always @ (posedge i_sys_clk or negedge i_rst_n)begin if(!i_rst_n)begin hmc704_1_hop <= 1'b0; hmc704_2_hop <= 1'b0; end else if(i_ceshi_module==4'ha&&cfg_en_rr)begin hmc704_1_hop <= 1'b1; hmc704_2_hop <= 1'b0; end else if(i_ceshi_module==4'hb&&cfg_en_rr)begin hmc704_1_hop <= 1'b0; hmc704_2_hop <= 1'b1; end else if(cfg_en_rr)begin if(fre_code_a_b[47:32]==fre_code_a_b[15:0])begin hmc704_1_hop <= 1'b0; hmc704_2_hop <= 1'b0; end else if(cnt_cfg == 2'b01)begin hmc704_1_hop <= 1'b1; hmc704_2_hop <= 1'b0; end else begin hmc704_1_hop <= 1'b0; hmc704_2_hop <= 1'b1; end end else begin hmc704_1_hop <= 1'b0; hmc704_2_hop <= 1'b0; end end /* always @ (posedge i_sys_clk or negedge i_rst_n)begin if(!i_rst_n)begin sw1 <= 1'b1; sw2 <= 1'b1; sw3 <= 1'b0; end end always @ (posedge i_sys_clk or negedge i_rst_n)begin if(!i_rst_n)begin hmc704_1_hop <= 1'b0; hmc704_2_hop <= 1'b0; end else if(cfg_en_rr)begin hmc704_1_hop <= 1'b0; hmc704_2_hop <= 1'b1; end else begin hmc704_1_hop <= 1'b0; hmc704_2_hop <= 1'b0; end end */ always@(posedge i_sys_clk or negedge i_rst_n)begin if(!i_rst_n)begin T_MGC_1dB_r <= 1'b0; T_MGC_2dB_r <= 1'b0; T_MGC_4dB_r <= 1'b0; T_MGC_8dB_r <= 1'b0; T_MGC_16dB_r <= 1'b0; end else if(i_ceshi_module==4'ha || i_ceshi_module==4'hb )begin T_MGC_1dB_r <= 1'b0; T_MGC_2dB_r <= 1'b0; T_MGC_4dB_r <= 1'b0; T_MGC_8dB_r <= 1'b0; T_MGC_16dB_r <= 1'b0; end else if(T_MGC_EN_r==3'b011)begin T_MGC_1dB_r <= i_tx_mgc[0]; T_MGC_2dB_r <= i_tx_mgc[1]; T_MGC_4dB_r <= i_tx_mgc[2]; T_MGC_8dB_r <= i_tx_mgc[3]; T_MGC_16dB_r <= i_tx_mgc[4]; end else begin T_MGC_1dB_r <= T_MGC_1dB_r ; T_MGC_2dB_r <= T_MGC_2dB_r ; T_MGC_4dB_r <= T_MGC_4dB_r ; T_MGC_8dB_r <= T_MGC_8dB_r ; T_MGC_16dB_r <= T_MGC_16dB_r ; end end always@(posedge i_sys_clk or negedge i_rst_n)begin if(!i_rst_n)begin o_R_MGC_1 <= 1'b0; end else if(R_MGC_EN_r==3'b011)begin o_R_MGC_1 <= i_rx1_mgc; end end always@(posedge i_sys_clk or negedge i_rst_n)begin if(!i_rst_n)begin o_R_MGC_2 <= 1'b0; end else if(R_MGC_EN_r==3'b011)begin o_R_MGC_2 <= i_rx2_mgc; end end always@(posedge i_sys_clk or negedge i_rst_n)begin if(!i_rst_n)begin o_R_MGC_3 <= 1'b0; end else if(R_MGC_EN_r==3'b011)begin o_R_MGC_3 <= i_rx3_mgc; end end always@(posedge i_sys_clk or negedge i_rst_n)begin if(!i_rst_n)begin o_R_MGC_4 <= 1'b0; end else if(R_MGC_EN_r==3'b011)begin o_R_MGC_4 <= i_rx4_mgc; end end endmodule