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

news2024/11/13 12:19:52

总体框架

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 )
begin
    if(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 )
begin
    if(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 ; //代表通道1
        4          :    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 )
begin
    if(i_rst)
        r_type <= 'd0 ;
    else if(r_cnt == 1 && ri_cmd_valid)
        r_type <= ri_cmd_data ;       
    else
        r_type <= r_type ;
end

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

always @(posedge i_clk or posedge i_rst )
begin
    if(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} ; //串并转换      
    else
        ro_cap_speed <= ro_cap_speed ;
end

二、AD驱动模块AD7606_drive

特点 :
					1.同步采样
					2.模拟通道数  :8
					3.分辨率 : 16 bit , 5V / 2的16次方 = 0.00007V 理论值 1 2
					4.有效位数 ENOB : 真正的分辨率 ,16 bit - 3~4  = 13bit 左右
					5.数字量输出形式 : 二进制补码
FPGA控制引脚:
				1.PAR / SER / BYTE SEL : 并行 、串行 、字节选择 ,本项目使用并行 ,设置为0
				2.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@(*)
begin
   case(r_st_current)
        P_ST_RESET  : r_st_next = r_st_cnt == 10                ? P_ST_CONSVT   :  P_ST_RESET   ;//手册上持续50ns就行,这里一个时钟20ns,算够了200ns
        P_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)
begin
    if(i_rst)
        ri_trig_mode <= 'd0;
    else
        ri_trig_mode <= i_trig_mode;//阈值限制,最小就是230


end

数据读入代码设计

//通道标识
always@(posedge i_clk,posedge i_rst)
begin
    if(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;
end

always@(posedge i_clk,posedge i_rst)
begin
    if(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)
begin
    if(i_rst)
        ri_extrig <= 'd0;
    else
        ri_extrig <= {ri_extrig[2:0],i_extrig};//阈值限制,最小就是230
end

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

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

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

相关文章

注意力机制篇 | YOLO11改进 | 即插即用的高效多尺度注意力模块EMA

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。与传统的注意力机制相比&#xff0c;多尺度注意力机制引入了多个尺度的注意力权重&#xff0c;让模型能够更好地理解和处理复杂数据。这种机制通过在不同尺度上捕捉输入数据的特征&#xff0c;让模型同时关注局部细节和全局…

dell服务器安装ESXI8

1.下载镜像在官网 2.打开ipmi&#xff08;idrac&#xff09;&#xff0c;将esxi镜像挂载&#xff0c;然后服务器开机 3.进入bios设置cpu虚拟化开启&#xff0c;进入boot设置启动选项为映像方式 4..进入安装引导界面3.加载完配置进入安装 系统提示点击继 5.选择安装磁盘进行…

Linux -- 操作系统(软件)

目录 什么是操作系统&#xff1f; 计算机的层状结构 为什么要有操作系统 操作系统到底层硬件 驱动程序 操作系统如何管理硬件&#xff1f; 操作系统到用户 系统调用接口 库函数 回到问题 什么是操作系统&#xff1f; 操作系统&#xff08;Operating System&#xf…

【大数据算法】MapReduce算法概述之:MapReduce基础模型

MapReduce基础模型 1、引言2、MapReduce基础模型2.1 定义2.2 核心原理2.3 优点2.4 缺点2.5 局限性2.6 实例 3、总结 1、引言 小屌丝&#xff1a;鱼哥&#xff0c;鱼哥&#xff0c; 不得了啊 小鱼&#xff1a;啥事情这么慌慌张张的 小屌丝&#xff1a;这不是慌张啊 小鱼&#x…

深入解析 Transformers 框架(四):Qwen2.5/GPT 分词流程与 BPE 分词算法技术细节详解

前面我们已经通过三篇文章&#xff0c;详细介绍了 Qwen2.5 大语言模型在 Transformers 框架中的技术细节&#xff0c;包括包和对象加载、模型初始化和分词器技术细节&#xff1a; 深入解析 Transformers 框架&#xff08;一&#xff09;&#xff1a;包和对象加载中的设计巧思与…

商品详情 API 接口的返回结果通常包含哪些信息?

商品详情 API 接口的返回结果通常包含以下几类信息&#xff1a; 一、商品基本信息&#xff1a; 商品 ID&#xff1a;唯一标识商品的编号&#xff0c;在电商平台的数据库中具有唯一性&#xff0c;用于区分不同的商品。商品标题&#xff1a;对商品的简要描述&#xff0c;通常包…

探索 Seata 分布式事务

Seata&#xff08;Simple Extensible Autonomous Transaction Architecture&#xff09;是阿里巴巴开源的一款分布式事务解决方案&#xff0c;旨在帮助开发者解决微服务架构下的分布式事务问题。它提供了高效且易于使用的分布式事务管理能力&#xff0c;支持多种事务模式&#…

AI写作(七)的核心技术探秘:情感分析与观点挖掘

一、AI 写作中的关键技术概述 情感分析与观点挖掘在 AI 写作中起着至关重要的作用。情感分析能够帮助 AI 理解文本中的情感倾向&#xff0c;无论是正面、负面还是中性。在当今信息时代&#xff0c;准确把握用户情绪对于提供个性化体验和做出明智决策至关重要。例如&#xff0c;…

容器化技术入门:Docker详解

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 容器化技术入门&#xff1a;Docker详解 容器化技术入门&#xff1a;Docker详解 容器化技术入门&#xff1a;Docker详解 引言 Doc…

Flutter运行App时出现“Running Gradle task ‘assembleDebug“问题解决

在参考了众多解决办法中最有用并且最快的方法 Gradle Distributions 在这个地方下载对应你这个文件中的gradle版本 然后将 最后一行本来不是这样的,我们把下载好的zip包保存到本地,然后用这个代替网址,最后成功运行

Spark中的shuffle

Shuffle的本质基于磁盘划分来解决分布式大数据量的全局分组、全局排序、重新分区【增大】的问题。 1、Spark的Shuffle设计 Spark Shuffle过程也叫作宽依赖过程&#xff0c;Spark不完全依赖于内存计算&#xff0c;面临以上问题时&#xff0c;也需要Shuffle过程。 2、Spark中哪…

window11安装elasticsearch+Kibana

1、下载elasticsearch与elasticsearch 下载elasticsearch 查看elasticsearch对应的Kibana版本 下载elasticsearch解压后文件目录如下 可执行脚本文件,包括启动elasticsearch服务、插件管理、函数命令等 bin配置文件目录,如elasticsearch配置、角色配置、jvm配置等 conf 默认…

linux rocky 9.4部署和管理docker harbor私有源

文章目录 Harbor简介安装Harbor技术细节1.安装系统(略),设置主机名和IP2.安装docker3.安装docker-compose4.安装Harbor私有源仓库5 测试登录1.本机登录2.客户端登录Harbor服务器配置docker源1. 下载镜像2.把镜像上传到Harbor私有仓库源3.客户端下载镜像,并且启动容器linux …

【计算机网络五】HTTP协议!网站运行的奥秘!

目录 HTTP协议 1.HTTP是什么&#xff1f; 2.Fiddler抓包查看HTTP协议格式 3.HTTP请求 4.HTTP响应 HTTP协议 1.HTTP是什么&#xff1f; HTTP ( 全称为 " 超文本传输协议 ") 诞生与 1991 年 . 目前已经发展为最主流使用的一种应用层协议 . HTTP 的前几个版本…

嵌入式硬件实战基础篇(一)-STM32+DAC0832 可调信号发生器-产生方波-三角波-正弦波

引言&#xff1a;本内容主要用作于学习巩固嵌入式硬件内容知识&#xff0c;用于想提升下述能力&#xff0c;针对学习STM32与DAC0832产生波形以及波形转换&#xff0c;对于硬件的降压和对于前面硬件篇的实际运用&#xff0c;针对仿真的使用&#xff0c;具体如下&#xff1a; 设…

ubuntu 24.04运行chattts时cuda安装错误原因分析

使用ubuntu 24.04&#xff0c;按照2noise/ChatTTS官方流程安装依赖时报错。ChatTTShttps://github.com/2noise/ChatTTS 这是因为cuda版本不对&#xff0c;ChatTTS目前的版本&#xff0c;要求支持cuda 12.4及以上&#xff0c;但是如果nvidia显卡驱动版本较老&#xff0c;无法支…

【动态规划】斐波那契数列模型总结

一、第 N 个泰波那契数 题目链接&#xff1a; 第 N 个泰波那契数 题目描述&#xff1a; 题目分析&#xff1a; 1、状态表示&#xff1a; dp[i] 表示&#xff1a;第 i 个斐波那契数的值 2、状态转移方程&#xff1a; 由题意可知第 i 个数等于其前三个数之和 dp[i] dp[i-…

2024 第五次周赛

A: 直接遍历即可 #include<bits/stdc.h> using namespace std;typedef long long ll; typedef pair<ll, ll>PII; const int N 2e6 10; const int MOD 998244353; const int INF 0X3F3F3F3F;int n, m; int main() {cin >> n;int cnt 0;for(int i 0; i …

【数据库系列】postgresql链接详解

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Uniapp底部导航栏设置(附带PS填充图标教程)

首先需要注册和登录ifconfont官网&#xff0c;然后创建项目添加需要的图标 创建和添加图标库请参考&#xff1a;Uniapp在Vue环境中引入iconfont图标库&#xff08;详细教程&#xff09; 打开iconfont官网&#xff0c;找到之前添加的图标库&#xff0c;下载png图片 如果需要的…