板载晶振为100MHz,设置的R分频器的R为200,INT为2400,RFdivider为8,D=T=FRAC=0,设置的频率输出为150MHz,但是实际生成的频率为270多MHz,且上下跳动,muxout输出的应该是0.5MHz的经过R分频之后的检相频率,但是接到示波器显示输出100Mhz的板载晶振频率。
module ADF4351(
input wire clk,
input wire rst_n,
input wire key_flag,
output reg ce,
output reg le,
output reg sclk,
output reg sdata
);
parameter reg_r0 =32'h04B00000;
parameter reg_r1 =32'h00008011;
parameter reg_r2 =32'h0C321FC2;
parameter reg_r3 =32'h004004b3;
parameter reg_r4 =32'h00b040bc;
parameter reg_r5 =32'h00580005;
parameter IDLE = 2'b00;
parameter WAIT = 2'b01;
parameter WRITE = 2'b11;
reg [5:0] cnt_bity ; //时钟脉冲计数器 计数到32
reg [3:0] cnt_bit ; //寄存器计数器,计数到6
reg [31:0] data ;
reg [1:0] state ;
reg [2:0] cnt_clk ;
//cnt_clk
always@(posedge clk or negedge rst_n)begin
if(!rst_n)
cnt_clk <= 3'd0;
else if(state == WAIT)
cnt_clk <= cnt_clk +3'd1;
else
cnt_clk <= cnt_clk;
end
//状态转移
always@(posedge clk or negedge rst_n)begin
if(!rst_n)
state <= IDLE;
else case(state)
IDLE: if(key_flag)
state <= WRITE;
else
state <= state;
WRITE: if((cnt_bit == 4'd5)&&(cnt_bity == 6'd32)&&(!sclk))
state <= IDLE;
else if((cnt_bit < 4'd5)&&(cnt_bity == 6'd32)&&(!sclk))
state <= WAIT;
else
state <= state;
WAIT: if(cnt_clk == 3'd3)
state <= WRITE;
else
state <= state;
default: state <= IDLE;
endcase
end
//ce
always@(posedge clk or negedge rst_n)begin
if(!rst_n)
ce <= 1'd0;
else if(data == 32'd0)
ce <= 1'd0;
else if(data == reg_r0||reg_r1||reg_r2||reg_r3||reg_r4||reg_r5)
ce <= 1'd1;
end
//cnt_bit 计数到5
always@(posedge clk or negedge rst_n)begin
if(!rst_n)
cnt_bit <= 4'd0;
else if((cnt_bity == 6'd32)&&(cnt_bit == 4'd5)&&(!sclk))
cnt_bit <= 4'd0;
else if((cnt_bity == 6'd32)&&(cnt_bit <4'd5)&&(!sclk))
cnt_bit <= cnt_bit+1'd1;
else
cnt_bit <= cnt_bit;
end
//cnt_bity 计数到32
always@(posedge clk or negedge rst_n)begin
if(!rst_n)
cnt_bity <= 6'd0;
else if((!sclk)&&(cnt_bity == 6'd32))
cnt_bity <= 6'd0;
else if((key_flag)||(cnt_clk==3'd3)||(!sclk))
cnt_bity <= cnt_bity +6'd1;
else
cnt_bity <= cnt_bity;
end
//data
always@(posedge clk or negedge rst_n)begin
if(!rst_n)
data <= 32'd0;
else case(cnt_bit)
4'd0 : data <= reg_r5;
4'd1 : data <= reg_r4;
4'd2 : data <= reg_r3;
4'd3 : data <= reg_r2;
4'd4 : data <= reg_r1;
4'd5 : data <= reg_r0;
default: data <= 32'd0 ;
endcase
end
//sclk
always@(posedge clk or negedge rst_n)begin
if(!rst_n)
sclk <= 1'd1;
else if((!sclk)&&(cnt_bity == 6'd32))
sclk <= 1'd1;
else if(state==WRITE)
sclk <= ~sclk;
else
sclk <= sclk;
end
//le拉低时数据进行传输
always@(posedge clk or negedge rst_n)begin
if(!rst_n)
le <= 1'd1;
else if(key_flag)
le <= 1'd0;
else if((!sclk)&&(cnt_bity == 6'd32))
le <= 1'd1;
else if((state == WAIT)&&(cnt_clk >= 3'd2))
le <= 1'd0;
else
le <= le;
end
//sdata
always@(posedge clk or negedge rst_n)begin
if(!rst_n)
sdata <= 1'd0;
else if((!sclk)&&(cnt_bity == 6'd32))
sdata <= 1'd1;
else if((key_flag)||(!sclk)&&(cnt_bity<6'd32)||(cnt_clk== 3'd3))
sdata <= data[(31-cnt_bity)];
else
sdata <= sdata;
end
endmodule