【ADF4351】使用FPGA进行SPI寄存器配置、使用FPGA计算各个频率的频点,ADF4351配置程序

简介

特性

输出频率范围:35 MHz至4,400 MHz

小数N分频频率合成器和整数N分频频率合成器

具有低相位噪声的VCO

可编程的1/2/4/8/16/32/64分频输出

典型抖动:0.3 ps rms

EVM(典型值,2.1 GHz): 0.4%

电源:3.0 V至3.6 V

逻辑兼容性: 1.8 V

可编程双模预分频器:4/5或8/9

可编程的输出功率

RF输出静音功能

三线式串行接口

模拟和数字锁定检测

在宽带宽内快速锁定模式

周跳减少

应用

无线基础设施(W-CDMA、TD-SCDMA、WiMAX、GSM、

PCS、DCS、DECT)

测试设备

无线局域网(LAN)、有线电视设备

时钟产生

简介

ADF4351结合外部环路滤波器和外部参考频率使用时,可实现小数N分频或整数N分频锁相环(PLL)频率合成器。

ADF4351具有一个集成电压控制振荡器(VCO),其基波输出频率范围为2200 MHz至4400 MHz。此外,利用1/2/4/8/ 16/32/64分频电路,用户可以产生低至35 MHz的RF输出频率。对于要求隔离的应用,RF输出级可以实现静音。静音功能既可以通过引脚控制,也可以通过软件控制。同时提供辅助RF输出,且不用时可以关断。

所有片内寄存器均通过简单的三线式接口进行控制。该器件采用3.0 V至3.6 V电源供电,不用时可以关断。

功能图

芯片引脚说明

芯片引脚图



SPI 时序配置寄存器



c 复制代码
module spi_adf4351(
    input wire clk,  // 主时钟信号
    input wire reset,  // 复位信号
    input wire [31:0] data_in,  // 要发送的数据
    input wire start,  // 开始发送信号
    output reg sclk,  // SPI时钟
    output reg sdata,  // SPI数据
    output reg enx,  // SPI片选
    output reg done  // 数据发送完成信号
);

// 状态定义
localparam IDLE = 3'b000,
           START = 3'b001,
           SHIFT = 3'b010,
           WAIT = 3'b011,
           STOP = 3'b100;

reg [2:0] state = IDLE;  // 当前状态
reg [2:0] next_state;  // 下一个状态
reg [31:0] shift_reg;  // 移位寄存器
reg [5:0] bit_cnt;  // 位计数器
reg [7:0] wait_cnt;  // 等待计数器,用于产生延时

always @(posedge clk or posedge reset) begin
    if (reset) begin
        state <= IDLE;
    end else begin
        state <= next_state;
    end
end

always @(state or start or bit_cnt or wait_cnt) begin
    case (state)
        IDLE: begin
            if (start) next_state = START;
            else next_state = IDLE;
        end
        START: begin
            next_state = SHIFT;
        end
        SHIFT: begin
            if (bit_cnt == 32) next_state = STOP;
            else next_state = WAIT;
        end
        WAIT: begin
            if (wait_cnt == 100) next_state = SHIFT;
            else next_state = WAIT;
        end
        STOP: begin
            next_state = IDLE;
        end
        default: next_state = IDLE;
    endcase
end

always @(posedge clk) begin
    case (state)
        IDLE: begin
            sclk <= 0;
            enx <= 1;
            done <= 0;
            bit_cnt <= 0;
            wait_cnt <= 0;
        end
        START: begin
            shift_reg <= data_in;
            enx <= 0;
        end
        SHIFT: begin
            sdata <= shift_reg[31];
            shift_reg <= shift_reg << 1;
            sclk <= 1;
            bit_cnt <= bit_cnt + 1;
            wait_cnt <= 0;
        end
        WAIT: begin
            wait_cnt <= wait_cnt + 1;
            sclk <= 0;
        end
        STOP: begin
            enx <= 1;
            done <= 1;
        end
    endcase
end

endmodule

测试

c 复制代码
`timescale 1ns / 1ns

module spi_adf4351_tb;

reg clk_tb;
reg reset_tb;
reg start_tb;
reg [31:0] data_in_tb;
wire sclk_tb;
wire sdata_tb;
wire enx_tb;
wire done_tb;

// 实例化spi_adf4351模块
spi_adf4351 DUT (
    .clk(clk_tb),
    .reset(reset_tb),
    .data_in(data_in_tb),
    .start(start_tb),
    .sclk(sclk_tb),
    .sdata(sdata_tb),
    .enx(enx_tb),
    .done(done_tb)
);

// 生成时钟信号
initial begin
    clk_tb=0;
    forever #5 clk_tb=~clk_tb;// 假设系统时钟为100MHz
end

initial begin
    data_in_tb = 32'hA5A5A5A5; // 测试数据,可以根据需要修改
    reset_tb = 1;
    start_tb = 0;
    #20 reset_tb=0;
    #35 start_tb=1;
    #10 start_tb=0;
end




endmodule

频率FPGA 计算

原理

INT、FRAC、MOD与R分频器的关系

利用INT、FRAC和MOD的值以及R分频器,可以产生间隔为PFD频率的分数的输出频率。

R分频器

利用10位R分频器,可以细分输入参考频率(REFIN)以产生PFD的参考时钟。分频比可以为1至1023。

寄存器映射

REGISTER 0


REGISTER 1


REGISTER 2


REGISTER 3


REGISTER 4


REGISTER 5


寄存器初始化序列

初始上电时,对电源引脚施加正确的电压后,ADF4351寄存器应按以下顺序启动:

  1. 寄存器5
  2. 寄存器4
  3. 寄存器3
  4. 寄存器2
  5. 寄存器1
  6. 寄存器0

FPGA 根据频率计算寄存器数值

输入频率:4400M到35M

c 复制代码
module adf4351_LUT_freq(

    );
reg ad9361_l_clk,rst;   

initial begin
    ad9361_l_clk=0;
    forever #12.5 ad9361_l_clk=~ad9361_l_clk;
end
initial begin
    rst=1;
    #25 rst=0;
end

reg [15:0] freq;

always @ (posedge ad9361_l_clk or posedge rst)
begin
    if(rst)
    begin
    freq <= 16'd130;
    end
    
    else if(freq < 16'd4400)
    begin
    freq <= freq + 1'b1;
    end
    
    else 
    begin
    freq <= freq;
    end
end

wire [31:0] reg0,reg1,reg2,reg3,reg4,reg5;

adf4351_reg_lut LUT(
    .clk_40(ad9361_l_clk),
    .rst(rst),
    .frequency(freq),
    
    .reg0(reg0),
    .reg1(reg1),
    .reg2(reg2),
    .reg3(reg3),
    .reg4(reg4),
    .reg5(reg5)
);
相关推荐
乌恩大侠1 小时前
O-RAN Fronthual CU/Sync/Mgmt 平面和协议栈
5g·平面·fpga开发·架构
DS小龙哥15 小时前
基于Zynq FPGA的雷龙SD NAND存储芯片性能测试
fpga开发·sd nand·雷龙·spi nand·spi nand flash·工业级tf卡·嵌入式tf卡
上理考研周导师1 天前
第二章 虚拟仪器及其构成原理
fpga开发
FPGA技术实战1 天前
《探索Zynq MPSoC》学习笔记(二)
fpga开发·mpsoc
bigbig猩猩2 天前
FPGA(现场可编程门阵列)的时序分析
fpga开发
Terasic友晶科技2 天前
第2篇 使用Intel FPGA Monitor Program创建基于ARM处理器的汇编或C语言工程<二>
fpga开发·汇编语言和c语言
码农阿豪2 天前
基于Zynq FPGA对雷龙SD NAND的测试
fpga开发·sd nand·spi nand·spi nand flash·工业级tf卡·嵌入式tf卡
江山如画,佳人北望2 天前
EDA技术简介
fpga开发
淘晶驰AK2 天前
电子设计竞赛准备经历分享
嵌入式硬件·fpga开发