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/adf4371_a.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

634 lines
15 KiB
Verilog
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2021/8/13 00:24:20
// Design Name:
// Module Name: LMX2595
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
// fRFOUT= (INT+ (FRAC1+FRAC2/MOD2)/MOD1)× (fPFD/R)
// fPFD = fPFD = REFIN × ((1 + D)/(R × (1 + T)))
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//////////////////////////////////////////////////////////////////////////////////
module adf4371_a(//20.375Ghz ~ 23.875Ghz
input sysclk ,//40MHZ
input arstn ,
output cs ,
input mux_out ,
output sclk ,
output sdio ,
input [3:0] rf_en ,
input SW_PLL ,
input CAL_F ,
input [3:0] ceshi_model ,
input adf4371_hop ,
output o_cfgover ,
input[11:0] fre_code
);
localparam DATA_WIDTH = 24 ;
localparam DATA_LENTH = 72 ;
localparam WAIT_ld = 40000 ;
//*****************************************************************************
reg[7:0] cnt_word = 8'd0 ;
reg csb_reg = 1'b1 ;
reg[5:0] cnt_bits = 6'd0 ;
reg[DATA_WIDTH-1:0] cfgdata = 0, regdata = 0 ;
reg[3:0] state = 4'b000 ;
reg spi_sdo = 1'b0, spi_csb = 1'b1;
wire pll_locked ;
reg cfgover ;
reg[31:0] cnt_lock = 32'd0 ;
reg[31:0] cnt_locked = 32'd0 ;
wire[15:0] band ;
assign o_cfgover =cfgover ;
//-----------------------------------
assign pll_locked = mux_out ;
assign sclk = spi_csb ? 1'b0 : ~sysclk ;
assign cs = spi_csb & csb_reg ;
assign sdio = spi_sdo ;
//-----------------------------------
wire [7:0] SI_BAND_SEL ; //VCO频段
wire [7:0] SI_VCO_SEL_BIAS_CODE ; //[7:4]=VCO内核, [3:0]=VCO偏置
reg[13:0] MOD2 ;
reg[13:0] FRAC2 ;
reg[24:0] FRAC1 ;
reg[15:0] INT ;
assign SI_BAND_SEL = band[15:8] ;
assign SI_VCO_SEL_BIAS_CODE = band[7:0] ;
reg[2:0] hop_en ;
reg[15:0] code ;
reg[11:0] pre_fre_code ;
reg[3:0] rf_en_r ;
reg[2:0] CAL_F_R ;
reg [3:0] R_DIV ;
reg [3:0] D ;
wire[13:0] douta3 ;
wire[13:0] douta4 ;
wire[24:0] douta2 ;
wire[15:0] douta1 ;
//-----------------------------------
INT_ROMb int_rom (
.sysclk(sysclk),
.addra(code),
.douta(douta1)
);
// Instantiate the module
FRAC1 frac1_rom (
.clka(sysclk),
.addra(code),
.douta(douta2)
);
// FRAC1_ROM FRAC1_ROM (
// .clka(sysclk), // input clka
// .addra(code), // input [11 : 0] addra
// .douta(douta2) // output [24 : 0] douta
//);
frac2_rom frac2_rom (
.sysclk(sysclk),
.addra(code),
.douta(douta4)
);
mod2_rom mod2_rom (
.sysclk(sysclk),
.addra(code),
.douta(douta3)
);
band_rom_a band_rom_a (
.sysclk(sysclk),
.addra(code),
.douta(band) // output [15 : 0] douta
);
//-------------------整数边界杂散用66.666666Mhz鉴相----------------------------------
always@(posedge sysclk,negedge arstn)
begin
if(!arstn)
INT<=douta1;
else if(code==24 || code==26 )
INT<=76;
else if(code==424 )
INT<=77;
else if(code==426 )
INT<=78;
else if(code==824 || code==826 )
INT<=79;
else if(code==1224)
INT<=80;
else if(code==1226 )
INT<=81;
else if(code==1624 || code==1626 )
INT<=82;
else if(code==2024 )
INT<=83;
else if(code==2026 )
INT<=84;
else if(code==2424 || code==2426 )
INT<=85;
else if(code==2824 )
INT<=86;
else if( code==2826 )
INT<=87;
else
INT<=douta1;
end
always@(posedge sysclk,negedge arstn)
begin
if(!arstn)
FRAC1<=douta2;
else if(code==24 )
FRAC1<=16651386;
else if(code==26 )
FRAC1<=16903045;
else if(code==424 )
FRAC1<=33428602;
else if(code==426 )
FRAC1<=125829;
else if(code==824 )
FRAC1<=16651386;
else if(code==826 )
FRAC1<=16903045;
else if(code==1224)
FRAC1<=33428602;
else if(code==1226 )
FRAC1<=125829;
else if(code==1624)
FRAC1<=16651386;
else if(code==1626 )
FRAC1<=16903045;
else if(code==2024 )
FRAC1<=33428602;
else if(code==2026 )
FRAC1<=125829;
else if(code==2424 )
FRAC1<=16651386;
else if(code==2426 )
FRAC1<=16903045;
else if(code==2824 )
FRAC1<=33428602;
else if( code==2826 )
FRAC1<=125829;
else
FRAC1<=douta2;
end
always@(posedge sysclk,negedge arstn)
begin
if(!arstn)
MOD2<=douta3;
else if(code==24 )
MOD2<=25;
else if(code==26 )
MOD2<=25;
else if(code==424 )
MOD2<=25;
else if(code==426 )
MOD2<=25;
else if(code==824 )
MOD2<=25;
else if(code==826 )
MOD2<=25;
else if(code==1224)
MOD2<=25;
else if(code==1226 )
MOD2<=25;
else if(code==1624)
MOD2<=25;
else if(code==1626 )
MOD2<=25;
else if(code==2024 )
MOD2<=25;
else if(code==2026 )
MOD2<=25;
else if(code==2424 )
MOD2<=25;
else if(code==2426 )
MOD2<=25;
else if(code==2824 )
MOD2<=25;
else if( code==2826 )
MOD2<=25;
else
MOD2<=douta3;
end
always@(posedge sysclk,negedge arstn)
begin
if(!arstn)
FRAC2<=douta4;
else if(code==24 )
FRAC2<=22;
else if(code==26 )
FRAC2<=3;
else if(code==424 )
FRAC2<=22;
else if(code==426 )
FRAC2<=3;
else if(code==824 )
FRAC2<=22;
else if(code==826 )
FRAC2<=3;
else if(code==1224)
FRAC2<=22;
else if(code==1226 )
FRAC2<=3;
else if(code==1624)
FRAC2<=22;
else if(code==1626 )
FRAC2<=3;
else if(code==2024 )
FRAC2<=22;
else if(code==2026 )
FRAC2<=3;
else if(code==2424 )
FRAC2<=22;
else if(code==2426 )
FRAC2<=3;
else if(code==2824 )
FRAC2<=22;
else if( code==2826 )
FRAC2<=3;
else
FRAC2<=douta4;
end
always@(posedge sysclk,negedge arstn)
begin
if(!arstn)begin
R_DIV<=4'b1;
D<=4'b0;
end
else if(code==24 || code==26 || code==424 || code==426 || code==824 || code==826|| code==1224 || code==1226 || code==1624 || code==1626 ||code==2024 || code==2026 ||code==2424 || code==2426 ||code==2824 || code==2826 )
begin
R_DIV<= 4'd3;
D<=4'd2;
end
else
begin
R_DIV<=4'b1;
D<=4'b0;
end
end
//----------------------------------------------------------------
always@(posedge sysclk,negedge arstn)begin
if(~arstn)
pre_fre_code<=11'h6d6;
else if(CAL_F_R==3'b011)
pre_fre_code<=fre_code;
else
pre_fre_code<=pre_fre_code;
end
always@(posedge sysclk,negedge arstn)begin
if(~arstn)
code<=16'h0;
else if(hop_en==2'b01)
code<=fre_code;
else
code<=code;
end
always@(posedge sysclk,negedge arstn)begin
if(~arstn)begin
hop_en <= 3'b0;
rf_en_r <= 4'b0;
CAL_F_R <= 3'b0;
end
else begin
hop_en <= {hop_en[1:0],adf4371_hop};
CAL_F_R <= {CAL_F_R[1:0],CAL_F};
rf_en_r <= rf_en ;
end
end
always@(posedge sysclk,negedge arstn)begin
if(~arstn)
csb_reg <= 1'b1;
else
csb_reg <= spi_csb;
end
always@(posedge sysclk,negedge arstn)begin
if(~arstn)
cnt_locked<=32'b0;
else if(cnt_locked==WAIT_ld)
cnt_locked<=32'b0;
else if(!pll_locked)
cnt_locked<=cnt_locked+1'b1;
else
cnt_locked<=32'b0;
end
always@(posedge sysclk,negedge arstn)begin
if(~arstn)begin
cfgdata <= 0;
cnt_word <= 7'd0;
cnt_bits <= 6'd0;
state <= 4'b0;
cnt_lock <= 32'd0;
spi_csb <= 1'b1;
cfgover <= 1'b0;
spi_sdo <= 1'b0;
end
else begin
case(state)
4'd0:begin
cnt_word <= 7'd0;
if(rf_en==1'b1)
state <= 4'd0;
else if(cnt_lock >= 32'd4000)
state <= 4'd1;
else
state <= state;
if(rf_en==1'b0)
cnt_lock <= cnt_lock + 1'b1;
else
cnt_lock<=32'd0;
end
4'd1:begin
spi_csb <= 1'b1;
spi_sdo <= 1'b0;
if(rf_en==1'b1)
state <= 4'd0;
else
state <= 4'd2;
end
4'd2:begin
cfgdata <= regdata;
cnt_bits <= 6'd0;
state <= 4'd3;
end
4'd3:begin
spi_csb <= 1'b0;
spi_sdo <= cfgdata[DATA_WIDTH-1];
cfgdata <= cfgdata << 1'b1;
cnt_bits <= cnt_bits + 1'b1;
if(cnt_bits == DATA_WIDTH-1)begin
state <= 4'd4;
cnt_word <= cnt_word + 1'b1;
end
cnt_lock <= 32'd0;
end
4'd4:begin
spi_csb <= 1'b1;
spi_sdo <= 1'b0;
cnt_lock <= 32'd0;
cnt_bits <= 32'd0;
if(cnt_word == DATA_LENTH)begin
state <= 4'd5;
end
else
state <= 4'd1;
end
4'd5:begin
if(cnt_lock>=40000 || pll_locked)begin
cnt_lock <= 32'd0 ;
state <= 4'd6 ;
end
else begin
cnt_lock <=cnt_lock+1'b1;
state <= state ;
end
end
4'd6:begin
cnt_word <= 7'd0;
if(pll_locked)
state <= 4'd7 ;
else
state <= 4'b1 ;
end
//----------------------------------------------------------------
4'd7:begin//IDLE
cnt_word <= DATA_LENTH;
spi_csb <= 1'b1;
spi_sdo <= 1'b0;
cnt_bits <= 6'd0;
cfgover <= 1'b0;
if(rf_en==4'b1)
state <= state;
else if(rf_en==4'b0 && rf_en_r==4'b1 )
state <= 4'd0;
else if(hop_en==2'b10 || cnt_locked==WAIT_ld )
state <= 4'd8;
else if(CAL_F_R==3'b011 && (pre_fre_code!=fre_code))//打开RF_OUT
state <= 4'd12;
else
state <= state;
end
4'd8:begin
spi_csb <= 1'b1;
spi_sdo <= 1'b0;
state <= 4'd9;
end
4'd9:begin
cfgdata <= regdata;
cnt_bits <= 6'd0;
state <= 4'd10;
end
4'd10:begin
spi_csb <= 1'b0;
spi_sdo <= cfgdata[DATA_WIDTH-1];
cfgdata <= cfgdata << 1'b1;
cnt_bits <= cnt_bits + 1'b1;
if(cnt_bits == DATA_WIDTH-1)begin
state <= 4'd11;
cnt_word <= cnt_word + 1'b1;
end
end
4'd11:begin
spi_csb <= 1'b1;
spi_sdo <= 1'b0;
cnt_lock <= 32'd0;
cnt_bits <= 32'd0;
if(cnt_word == 8'd85)begin
state <= 4'd7;
end
else
state <= 4'd8;
end
4'd12:begin
spi_csb <= 1'b1;
spi_sdo <= 1'b0;
state <= 4'd13;
end
4'd13:begin
cnt_bits <= 6'd0;
state <= 4'd14;
if(ceshi_model==4'ha)
cfgdata<={16'h0025,8'h13};
else if(ceshi_model==4'hb)
cfgdata<={16'h0025,8'h00};
else if(SW_PLL)
cfgdata<={16'h0025,8'h13};
else
cfgdata<={16'h0025,8'h00};
end
4'd14:begin
spi_csb <= 1'b0;
spi_sdo <= cfgdata[DATA_WIDTH-1];
cfgdata <= cfgdata << 1'b1;
cnt_bits <= cnt_bits + 1'b1;
if(cnt_bits == DATA_WIDTH-1)begin
state <= 4'd7;
cfgover <= 1'b1;
cnt_word <= cnt_word ;
end
end
//&*&#&*&#&*&#&*&#&*&#&*&#&*&#&*&#&*&#&*&#&*&#&*&#//
default: begin
spi_csb <= 1'b1;
state <= 4'd0;
cnt_lock <= 32'd0;
cnt_word <= 8'd0;
end
endcase
end
end
always@(posedge sysclk,negedge arstn)
begin
if(!arstn)
regdata <= {16'h0000,8'h18 };
else case(cnt_word)
8'd0 : regdata <= {16'h0000,8'h18 };
8'd1 : regdata <= {16'h0001,8'h00 };
8'd2 : regdata <= {16'h0003,8'h00 };
8'd3 : regdata <= {16'h0004,8'h00 };
8'd4 : regdata <= {16'h0005,8'h00 };
8'd5 : regdata <= {16'h0006,8'hFF };
8'd6 : regdata <= {16'h000C,8'h00 };
8'd7 : regdata <= {16'h000D,8'h00 };
8'd8 : regdata <= {16'h0010 ,INT[7:0] } ;
8'd9 : regdata <= {16'h0011 ,INT[15:8] } ;
8'd10 : regdata <= {16'h0012,8'h00 };//[6]No Autocalibration
//8'd10 : regdata <= {16'h0012,8'h40 };//[6]Autocalibration
8'd11 : regdata <= {16'h0014 ,FRAC1[7:0]} ;
8'd12 : regdata <= {16'h0015 ,FRAC1[15:8]} ;
8'd13 : regdata <= {16'h0016 ,FRAC1[23:16]} ;
8'd14 : regdata <= {16'h0017 ,FRAC2[6:0],FRAC1[24]} ;
8'd15 : regdata <= {16'h0018 ,1'b0,FRAC2[13:7] } ;
8'd16 : regdata <= {16'h0019 ,MOD2[7:0]} ;
8'd17 : regdata <= {16'h001A ,2'b0,MOD2[13:8]} ;
8'd18 : regdata <= {16'h001B,8'h00 };
8'd19 : regdata <= {16'h001C,8'h00 };
8'd20 : regdata <= {16'h001D,8'h00 };
8'd21 : regdata <= {16'h001E,8'h18 };//CP_CURRENT 电荷泵
// 8'd21 : regdata <= { 16'h001E,cp,4'h8 };//CP_CURRENT 电荷泵
8'd22 : regdata <= { 16'h001F,4'h0,R_DIV };//R DIV R分频器
8'd23 : regdata <= {16'h0020,8'h1c };//digital lock detect 数字锁定ld
8'd24 : regdata <= {16'h0021,8'h00 };
8'd25 : regdata <= {16'h0022,D,4'd0 };//[4]2分频 [5]double 2倍频器
8'd26 : regdata <= {16'h0023,8'h00 };
8'd27 : regdata <= {16'h0024,8'h80 };//Fout_clk DIV_SEL
8'd28 : regdata <= {16'h0025,8'h13 };//X4_EN
8'd29 : regdata <= {16'h0026,8'h1F };
8'd30 : regdata <= {16'h0027,8'hCD };
//8'd30 : regdata <= {16'h0027,8'hCD };
8'd31 : regdata <= {16'h0028,8'h83 };
8'd32 : regdata <= {16'h002A,8'h00 };
8'd33 : regdata <= {16'h002B,8'h00 };
8'd34 : regdata <= {16'h002C,8'h44 };
8'd35 : regdata <= {16'h002D,8'h11 };
8'd36 : regdata <= {16'h002E,8'h12 };
8'd37 : regdata <= {16'h002F,8'h94 };
8'd38 : regdata <= {16'h0030,8'h2A };
8'd39 : regdata <= {16'h0031,8'h02 };
8'd40 : regdata <= {16'h0032,8'h04 };
8'd41 : regdata <= {16'h0033,8'h22 };
8'd42 : regdata <= {16'h0034,8'h25 };
8'd43 : regdata <= {16'h0035,8'hFA };
8'd44 : regdata <= {16'h0036,8'h30 };
8'd45 : regdata <= {16'h0037,SI_BAND_SEL} ;//VCO频段
8'd46 : regdata <= {16'h0038,SI_VCO_SEL_BIAS_CODE };//[7:4]=VCO内核,[3:0]VCO偏置
8'd47 : regdata <= {16'h0039,8'h07 };
8'd48 : regdata <= {16'h003A,8'h55 };
8'd49 : regdata <= {16'h003D,8'h00 };
8'd50 : regdata <= {16'h003E,8'h0C };
8'd51 : regdata <= {16'h003F,8'h80 };
8'd52 : regdata <= {16'h0040,8'h50 };
8'd53 : regdata <= {16'h0041,8'h28 };
8'd54 : regdata <= {16'h0042,8'h00 };
8'd55 : regdata <= {16'h0043,8'h00 };
8'd56 : regdata <= {16'h0044,8'h00 };
8'd57 : regdata <= {16'h0045,8'h00 };
8'd58 : regdata <= {16'h0046,8'h00 };
8'd59 : regdata <= {16'h0047,8'hC0 };
8'd60 : regdata <= {16'h0052,8'hF4 };
8'd61 : regdata <= {16'h006C,8'h00 };
8'd62 : regdata <= {16'h006E,8'h00 };
8'd63 : regdata <= {16'h006F,8'h00 };
8'd64 : regdata <= {16'h0070,8'hE3 };
8'd65 : regdata <= {16'h0071,8'h60 };
8'd66 : regdata <= {16'h0072,8'h32 };
8'd67 : regdata <= {16'h0073,8'h00 };
8'd68 : regdata <= {16'h0079,8'h00 };
8'd69 : regdata <= {16'h007A,8'h00 };
8'd70 : regdata <= {16'h007B,8'h00 };
8'd71 : regdata <= {16'h007C,8'h00 };
//跳频
8'd72:regdata <= { 16'h0022,D,4'd0 };//double D倍频器
8'd73:regdata <= { 16'h001F,4'h0,R_DIV };//R DIV R分频器
8'd74:regdata <= { 16'h001A ,2'b0,MOD2[13:8] } ;
8'd75:regdata <= { 16'h0019 ,MOD2[7:0] } ;
8'd76:regdata <= { 16'h0018 ,1'b0,FRAC2[13:7] } ;
8'd77:regdata <= { 16'h0017 ,FRAC2[6:0],FRAC1[24] } ;
8'd78:regdata <= { 16'h0016 ,FRAC1[23:16] } ;
8'd79:regdata <= { 16'h0015 ,FRAC1[15:8] } ;
8'd80:regdata <= { 16'h0014 ,FRAC1[7:0] } ;
8'd81:regdata <= { 16'h0037 ,SI_BAND_SEL } ;
8'd82:regdata <= { 16'h0038 ,SI_VCO_SEL_BIAS_CODE } ;
8'd83:regdata <= { 16'h0011 ,INT[15:8] } ;
8'd84:regdata <= { 16'h0010 ,INT[7:0] } ;
default: regdata <= regdata;
endcase
end
endmodule