JoiJOm 2024-01-10 16:57 采纳率: 0%
浏览 42
已结题

FPGA利用ADF4351生成150MHz的正弦信号输出和预设置的不一样

板载晶振为100MHz,设置的R分频器的R为200,INT为2400,RFdivider为8,D=T=FRAC=0,设置的频率输出为150MHz,但是实际生成的频率为270多MHz,且上下跳动,muxout输出的应该是0.5MHz的经过R分频之后的检相频率,但是接到示波器显示输出100Mhz的板载晶振频率。

img

img

img

img

img

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    

img

  • 写回答

6条回答 默认 最新

  • GISer Liu 2024-01-10 17:37
    关注

    以下答案参考自GPT-4,由博主GIS_Liu编写:

    根据您的描述和提供的代码段,您在使用FPGA控制ADF4351生成150MHz的正弦信号时遇到了问题。您设置的输出频率为150MHz,但实际生成的频率为270多MHz,并且频率有上下波动。同时,您观察到MUXOUT输出的检相频率应为0.5MHz,但示波器显示为100MHz的板载晶振频率。

    为解决这个问题,您需要检查以下几个方面:

    1. 寄存器配置值:确保您的ADF4351寄存器配置值正确无误。ADF4351有六个32位的寄存器(0到5),用于设置输出频率、相位差、输出功率等参数【12†source】【13†source】。配置不当可能导致输出频率不准确。您可以使用提供的配置方法,通过FPGA将正确的参数写入到ADF4351的寄存器中【12†source】。

    2. 时钟信号和时序要求:检查您的FPGA是否提供了正确的时钟信号给ADF4351,并确保所有的时序要求都满足ADF4351的数据手册规定。时序参数包括LE建立时间、DATA到CLK的建立和保持时间、CLK的高低电平持续时间等【12†source】【13†source】。

    3. SPI通信的状态机:确认状态机的设计逻辑正确,例如,是否正确地在每次写入操作后进入WAIT状态,并在适当的时间后再次触发WRITE状态【12†source】。

    4. 硬件连接和信号完整性:确认FPGA和ADF4351之间的硬件连接正确,没有接触不良或信号干扰问题。信号的完整性也很重要,时钟信号或数据信号的干扰和反射可能导致通信错误。

    5. 仿真和测试:通过编写测试固件文件对HDL代码进行仿真,确认生成的时序波形是否符合预期【13†source】。

    6. 代码调试和修改:根据仿真结果对代码进行调试和必要的修改。下面是一些代码段示例,这些代码段实现了时钟脉冲计数器、状态机逻辑、寄存器计数器等功能【14†source】。您需要根据自己的设计需求和ADF4351的数据手册来调整和优化这些代码。

    7. 详细的硬件手册和相关文档:如果在进行上述步骤后问题仍未解决,建议参考ADF4351的详细硬件手册和相关文档,可能有必要对您的设计方案进行更深入的分析和调整【14†source】。

    请记住,在实际的硬件环境中测试和验证代码修改后的行为非常重要,仅仅依靠仿真可能不足以发现所有的问题。如果您在测试过程中遇到困难,建议联系有经验的工程师或者从相关技术论坛和社区寻求帮助。

    如果您的问题得到解决,我会非常高兴。同时,如果您觉得我的回答对您有帮助并能解决您的问题,请不要忘记给予奖励。祝您项目顺利!

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 1月10日
  • 修改了问题 1月10日
  • 修改了问题 1月10日
  • 修改了问题 1月10日
  • 展开全部

悬赏问题

  • ¥30 正则表达式的一些问题
  • ¥15 C#如何使用ClosedXML库搭配别的库实现:将指定Excel区域导出为图片(例如A1:AO50)
  • ¥15 虚拟机只能接收不能发送
  • ¥15 为什么echarts极坐标柱形图的图形显示的特别小呢
  • ¥20 网络科学导论,网络同步与控制
  • ¥50 arcpy将数据库要素类添加到图层组以及创建要素收藏夹如何创建文件夹并将模板中的符号添加到文件夹中
  • ¥15 我的住宅ip和vps的地址都是法国 可是在whoer里面一直查询我的位置是美国 这种ip不符合是什么问题导致的 怎么解决 手机电脑换电脑用whoer查询都是美国 用别的查询都是在法国
  • ¥15 关于游戏验证码滑块问题
  • ¥15 R语言中安装bibliometrix 后运行biblioshiny出现问题
  • ¥20 关于#android#的问题:用开发助手发现找不到控件(autojs)