ADC前端控制与处理模块--AD7606_Module

总体框架

AD7606_Module主要由3个模块组成组成,AD7606_Data_Pkt和AD7606_Drive以及AD7606_ctrl。
1.AD7606_Data_Pkt主要作用是把AD芯片数据组好数据包,然后发送给上位机;
2.AD7606_Drive主要负责和芯片的交互部分
3.AD7606_ctrl控制模块的作用接受命令报文,然后把里面具体的控制信号解析出来,把控制信号给到数据组包模块。

系统框图

一、数据组包模块AD7606_Data_Pkt

数据格式如图所示,其中每一个通道的数据由3个字节组成,第一个字节代表该通道的通道数,后两个字节是AD采集到的16位数据,CRC暂时不设计

图1

组包设计思路是,
1.输入定义一个r_cnt寄存器,当查询指令进来或者计数到0到4时候自增,在计数到4时候等待有效信号进来才继续自增,等到读完所有通道数3+3*channel-1这时候才清零.

always @(posedge i_clk or posedge i_rst )
beginif(i_rst) r_cnt <= 'd0 ;else if(r_cnt == 2 + (ri_cap_channel + ri_cap_channel + ri_cap_channel))//读完就是26,一个通道占用3个字节r_cnt <= 'd0 ;else if (r_cnt > 4)r_cnt <= r_cnt + 1 ;else if (r_cnt == 4 && ri_user_valid_1)r_cnt <= r_cnt + 1 ;//这里是确保第一个数据进来了else if(ri_cap_seek || (r_cnt > 0 && r_cnt < 4 ) )r_cnt <= r_cnt + 1 ; //查询指令来了之后才开始组包,算到4就真正开始进来数据了else r_cnt <= r_cnt ;
end

2.使用一个case在计数器r_cnt自增时候就开始组包

always @(posedge i_clk or posedge i_rst )
beginif(i_rst)r_adc_per_data <= 'd0 ; else case(r_cnt)0          :    r_adc_per_data <= 8 'h55 ; //前导码 1          :    r_adc_per_data <= 'd5    ;//指令,代表通道电压采集结果查询 2          :    r_adc_per_data <= ri_cap_channel + ri_cap_channel + ri_cap_channel; //长度信息,一个通道需要3个字节 , 3*通道数 ,3 *ri_cap_channel,乘法在fpga里面一个周期算不出来3          :    r_adc_per_data <= 1 ; //代表通道14          :    r_adc_per_data <= ri_user_data_1[15 : 8] ; //数据高字节5          :    r_adc_per_data <= ri_user_data_1[7  : 0] ; //数据低字节6          :    r_adc_per_data <= 2 ; 7          :    r_adc_per_data <= ri_user_data_2[15 : 8] ;8          :    r_adc_per_data <= ri_user_data_2[7  : 0] ; 9          :    r_adc_per_data <= 3 ; 10         :    r_adc_per_data <= ri_user_data_3[15 : 8] ; 11         :    r_adc_per_data <= ri_user_data_3[7  : 0] ; 12         :    r_adc_per_data <= 4 ; 13         :    r_adc_per_data <= ri_user_data_4[15 : 8] ; 14         :    r_adc_per_data <= ri_user_data_4[7  : 0] ; 15         :    r_adc_per_data <= 5 ; 16         :    r_adc_per_data <= ri_user_data_5[15 : 8] ;17         :    r_adc_per_data <= ri_user_data_5[7  : 0] ; 18         :    r_adc_per_data <= 6 ; 19         :    r_adc_per_data <= ri_user_data_6[15 : 8] ; 20         :    r_adc_per_data <= ri_user_data_6[7  : 0] ; 21         :    r_adc_per_data <= 7 ; 22         :    r_adc_per_data <= ri_user_data_7[15 : 8] ; 23         :    r_adc_per_data <= ri_user_data_7[7  : 0] ; 24         :    r_adc_per_data <= 8 ; 25         :    r_adc_per_data <= ri_user_data_8[15 : 8] ;26         :    r_adc_per_data <= ri_user_data_8[7  : 0] ; endcase end

3.然后把r_adc_per_data输入进去fifo里面,fifo输出就是组好的包,记住fifo的读使能要打一拍,才和输出数据同步,同时定义一个r_sent_cnt,发一个数据加1,可以作为o_adc_last信号拉高的条件

二、AD控制模块AD7606_ctrl

i_cmd_data信号进来,需要把解包,读取指令数据,数据包的格式依然是图1 所示,重点关注指令那一块,当r_cnt数到1的时候,读取指令type,type就是决定后面的数据包含什么信息,然后把信息输出给ad_drive和ad_pkt

解包设计思路:
1.定义一个计数器r_cnt,有效信号valid来的时候就加1
2.取出type

always @(posedge i_clk or posedge i_rst )
beginif(i_rst)r_type <= 'd0 ;else if(r_cnt == 1 && ri_cmd_valid)r_type <= ri_cmd_data ;       elser_type <= r_type ;
end

3.然后取出指令,以取采样率为例,由于是二十四位,采用串转并操作,w_system_pos是上电启动,这部分还没开发,i_adc_speed 最后悬空的。

always @(posedge i_clk or posedge i_rst )
beginif(i_rst)ro_cap_speed <= 'd0 ;else if (w_system_pos)ro_cap_speed <= i_adc_speed ;   else if(ri_cmd_valid && r_cnt >= 3  && r_cnt <= 2 + r_payload && r_type == 2) ro_cap_speed <= {ro_cap_speed [15 : 0] ,ri_cmd_data} ; //串并转换      elsero_cap_speed <= ro_cap_speed ;
end

二、AD驱动模块AD7606_drive

特点 :
					1.同步采样2.模拟通道数  :83.分辨率 : 16 bit , 5V / 2的16次方 = 0.00007V 理论值 1 24.有效位数 ENOB : 真正的分辨率 ,16 bit - 3~4  = 13bit 左右5.数字量输出形式 : 二进制补码
FPGA控制引脚:
				1.PAR / SER / BYTE SEL : 并行 、串行 、字节选择 ,本项目使用并行 ,设置为02.STBY :睡眠控制 , 0电平睡眠3.CONVST A/B :驱动ADC模拟信号控制引脚,A控制第一半,B控制高一半4.RESET : 复位,高有效,持续50ns以上5.RD:读数据控制信号6.BUSY :繁忙指示信号6.CS: 片选信号7.FRSTDATA :第一通道指示信号8.DB0~DB15:读数据通道
时序图:

1

  1. t reset 需要50ns,状态机设置r_st_cnt == 10 ,一共200ns
    2
  2. CONSVT同时拉低,手册上说CONSVT A 和CONVST B之间上升沿相差最大为 0.5ms
    在这里2图片描述
  3. CONSVT 后大于40ns才能拉高 busy,状态机设置r_st_cnt >= 10 ,然后读busy状态再调到读状态。
    在这里插入图片描述

4.busy拉低了之后可以立刻拉低CS,就是读状态了。

1

读状态的时候就可以产生RD信号了,CS拉低后RD不需要延时,另外,由于RD需要接受8bit,需要计数器计数16,翻转状态下降沿的时候输入输出数据,上升沿读数据。
在这里插入图片描述
5.读完数据等待触发,等待时间用T cycle - T cony - 16*20ns = 5us - 3.45 us - 0.32 us =1.23us 等于 1230ns 也就是至少计数62个周期。

使用状态机,构建上面所示的信号图。

always@(*)
begincase(r_st_current)P_ST_RESET  : r_st_next = r_st_cnt == 10                ? P_ST_CONSVT   :  P_ST_RESET   ;//手册上持续50ns就行,这里一个时钟20ns,算够了200nsP_ST_CONSVT : r_st_next = ri_user_ctrl & ((!ri_trig_mode) ||(ri_trig_mode && ri_extrig[2]  &&  ri_extrig[1]))      ? P_ST_BUSY     : P_ST_CONSVT   ;//(!ri_trig_mode)自触发就直接执行,外部触发就看ri_extrig是不是高P_ST_BUSY   : r_st_next = r_st_cnt >= 10 & !ri_ad_busy  ? P_ST_READ     : P_ST_BUSY     ;//要求是consvt后大于40ns才能拉高,等待200ns后才读busy状态P_ST_READ   : r_st_next = r_st_cnt == 16 - 1            ? P_ST_WAIT     : P_ST_READ     ;P_ST_WAIT   : r_st_next = r_st_cnt == ri_cap_speed      ? P_ST_CONSVT   : P_ST_WAIT     ;//手册上是5us,时钟是50Mhz,一个周期就是20ns,5除以0.02等于250,减去上面用25,留余量设置成230,,default     : r_st_next = P_ST_RESET                    ;endcase 
end
//触发模式寄存器ri_trig_mode
always@(posedge i_clk,posedge i_rst)
beginif(i_rst)ri_trig_mode <= 'd0;elseri_trig_mode <= i_trig_mode;//阈值限制,最小就是230end

数据读入代码设计

//通道标识
always@(posedge i_clk,posedge i_rst)
beginif(i_rst)ro_user_channel <= 'd0;else if(r_st_current == P_ST_CONSVT)ro_user_channel <= 'd0;else if(ro_ad_rd && !ro_ad_rd_1d)ro_user_channel <= ro_user_channel + 1;else ro_user_channel <= ro_user_channel;
endalways@(posedge i_clk,posedge i_rst)
beginif(i_rst)ro_user_data_1 <= 'd0;else if(ro_ad_rd && !ro_ad_rd_1d && ro_user_channel == 0)ro_user_data_1 <= i_ad_data;else    ro_user_data_1 <= 'd0;
end
设计小技巧

1.外部触发信号输入进来需要打拍处理

//外部触发打拍ri_extig
always@(posedge i_clk,posedge i_rst)
beginif(i_rst)ri_extrig <= 'd0;elseri_extrig <= {ri_extrig[2:0],i_extrig};//阈值限制,最小就是230
end

2.ad7606有过采样功能,所谓过采样就是在单位时间内多采样几个点,然后他会取平均值,通过osc引脚控制。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity 插件 - Project窗口资源大小显示

Unity 插件 - Project窗口资源大小显示 &#x1f354;功能&#x1f32d;安装 &#x1f354;功能 &#x1f4a1;.显示Project Assets 和Packages下所有文件的大小&#xff08;右侧显示&#xff09; &#x1f4a1;.统计选中文件夹及其子文件夹下所有文件的大小并显示&#xff08…

HTB:Photobomb[WriteUP]

目录 连接至HTB服务器并启动靶机 使用nmap对靶机进行端口开放扫描 再次使用nmap对靶机开放端口进行脚本、服务扫描 使用ffuf进行简单的子域名扫描 使用浏览器直接访问该域名 选取一个照片进行下载&#xff0c;使用Yakit进行抓包 USER_FLAG&#xff1a;a9afd9220ae2b5731…

ssm教室信息管理系统+vue

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码看文章最下面 需要定制看文章最下面 目 录 目 录 III 1 绪论 1 1.1 研究背景 1 1.2目的和意义 1 1.3 论文结构安排 2 2 相关技术 3 …

详解Java之Spring MVC篇二

目录 获取Cookie/Session 理解Cookie 理解Session Cookie和Session的区别 获取Cookie 获取Session 获取Header 获取User-Agent 获取Cookie/Session 理解Cookie HTTP协议自身是“无状态”协议&#xff0c;但是在实际开发中&#xff0c;我们很多时候是需要知道请求之间的…

量子计算及其在密码学中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 量子计算及其在密码学中的应用 量子计算及其在密码学中的应用 量子计算及其在密码学中的应用 引言 量子计算概述 定义与原理 发展…

当财政支持减弱时,国有企业如何实现降本增效?

当财政支持减弱时&#xff0c;国有企业如何实现降本增效&#xff1f; 随着市场环境的不断变化和上级市场化政策要求的不断推进&#xff0c;部分国有企业面临着双重压力&#xff0c;一方面&#xff0c;市场的快速变革要求企业不断创新、提升竞争力&#xff1b;另一方面&#xff…

引入 axios,根据 api 文档生成调用接口

起步 | Axios Docs 安装 axios npm install axios 生成 api 调用接口【可选】 https://github.com/ferdikoomen/openapi-typescript-codegen 安装 npm install openapi-typescript-codegen --save-dev 然后执行生成代码 # http://localhost:8805/api/user/v3/api-docs&a…

ElasticSearch的Python Client测试

一、Python环境准备 1、下载Python安装包并安装 https://www.python.org/ftp/python/3.13.0/python-3.13.0-amd64.exe 2、安装 SDK 参考ES官方文档: https://www.elastic.co/guide/en/elasticsearch/client/index.html python -m pip install elasticsearch一、Client 代…

在双显示器环境中利用Sunshine与Moonlight实现游戏串流的同时与电脑其他任务互不干扰

我和老婆经常会同时需要操作家里的电脑&#xff0c;在周末老婆有时要用电脑加班上网办公&#xff0c;而我想在难得的周末好好地Game一下&#xff08;在客厅用电视机或者平板串流&#xff09;&#xff0c;但是电脑只有一个&#xff0c;以往我一直都是把电脑让给老婆&#xff0c;…

【第六节】windows汇编开发工具-RadAsm与Masm

一、介绍RadAsm和Masm相关概念 1.1 什么是Win32Asm&#xff1f; Win32Asm是一种基于32位汇编语言的编程语言&#xff0c;专门用于在Windows操作系统下进行开发。Win32Asm的全称是“Windows下的32位汇编语言编程”&#xff0c;它使用微软的MASM&#xff08;Microsoft Macro Ass…

EHOME视频平台EasyCVR视频融合平台支持哪些摄像机接入?监控摄像头镜头的种类有哪些?

在现代安防监控领域&#xff0c;视频融合平台扮演着至关重要的角色&#xff0c;它们不仅能够整合不同品牌和型号的摄像机&#xff0c;还能提供稳定可靠的视频流传输和高效的视频管理功能。EasyCVR视频融合平台以其卓越的兼容性和灵活性&#xff0c;逐渐成为构建复杂监控网络的首…

从pg_depend和pg_class开始了解MogDB/openGauss/postgresql的系统元数据设计

前言 学习任何一种数据库&#xff0c;必须要了解它的数据字典&#xff0c;这样有利于了解数据库的结构、解读部分日志、定位一些问题。PG/OG系数据库的系统元数据遵从一个统一的设计规则&#xff0c;可以让初学者快速入门。本文以MogDB为例&#xff0c;剖析一下PG/OG系数据库的…

[译] APT分析报告:13.Trellix对Iran网络空间能力评估

这是作者新开的一个专栏&#xff0c;主要翻译国外知名安全厂商的技术报告和安全技术&#xff0c;了解它们的前沿技术&#xff0c;学习它们威胁溯源和恶意代码分析的方法&#xff0c;希望对您有所帮助。当然&#xff0c;由于作者英语有限&#xff0c;会借助LLM进行校验和润色&am…

vue2,vue3,uniapp,小程序实现前端url生成二维码

最近遇到一个项目&#xff0c;api返回url地址&#xff0c;前端通过地址生成二维码。 话不多说直接上代码&#xff0c;亲测有效&#xff0c;希望能帮助大家&#xff0c;同时如果有更好的方法希望大家能够分享 1、第一步&#xff0c;在项目的utils文件夹下面创建一个weapp-qrco…

Python的函数(补充浅拷贝和深拷贝)

一、定义 函数的定义&#xff1a;实现【特定功能】的代码块。 形参&#xff1a;函数定义时的参数&#xff0c;没有实际意义 实参&#xff1a;函数调用/使用时的参数&#xff0c;有实际意义 函数的作用&#xff1a; 简化代码提高代码重用性便于维护和修改提高代码的可扩展性…

FPGA学习笔记#4 Vitis HLS 入门的第一个工程

本笔记使用的Vitis HLS版本为2022.2&#xff0c;在windows11下运行&#xff0c;仿真part为xcku15p_CIV-ffva1156-2LV-e&#xff0c;这一篇终于没有再大量使用别人的内容&#xff0c;是我自己从头捋到尾的结果&#xff0c;不过之后的笔记还是要参照别人的教程就是了。 学习笔记&…

Linux中给普通账户一次性提权

我在以前文章中Linux常见指令大全&#xff08;必要知识点&#xff09;-CSDN博客 写过sudo的概念与用法。其实本质就是提权用的但是在某些场景下就算提权了也不能使用。 例如&#xff1a;打开主工作目录 他不相信你这个用户&#xff0c;虽然你是erman 解决方法 使用root账号打开…

A027-基于Spring Boot的农事管理系统

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600…

linux命令详解,存储管理相关

存储管理 一、内存使用量&#xff0c;free free 命令是一个用于显示系统中物理内存&#xff08;RAM&#xff09;和交换空间&#xff08;swap&#xff09;使用情况的工具 free -m free -m -s 5参数 -b 功能: 以字节&#xff08;bytes&#xff09;为单位显示内存使用情况。说…

关于若依500验证码问题的求助

关于若依框架中验证码出现500错误的问题&#xff0c;这通常表示服务器内部错误。以下是一些可能的原因及解决方案&#xff1a; 一、配置文件问题 .env.production文件&#xff1a; 确保.env.production文件中的VUE_APP_BASE_API已经修改成服务器上的域名地址&#xff0c;而不…