This repository has been archived on 2023-04-15. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
vivado-202304/projects/duifei/duifei_cmos/rtl/Sisyif_src/mgc_ctrl.v
T
josh 2e92604bfb add xc7z100 modules; add duifei_cmos;
the modification to dl84_k7_cal_coarse is not complete
2023-03-30 17:18:05 +08:00

435 lines
8.6 KiB
Verilog

`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