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 ) begincase(clkcnt)0: //写使能beginPLL_LE<=0;PLL_SCK<=0;clkcnt<=clkcnt+1'b1;PLL_SD<=Reg2571[cnt][23];end1: //输出数据begin                                     Reg2571[cnt]<=Reg2571[cnt]<<1;clkcnt<=clkcnt+1'b1;                                      end2: //保持数据beginPLL_SCK<=1;clkcnt<=clkcnt+1'b1;end3:  begini<=i-1'b1;clkcnt<=8'd0;enddefault: PLL_SCK<=PLL_SCK;endcaseendelse if( i == 7'd0 ) state<=state_start;

在这里插入图片描述

读数据

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

         //读取寄存器state_rdata:if( i >= 7'd17 ) begin  //设置读取的寄存器地址case(clkcnt)0: //写使能beginPLL_LE<=0;PLL_SCK<=0;clkcnt<=clkcnt+1'b1;PLL_SD<=Reg2571adr[7];Reg2571Rdata[i-1]<= Reg2571adr[7]; end1: //输出数据begin                              Reg2571adr<=Reg2571adr<<1;clkcnt<=clkcnt+1'b1;                                      end2:  beginPLL_SCK<=1;clkcnt<=clkcnt+1'b1;end3:  begini<=i-1'b1;clkcnt<=8'd0;enddefault: PLL_SCK<=PLL_SCK;endcaseendelse if( i >=7'd1 && i<=7'd16 ) begin //接收读出的数据case(clkcnt)0: //写使能beginPLL_SCK<=0;clkcnt<=clkcnt+1'b1;end1:  clkcnt<=clkcnt+1'b1;                               2:  beginPLL_SCK<=1;Reg2571Rdata[i-1]<=PLL_MUXO;//读数据记录clkcnt<=clkcnt+1'b1;end3:  begini<=i-1'b1;clkcnt<=8'd0;enddefault: 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)beginif(!RST_n)beginPLL_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;endelse begincase(state)//寄存器初始化state_init: begin//----------------------------默认寄存器配置------------------------------------Reg2571Reset<=24'h002082; //R0_resetReg2571[60]<= 24'h3CA000;//这里依次填入寄存器初始化pei'z 	state<= state_reset;end//复位LMX2571寄存器state_reset: beginif( i >= 7'd1 ) begincase(clkcnt)0: //写使能beginPLL_LE<=0;PLL_SCK<=0;clkcnt<=clkcnt+1'b1;PLL_SD<=Reg2571Reset[23];end1: //输出数据begin                                     Reg2571Reset<=Reg2571Reset<<1;clkcnt<=clkcnt+1'b1;                                      end2: beginPLL_SCK<=1;clkcnt<=clkcnt+1'b1;end3: //输出结束 begini<=i-1'b1;clkcnt<=8'd0;enddefault: PLL_SCK<=PLL_SCK;endcaseendelse if( i == 7'd0 ) begin PLL_SD<=0;PLL_SCK<=0;PLL_LE<=1;i<=7'd24;cnt<=8'd60;state<=state_delay;endend//开始配置LMX2571寄存器state_start: case(cnt)default: if( i == 7'd24 ) begin  state<=state_sent;endelse 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*10state_delay: if(delay_cnt<10) delay_cnt<=delay_cnt+1'b1; else beginif(cnt==61) begin //读寄存器数据state<= state_rdata;Reg2571adr<=Regadr;end  elsebegin  //写寄存器数据state<=state_start;end  delay_cnt<=16'd0;end          //读取寄存器state_rdata:;default:beginPLL_SD<=0;PLL_LE<=1;endendcase

三、实验结果

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

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

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

相关文章

CSS去掉按钮阴影 | css去掉按钮边框 | 注意改变搜索的关键词、搜索方式

上图是在谷歌浏览器中运行的结果 button {box-shadow: none;height: 50px;width: 100px;background-color: white;border-color: white; }写了以上的css&#xff0c;发现按钮还是有阴影一样的东西&#xff0c;查阅网络资料的时候也一直在搜索“如何去掉按钮阴影”&#xff0c;…

计算数组中某一数字出现次数

计算数组中某一数字出现次数 思路实现普通数组的方法双向列表的方法 总结 思路 这个比较简单&#xff0c;思路其实就是遍历数组中所有的数字做一下对比&#xff0c;有的话记录一下即可。但是这几天看到了个双向列表LinkList的方法&#xff0c;所以拿出来做一下对比看看。 实现…

网站提示“不安全”怎么解决

在互联网中&#xff0c;安全问题至关重要。访问某些网站时&#xff0c;可能会遇到“不安全”警告&#xff0c;通常是由于缺乏SSL证书。SSL证书是数字证书&#xff0c;用于确保互联网通信的安全和保密。 “不安全”问题通常源于缺少SSL证书。SSL通过加密通信&#xff0c;防止第三…

“2023年的技术发展与个人成长:回顾与展望“

文章目录 每日一句正能量前言工作生活未来展望后记 每日一句正能量 凡事顺其自然&#xff0c;遇事处于泰然&#xff0c;得意之时淡然&#xff0c;失意之时坦然&#xff0c;艰辛曲折必然&#xff0c;历尽沧桑悟然。 前言 在这快速发展的信息时代&#xff0c;技术的进步和创新不…

CSS 向上扩展动画

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

MyBatis标签及其应用示例

MyBatis标签及其应用示例 1. select 1.1 标签属性 id唯一的标识符parameterType传给此语句的参数的全路径名或别名如&#xff1a;com.xxx.xxx.demo.entity.User或userresultType语句返回值类型或别名。如果是集合List&#xff0c;此处填写集合的泛型T&#xff0c;而不是集合…

SCT82630DHKR——5.5V-65V Vin同步降压控制器,可替代LM5145

描述&#xff1a; SCT82630是一款65V电压模式控制同步降压控制器&#xff0c;具有线路前馈。40ns受控高压侧MOSFET的最小导通时间支持高转换比&#xff0c;实现从48V输入到低压轨的直接降压转换&#xff0c;降低了系统复杂性和解决方案成本。如果需要&#xff0c;在低至6V的输…

【MySQL】数据库并发控制:悲观锁与乐观锁的深入解析

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; 数 据 库 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 悲观锁&#xff08;Pessimistic Locking&#xff09;: 乐观锁&#xff08;Optimistic Locking&#xff09;: 总结&#x…

SpringBoot3 应用分析

SpringBoot3-快速入门 1、简介 1. 前置知识 Java17Spring、SpringMVC、MyBatisMaven、IDEA 2. 环境要求 环境&工具版本&#xff08;or later&#xff09;SpringBoot3.0.5IDEA2021.2.1Java17Maven3.5Tomcat10.0Servlet5.0GraalVM Community22.3Native Build Tools0.9.1…

<JavaEE> TCP 的通信机制(五) -- 延时应答、捎带应答、面向字节流

目录 TCP的通信机制的核心特性 七、延时应答 1&#xff09;什么是延时应答&#xff1f; 2&#xff09;延时应答的作用 八、捎带应答 1&#xff09;什么是捎带应答&#xff1f; 2&#xff09;捎带应答的作用 九、面向字节流 1&#xff09;沾包问题 2&#xff09;“沾包…

深度学习之RNN

1.循环神经网络 在时间t的时候&#xff0c;对于单个神经元来讲它的输出y(t)如下 wx是对于输入x的权重&#xff0c;wy是对于上一时刻输出的权重 所以循环神经网络有两个权重。 如果有很多这样的神经元并排在一起 则在t时刻的输出y为 这时输入输出都是向量 2.记忆单元 由于循…

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…

【起草】【第五章】定制ChatGPT数字亲人

身为普普通通的我们&#xff0c;不知道亲人们在哪一天就要离开这个世界 &#xff1f; 作为普普通通的程序员&#xff0c;我们可以为我们的亲人做点什么 &#xff1f; 让他们以某种形式留在人世间 ? 对话&#xff5c;6岁女孩病逝捐器官&#xff0c;妈妈&#xff1a;她去当天使…

Qt+Opencv:人脸检测

话接上一篇&#xff0c;我们仍使用在上篇《QtOpencv&#xff1a;Qt中部署opencv》创建的Qt项目来测试opencv提供的sample。 在正式开始本篇之前&#xff0c;我们先说做一下准备工作&#xff1a; 一、opencv官方文档 学习最权威和最可靠的方式&#xff0c;就是阅读官方文档和…

释放资源的方式

为什么要学这个释放资源的方式&#xff1f; //5 关流outputStream.close();inputStream.close();原来这种方式&#xff0c;一般项目都会有很多代码&#xff0c;万一前面的代码有异常&#xff0c;就无法执行到这一步&#xff0c;绑定的系统资源就得不到释放&#xff0c;影响系统…

腾讯云服务器和轻量服务器选哪个好(各自的优势区别)

腾讯云轻量服务器和云服务器CVM该怎么选&#xff1f;不差钱选云服务器CVM&#xff0c;追求性价比选择轻量应用服务器&#xff0c;轻量真优惠呀&#xff0c;活动 https://curl.qcloud.com/oRMoSucP 轻量应用服务器2核2G3M价格62元一年、2核2G4M价格118元一年&#xff0c;540元三…

CGAL的形状规则化

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

linux cuda环境搭建

1&#xff0c;检查驱动是否安装 运行nvidia-smi&#xff0c;如果出现如下界面&#xff0c;说明驱动已经安装 记住cuda版本号 2&#xff0c;安装cudatoolkit 上官网CUDA Toolkit Archive | NVIDIA Developer 根据操作系统选择对应的toolkit 如果已经安装了驱动&#xff0c;选…

main函数的参数ac和av

概要&#xff1a; main函数有两个参数&#xff0c;ac和av ac表示参数的个数&#xff0c;程序名包括在内。也就是说程序无参数运行时&#xff0c;ac的值为1 av是一个字符串数组&#xff0c;这个数组中的每个元素表示一个参数&#xff0c;程序名包括在内。也就是说&#xff0c…

【iptables】增加规则和删除规则

我们在另外一台机器上&#xff0c;使用ping命令&#xff0c;向当前机器发送报文&#xff0c;如下图所示&#xff0c;ping命令可以得到回应&#xff0c;证明ping命令发送的报文已经正常的发送到了防火墙所在的主机&#xff0c;ping命令所在机器IP地址为31.133&#xff08;黑色&a…