LMX2571 芯片配置Verliog SPI驱动

news2024/11/28 17:49:17

前言

本实验使用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个寄存器依次设置
在这里插入图片描述
示波器观测时序
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Codeforces Round 918 (Div. 4)(AK)

A、模拟 B、模拟 C、模拟 D、模拟 E、思维&#xff0c;前缀和 F、思维、逆序对 G、最短路 A - Odd One Out 题意&#xff1a;给定三个数字&#xff0c;有两个相同&#xff0c;输出那个不同的数字。 直接傻瓜写法 void solve() {int a , b , c;cin >> a >>…

机器学习 -- 数据预处理

系列文章目录 未完待续…… 目录 系列文章目录 前言 一、数值分析简介 二、内容 前言 tips&#xff1a;这里只是总结&#xff0c;不是教程哈。 以下内容仅为暂定&#xff0c;因为我还没找到一个好的&#xff0c;让小白&#xff08;我自己&#xff09;也能容易理解&#x…

Java线上问题排查思路

1、Java 服务常见问题 Java 服务的线上问题从系统表象来看大致可分成两大类: 系统环境异常、业务服务异常。 系统环境异常&#xff1a;主要从CPU、内存、磁盘、网络四个方面考虑。比如&#xff1a;CPU 占用率过高、CPU 上下文切换频率次数较高、系统可用内存长期处于较低值、…

工业产线看板的智能化应用

在数字化浪潮兴起之前&#xff0c;许多制造企业主要依赖手工生产和传统的生产管理方法&#xff0c;生产数据的收集和分析主要依赖于人工&#xff0c;导致信息传递滞后、生产过程不透明&#xff0c;难以及时调整生产计划。在传统的生产环境中&#xff0c;生产过程的各个环节缺乏…

留言板(Mybatis连接数据库版)

目录 1.添加Mybatis和SQL的依赖 2.建立数据库和需要的表 3.对应表中的字段&#xff0c;补充Java对象 4.对代码进行逻辑分层 5.后端逻辑代码 之前的项目实例【基于Spring MVC的前后端交互案例及应用分层的实现】https://blog.csdn.net/weixin_67793092/article/details/134…

K8S结合Prometheus构建监控系统

一、Prometheus简介 Prometheus 是一个开源的系统监控和警报工具&#xff0c;用于收集、存储和查询时间序列数据。它专注于监控应用程序和基础设施的性能和状态&#xff0c;并提供丰富的查询语言和灵活的告警机制1、Prometheus基本介绍 数据模型&#xff1a;Prometheus 使用时…

Spring Boot笔记1

1. SpringBoot简介 1.1. 原有Spring优缺点分析 1.1.1. Spring的优点分析 Spring是Java企业版&#xff08;Java Enterprise Edition&#xff0c;javeEE&#xff09;的轻量级代替品。无需开发重量级的Enterprise JavaBean&#xff08;EJB&#xff09;&#xff0c;Spring为企业…

20231227在Firefly的AIO-3399J开发板的Android11的挖掘机的DTS配置单后摄像头ov13850

20231227在Firefly的AIO-3399J开发板的Android11的挖掘机的DTS配置单后摄像头ov13850 2023/12/27 18:40 1、简略步骤&#xff1a; rootrootrootroot-X99-Turbo:~/3TB$ cat Android11.0.tar.bz2.a* > Android11.0.tar.bz2 rootrootrootroot-X99-Turbo:~/3TB$ tar jxvf Androi…

阿里云30个公共云地域、89个可用区、5个金融云和政务云地域

阿里云基础设施目前已面向全球四大洲&#xff0c;公共云地域开服运营30个公共云地域、89个可用区&#xff0c;此外还拥有5个金融云、政务云地域&#xff0c;并且致力于持续的新地域规划和建设&#xff0c;从而更好的满足用户多样化的业务和场景需求。伴随着基础设施的加速投入和…

ARM CCA机密计算软件架构之内存加密上下文(MEC)

内存加密上下文(MEC) 内存加密上下文是与内存区域相关联的加密配置,由MMU分配。 MEC是Arm Realm Management Extension(RME)的扩展。RME系统架构要求对Realm、Secure和Root PAS进行加密。用于每个PAS的加密密钥、调整或加密上下文在该PAS内是全局的。例如,对于Realm PA…

Kubernetes 学习总结(41)—— 云原生容器网络详解

背景 随着网络技术的发展&#xff0c;网络的虚拟化程度越来越高&#xff0c;特别是云原生网络&#xff0c;叠加了物理网络、虚机网络和容器网络&#xff0c;数据包在网络 OSI 七层网络模型、TCP/IP 五层网络模型的不同网络层进行封包、转发和解包。网络数据包跨主机网络、容器…

12.28网络流,残留网络,增广路,最大流最小割定理

网络流 概念 是指在一个每条边都有容量的有向图分配流&#xff0c;使一条边的流量不会超过它的容量。通常在运筹学中&#xff0c;有向图称为网络。顶点称为节点而边称为弧。一道流必须匹配一个结点的进出的流量相同的限制&#xff0c;除非这是一个源点──有较多向外的流&…

【2023年中国高校大数据挑战赛 】赛题 B DNA 存储中的序列聚类与比对 Python实现

【2023年中国高校大数据挑战赛 】赛题 B DNA 存储中的序列聚类与比对 Python实现 1 题目 赛题 B DNA 存储中的序列聚类与比对 近年来&#xff0c;随着新互联网设备的大量涌入和对其服务需求的指数级增长&#xff0c;越来越多的数据信息被产生与收集。预计到 2021 年&#xf…

AI-ChatGPTCopilot

ChatGPT chatGPT免费网站列表&#xff1a;GitHub - LiLittleCat/awesome-free-chatgpt: &#x1f193;免费的 ChatGPT 镜像网站列表&#xff0c;持续更新。List of free ChatGPT mirror sites, continuously updated. Copilot 智能生成代码工具 安装步骤 - 登录 github&am…

Unity Shader 实现X光效果

Unity Shader 实现X光效果 Unity Shader 实现实物遮挡外轮廓发光效果第五人格黎明杀机火炬之光 实现方案操作实现立体感优化总结源码 Unity Shader 实现实物遮挡外轮廓发光效果 之前看过《火炬之光》、《黎明杀机》、《第五人格》等不少的游戏里面人物被建筑物遮挡呈现出不同的…

SpingBoot的项目实战--模拟电商【2.登录】

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于SpringBoot电商项目的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.功能需求 二.代码编写 …

3D展2D数学原理

今年早些时候&#xff0c;我为 MAKE 杂志写了一篇教程&#xff0c;介绍如何制作视频游戏角色的毛绒动物。 该技术采用给定的角色 3D 模型及其纹理&#xff0c;并以编程方式生成缝纫图案。 虽然我已经编写了一般摘要并将源代码上传到 GitHub&#xff0c;但我在这里编写了对使这一…

新版ONENET的物联网环境调节系统(esp32+onenet+微信小程序)

新版ONENET的物联网环境调节系统&#xff08;esp32onenet微信小程序&#xff09; 好久没用onenet突然发现它大更新了&#xff0c;现在都是使用新版的物联网开放平台&#xff0c;只有老用户还有老版的多协议接入&#xff0c;新用户是没有的&#xff0c;所以我顺便更新一下新的开…

百度CTO王海峰:文心一言用户规模破1亿

“文心一言用户规模突破1亿。”12月28日&#xff0c;百度首席技术官、深度学习技术及应用国家工程研究中心主任王海峰在第十届WAVE SUMMIT深度学习开发者大会上宣布。会上&#xff0c;王海峰以《文心加飞桨&#xff0c;翩然赴星河》为题作了主旨演讲&#xff0c;分享了飞桨和文…

微软为 Android 用户推出了人工智能助手 Copilot 应用程序

微软为 Android 用户推出了人工智能助手 Copilot 应用程序 - 与 ChatGPT 类似&#xff0c;它包括聊天机器人功能和 DALL-E 3 图像生成 - 该应用程序包括免费访问 OpenAI 的 GPT-4 模型&#xff0c;这是 ChatGPT 中的付费功能 - 发布微软将 Bing Chat 更名为 Copilot 您是否尝试…