LMX2571 芯片配置Verliog SPI驱动

前言

本实验使用ZYNQ的PL(FPGA)对LMX2571芯片进行配置,以下连接为相关的原理和软件使用资料。
TICS Pro 配置时钟芯片
文献阅读–Σ-Δ 小数频率合成器原理
LMX2571芯片数据手册

一、LMX2571配置时序分析

1.1 写时序

  LMX2571使用24位寄存器进行编程。一个24位移位寄存器用作临时寄存器,间接地对片上寄存器进行编程。移位寄存器由一个数据字段、一个地址字段和一个读写位组成。MSB是读写位。0表示写寄存器,1表示读寄存器。后面的7位,ADDR[6:0],构成地址字段,用来解码内部寄存器地址。剩下的16位组成数据字段data[15:0]。当LE为低时,串行数据在时钟上升沿上被时钟输入移位寄存器。当LE变高时,数据从数据字段传输到选定的寄存器。
在这里插入图片描述

1.2 读时序

  读时序分为两部分写地址和读数据。先设R/W位为1,然后写入寄存器地址此时数据字段的内容将被忽略。然后从第9个时钟周期开始,将输出回读串行数据
在这里插入图片描述

二、LMX2571配置

2.1 软件生成配置信息

参考该文章可以完成配置:TICS Pro 配置时钟芯片
这里就写几个注意事项:不管是什么芯片,寄存器的功能一定要了解清楚特别是一些功能设置的寄存器。
例如:LMX2571的R42是一个锁定模式寄存器,锁定模式下MUXout变为锁定指示,1为锁定频率,0为未锁定。此时读寄存器是没有用的。还有R7-R8的输出接口的选择配置等等一定要和自己的设计对上。

2.2 初始化流程

  1. 向器件供电,并确保Vcc引脚处于适当的电平。
  2. 如果CE为LOW,则拉高。
  3. 等待100µs,使内部ldo稳定。
  4. 确保对OSCin引脚应用了有效的引用。
  5. 程序寄存器R0复位=1。这将确保所有寄存器被重置为其默认值。
  6. 程序在顺序寄存器R60, R58, R53,…,R1,然后R0。

2.3 SPI时序代码

写数据

  不论是读还写核心代码就是按照手册的时序输出数据,一个简单的SPI时序。以下代码片段为输出24位数据的代码,1位数据使用4个system_clk进行设置。

//开始发送数据
      state_sent:
         if( i >= 7'd1 ) begin
             case(clkcnt)
                 0: //写使能
                    begin
                       PLL_LE<=0;
                       PLL_SCK<=0;
                       clkcnt<=clkcnt+1'b1;
                       PLL_SD<=Reg2571[cnt][23];
                    end
                  1: //输出数据
                    begin                                     
                       Reg2571[cnt]<=Reg2571[cnt]<<1;
                       clkcnt<=clkcnt+1'b1;                                      
                    end
                  2: //保持数据
                    begin
                       PLL_SCK<=1;
                       clkcnt<=clkcnt+1'b1;
                    end
                  3:  
                  	begin
                       i<=i-1'b1;
                       clkcnt<=8'd0;
                    end
                  default: 
                    PLL_SCK<=PLL_SCK;
              endcase
        	end
        else if( i == 7'd0 ) state<=state_start;

在这里插入图片描述

读数据

  读代码也类似,只不过是先写地址再读。

         //读取寄存器
                state_rdata:
                   if( i >= 7'd17 ) begin  //设置读取的寄存器地址
                       case(clkcnt)
                          0: //写使能
                             begin
                                PLL_LE<=0;
                                PLL_SCK<=0;
                                clkcnt<=clkcnt+1'b1;
                                PLL_SD<=Reg2571adr[7];
                                Reg2571Rdata[i-1]<= Reg2571adr[7]; 
                            end
                          1: //输出数据
                             begin                              
                                Reg2571adr<=Reg2571adr<<1;
                                clkcnt<=clkcnt+1'b1;                                      
                             end
                          2:  
                              begin
                                PLL_SCK<=1;
                                clkcnt<=clkcnt+1'b1;
                              end
                          3:  begin
                              i<=i-1'b1;
                              clkcnt<=8'd0;
                              end
                          default: PLL_SCK<=PLL_SCK;
                      endcase
                   end
                   else if( i >=7'd1 && i<=7'd16 ) begin //接收读出的数据
                       case(clkcnt)
                           0: //写使能
                             begin
                                PLL_SCK<=0;
                                clkcnt<=clkcnt+1'b1;
                            end
                          1:  clkcnt<=clkcnt+1'b1;                               
                          2:  
                              begin
                                PLL_SCK<=1;
                                Reg2571Rdata[i-1]<=PLL_MUXO;//读数据记录
                                clkcnt<=clkcnt+1'b1;
                              end
                          3:  
                              begin
                                i<=i-1'b1;
                                clkcnt<=8'd0;
                              end
                          default: PLL_SCK<=PLL_SCK;
                       endcase   
                  end 

2.3 芯片配置代码

  整体代码就是对读写代码的使用,因为涉及到其他不可公开的信息,展示代码并且以图例说明以下配置代码。整个程序分为 state_init,state_reset,state_start,state_delay,state_sent,state_rdata–六个状态。

  1. state_init :初始化配置寄存器
  2. state_reset :R0的复位设置,复位所有寄存器
  3. state_start :依次配置寄存器R60–R0
  4. state_delay:每个寄存器配置完成后的延时
  5. state_sent :每个寄存器数据的发送
  6. state_rdata: 每个寄存器数据的接收

各状态的跳转顺序如下图,实验中使用的case语句实现不同状态的跳转
在这里插入图片描述

LMX5271配置主要代码

 always @(posedge CLK)begin
        if(!RST_n)
        begin
            PLL_SD<=0;
            PLL_LE<=1;
            PLL_SCK<=0;
            i<=7'd24;
            cnt<=8'd60;//寄存器计数
            delay_cnt<=16'd0;
            Reg2571Rdata<=24'd0;
            Reg2571Rdataout<=24'd0;
            Reg2571adr<=8'd0;
            state<=state_init;
            clkcnt<=8'd0;
        end
        else begin
            case(state)
                //寄存器初始化
                state_init: 
                    begin
                        //----------------------------默认寄存器配置------------------------------------
                        Reg2571Reset<=24'h002082; //R0_reset
                        Reg2571[60]<= 24'h3CA000;
                        //这里依次填入寄存器初始化pei'z 	
                        state<= state_reset;
                     end
                //复位LMX2571寄存器
                state_reset: 
                    begin
                        if( i >= 7'd1 ) begin
                            case(clkcnt)
                                0: //写使能
                                   begin
                                      PLL_LE<=0;
                                      PLL_SCK<=0;
                                      clkcnt<=clkcnt+1'b1;
                                      PLL_SD<=Reg2571Reset[23];
                                  end
                                1: //输出数据
                                   begin                                     
                                      Reg2571Reset<=Reg2571Reset<<1;
                                      clkcnt<=clkcnt+1'b1;                                      
                                   end
                                2: 
                                    begin
                                      PLL_SCK<=1;
                                      clkcnt<=clkcnt+1'b1;
                                    end
                                3: //输出结束 
                                   begin
                                      i<=i-1'b1;
                                      clkcnt<=8'd0;
                                    end
                                default: PLL_SCK<=PLL_SCK;
                            endcase
                        end
                        else if( i == 7'd0 ) begin 
                            PLL_SD<=0;
                            PLL_SCK<=0;
                            PLL_LE<=1;
                            i<=7'd24;
                            cnt<=8'd60;
                            state<=state_delay;
                        end
                    end
                 //开始配置LMX2571寄存器
                state_start: 
                    case(cnt)
                       default: 
                            if( i == 7'd24 ) begin  
                               state<=state_sent;
                            end
                            else if( i == 7'd0 ) begin  //切换寄存器
                                PLL_SD<=0;
                                PLL_LE<=1;
                                PLL_SCK<=0;
                                i<=7'd24;
                                if(cnt==0) cnt=61; //切换至读寄存器,锁定模式下读不出
                                else cnt<=cnt-1'b1; 
                                state<=state_delay;
                           end 
                        //代码和default类似注意跳转即可
                        39,40,41,42:;
                        46,47:;
                        53,58:;
                        60:;  
                    endcase
                //开始发送数据
                state_sent:;
                //写入后的延时clk*10
                state_delay: 
                    if(delay_cnt<10) delay_cnt<=delay_cnt+1'b1; 
                    else begin
                       if(cnt==61) 
                            begin //读寄存器数据
                                    state<= state_rdata;
                                    Reg2571adr<=Regadr;
                            end  
                       else
                            begin  //写寄存器数据
                                   state<=state_start;
                            end  
                       delay_cnt<=16'd0;
                    end          
                //读取寄存器
                state_rdata:;
               default:begin
                    PLL_SD<=0;
                    PLL_LE<=1;
               end
            endcase

三、实验结果

60个寄存器依次设置
在这里插入图片描述
示波器观测时序
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/276897.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

什么是高并发系统?

1.1 什么是高并发&#xff1f; 高并发&#xff08;High Concurrency&#xff09;&#xff0c;通常是指通过设计保证系统能够同时处理很多请求。即在同一个时间点&#xff0c;有很多的请求同时访问同一个接口。高并发意味着大流量&#xff0c;需要运用技术手段去抵抗这种大流量…

LeetCode刷题--- 解数独

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 ​​​​​​http://t.csdnimg.cn/6AbpV 数据结构与算法 ​​​​​http://t.csdnimg.cn/hKh2l 前言&#xff1a;这个专栏主…

【Vue2+3入门到实战】(10)Vue基础之一文掌握 组件通信 详细示例(组件通信语法、父传子 、 子传父、非父子通信)

这里写自定义目录标题 一、学习目标1.组件通信2.综合案例&#xff1a;小黑记事本&#xff08;组件版&#xff09; 二、组件通信1.什么是组件通信&#xff1f;2.组件之间如何通信3.组件关系分类4.通信解决方案5.父子通信流程6.父向子通信代码示例7.子向父通信代码示例8.总结 三、…

易趋产品升级(EasyTrack 11_V1.3) | 集成飞书、WPS、个性化设置,增强团队协作和用户体验

企业在项目管理过程中&#xff0c;经常会遇到项目信息同步不及时、沟通障碍以及管理软件使用不便捷等难题&#xff0c;导致团队协作效率低下。这种情况下&#xff0c;如果使用了多个办公软件&#xff08;如&#xff1a;钉钉、企业微信、项目管理软件等&#xff09;&#xff0c;…

AIGC盛行,带你轻松调用开发

文章目录 前言一、&#x1f4d6;AIGC简介二、&#x1f4e3;开通体验开通模型获取API-KEY 三、&#x1f4dd;基于java实现调用1.设置API-KEY2.体验大语言模型多轮对话演示补充流式输出 3.体验通义千问VL使用官方提供照片本地文件多轮对话流式输出 总结 前言 本篇文章基于java和…

IPv4归属地信息查询方法与应用

IPv4地址归属地信息查询是网络管理和安全领域的关键工具。本文将介绍IPv4地址的概念&#xff0c;探讨IPv4归属地信息的重要性&#xff0c;并详细介绍几种查询IPv4归属地信息的方法以及其应用场景。 第一部分&#xff1a;IPv4地址简介 1.1 什么是IPv4地址 IPv4&#xff08;In…

CGAL的形状规则化

规则化之前&#xff08;红色&#xff09;和之后&#xff08;绿色&#xff09;的闭合轮廓。 1、介绍 这个 CGAL包能够规范2D中的一组线段和开闭轮廓以及3D中的一组平面&#xff0c;以便所有输入对象根据用户指定的条件进行旋转和对齐。此外&#xff0c;我们提供了一个全局规范框…

旧衣回收小程序搭建,稳占回收市场

近几年我国大众的消费水平不断提升&#xff0c;闲置物品也相应增加了不少&#xff0c;尤其是闲置衣服&#xff0c;为了减少资源浪费&#xff0c;旧衣服回收回收行业受到了大众的关注。 目前我国旧衣服回收行业的市场规模达到了300多亿元&#xff0c;旧衣回收行业的商业价值非常…

跨模态检索论文阅读:Plug-and-Play Regulators for Image-Text Matching用于图像文本匹配的即插即用调节器

Plug-and-Play Regulators for Image-Text Matching用于图像文本匹配的即插即用调节器 利用细粒度的对应关系和视觉语义比对在图像-文本匹配中显示出巨大的潜力。通常&#xff0c;最近的方法首先使用跨模态注意力单元来捕捉潜在的区域-单词交互&#xff0c;然后整合所有比对以获…

椭圆中点算法

原理 椭圆的扫描转换与圆的扫描转换有相似之处&#xff0c;但也有不同&#xff0c;主要区别是椭圆弧上存在改变主位移方向的临界点。瞬时针绘制四分椭圆弧的中点算法&#xff0c;根据对称性可以绘制完整的椭圆。 四分椭圆弧 中心在原点&#xff0c;长半轴为 a a a、短半轴为…

diffusion model (十) anydoor技术小结

paperAnyDoor: Zero-shot Object-level Image Customizationcodehttps://github.com/damo-vilab/AnyDoorOrg香港大学&#xff0c;Alibaba Groupdate2023-07 1 Motivation 过去我们用dreambooth&#xff0c;LORA&#xff0c;textual inversion等方法做定制目标生成。但这个方法…

liunx系统突然不能启动jar

启动命令 nohup java -jar /date/gd_ly/jar/mssda-platform-backend-0.0.1-SNAPSHOT.jar -Dspring.config.location/date/gd_ly/jar/application-dev.yml 报错信息 Error: A JNI error has occurred, please check your installation and try again Exception in thread &q…

2022年全球软件质量效能大会(QECon北京站2022)-核心PPT资料下载

一、峰会简介 当前&#xff0c;新一轮科技革命和产业变革正在重塑全球经济格局&#xff0c;以云计算为代表的新一代信息技术创新活跃&#xff0c;与实体经济深度融合&#xff0c;推动泛在连接、数据驱动、智能引领的数字经济新形式孕育而生。 新兴技术的出现给测试乃至整个软…

CSS 纵向扩展动画

上干货 <template><!-- mouseenter"startAnimation" 表示在鼠标进入元素时触发 startAnimation 方法。mouseleave"stopAnimation" 表示在鼠标离开元素时触发 stopAnimation 方法。 --><!-- 容器元素 --><div class"container&q…

HCIA-Datacom题库(自己整理分类的)——OSPF协议判断

1.路由表中某条路由信息的Proto为OSPF则此路由的优先级一定为10。√ 2.如果网络管理员没有配置骨干区域,则路由器会自动创建骨干区域&#xff1f; 路由表中某条路由信息的Proto为OSPF&#xff0c;则此路由的优先级一定为10。 当两台OSPF路由器形成2-WAY邻居关系时&#xff0…

Arduino串口发送接收和串口中断事件

目录 一、硬件介绍 1、控制器 2、TTL转USB串口 二、软件程序 1、单片机发送字符串 &#xff08;1&#xff09;每个串口对应的类名称介绍 &#xff08;2&#xff09;发送功能 &#xff08;3&#xff09;代码 &#xff08;4&#xff09;测试 2、单片机接收字符串 &…

【 YOLOv5】目标检测 YOLOv5 开源代码项目调试与讲解实战(3)-训练yolov5模型(本地)

训练yolov5模型&#xff08;本地&#xff09; 训练文件 train.py训练如下图 一些参数的设置weights:对于weight参数&#xff0c;可以往Default参数中填入的参数有 cfg&#xff1a;&#xff08;缩写&#xff09;cfg参数可以选择的网络模型 data对于data hyp 超参数epochs 训练多…

全新ui自动化测试框架教学——Cypress

前言 在现阶段自动化测试领域大规模普及的是selenium及appium等常规自动化测试工具&#xff0c;但在其中会有遇到很多影响因素导致测试结果不理想和不准确的情况发生。在经过Darren洋对自动化测试工具调研后&#xff0c;发现了Cypress这一款针对端到端的自动化测试工具&#xf…

【Python基础】字符串

文章目录 [toc]什么是字符串索引示例索引越界 切片语法示例 字符串方法find()方法rfind()方法count()方法replace()方法 个人主页&#xff1a;丷从心 系列专栏&#xff1a;Python基础 什么是字符串 如下定义的变量url存储的是字符串类型的值 url www.baidu.com print(url)u…

【银行测试】金融银行-理财项目面试/分析总结(二)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 银行理财相关的项…