ADC简介

位数n:一定范围的模拟量能分成2^n份;其中某个模拟量由n位二进制数表示。n越大,精度越高。
采样率:

原理分析

  1. FPGA通过什么管脚控制ADC

  2. 用什么时序来控制管脚?
    依据SPI时序图

    DOUT输出这一次通道转换的数据,DIN控制下一次要转换数据的通道和其他设置( ADD控制通道序数)
    留意时序规格:结合两张图,可以看出sclk下降沿ADC自动采集DIN,所以需要在上升沿送入DIN。同样sclk下降沿读取DOUT。

  3. 控制通道与工作模式
    通过控制寄存器DIN,根据需求选择;如果不懂,或者没有要求,就用默认,最简单的形式。


    50分频;PM=11; SEO SHADOW=00; RANGE=0,响应0-5V; CODING=1;

代码实现

实现步骤:
1、根据功能要求,在给出clk的波形图上,画出输入和输出的波形;(时序图已给出)
2、标出需要计数的信号,在给出clk的波形图上画出计数器
3、确认各计数器的加1条件、结束条件(加1条件:计数器数什么;结束条件:计数器周期数多少个,不同值时用变量法。 )。
4、其它信号变化点条件(其他信号即输出或内容信号;变化点∶ 0变 1、1变0的点,何时写入/读取)。
5、写出计数器代码和其他信号变量代码

参数声明部分

module ad7928_ctr(input clk         , //系统时钟input rst_n       , //复位信号input adc_dout //adc输出给fpga的串行信号   ,output reg adc_cs       , //控制adc是否工作的片选信号output reg adc_sclk     , //adc的工作时钟output reg adc_din      , //fpga控制adc工作参数的信号,勿混淆成要转换的信号output reg [15:0] dout      ,  //fpga最终输出的16位并行信号output reg dout_vld    ,//转换数据有效指示信号);parameter        WRITE = 1'b1;
parameter        PM    = 2'b11;
parameter        SEQ   = 1'b0;
parameter        SHADOW= 1'b0;
parameter        RANGE = 1'b0;
parameter        CODING= 1'b1;

计数器部分

这三个计数器的时钟(周期)实际上是不同的,但这里并没有用不同频率的时钟信号分别生成计数器,而是统一在系统时钟下,保证了时序上不出问题

加1条件 结束条件 用途
cnt0 一个sysclk 计数到50-1 计数系统时钟个数,50分频产生sclk
cnt1 一个sclk=cnt0结束条件 计数到18-1 计数sclk个数,18个sclk对应一整段片选信号CS
cnt2 一整段转换过程(CS)=cnt1结束条件 计数到8-1 计数ADC转换次数,1个cnt2的值控制一次ADD通道
reg   [  7:0] cnt0       ;
wire          add_cnt0   ;
wire          end_cnt0   ;
always @(posedge clk or negedge rst_n)beginif(!rst_n)begincnt0 <= 0;endelse if(add_cnt0)beginif(end_cnt0)cnt0 <= 0;elsecnt0 <= cnt0 + 1;end
end
assign add_cnt0 = 1; //计数器加1条件;可以不要
assign end_cnt0 = cnt0==50-1; //计数器中止条件
//assign end_cnt0 = add_cnt0 && (cnt0==50-1) ;reg   [ 5:0]  cnt1       ;
wire          add_cnt1   ;
wire          end_cnt1   ;
always @(posedge clk or negedge rst_n)begin if(!rst_n)begincnt1 <= 0;endelse if(add_cnt1)beginif(end_cnt1)cnt1 <= 0;elsecnt1 <= cnt1 + 1;end
end
assign add_cnt1 = end_cnt0; //cnt0 ==49
assign end_cnt1 = add_cnt1 && (cnt1==18-1) ; //不用前半部分add_cnt1也行,因为就是在add_cnt1=1的条件下才做的end_cnt1判断reg   [  3:0] cnt2       ;
wire          add_cnt2   ;
wire          end_cnt2   ;
always @(posedge clk or negedge rst_n)beginif(!rst_n)begincnt2 <= 0;endelse if(add_cnt2)beginif(end_cnt2)cnt2 <= 0;elsecnt2 <= cnt2 + 1;end
end
assign add_cnt2 = end_cnt1;
assign end_cnt2 = add_cnt2 && cnt2==8-1 ;

其他信号

按照时序要求来,1MHz的sclk,无论是半个还是一个周期,都完全满足时序要求。

复位 1变0 0变1
Sclk 1 1~16cnt1,cnt0的一半 1~16cnt1, Cnt0的结束;
0,17cnt1一直保持1
CS 1 Cnt1=0,cnt0的一半 Cnt1=17,cnt0的一半

DIN 16
时序逻辑:前一个sclk结束时写入,中间ADC自动采。因此0~15cnt1,cnt0结束时写入
注意:对每个sclk单独弄,很麻烦,先拼出一个data,每次讲data的一位写给DIN;cnt1=0写入的WRITE是data最高位[15]

DOUT 16
时序逻辑:ADC自动发送,sclk一半时FPGA采集,因此1~16cnt1,cnt0一半时读取

assign middle = add_cnt0 && cnt0==25-1;
//生成sclk
always  @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)beginadc_sclk <= 1; //注意这里复位是1不是0endelse if(middle && (cnt1>=1) &&(cnt1<17))beginadc_sclk <= 0;end //每个cnt0计数周期的一半变低,除了sclk第0个,第17个周期else if(end_cnt0)beginadc_sclk <= 1;end //每个cnt0计数周期结束变高,sclk第0,第17个周期保持高位
endalways  @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)beginadc_cs <= 1;endelse if(middle && cnt1==0)beginadc_cs <= 0;end //sclk第0个周期的一半拉低,比时序图的要求更宽松else if(middle && cnt1==17 )beginadc_cs <= 1;end
end//生成din
wire[15:0]   data;
assign data = {WRITE,SEQ,1'b0,cnt2,PM,SHADOW,1'b0,RANGE,CODING,4'b0};
always  @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)beginadc_din <= 0;endelse if(end_cnt0 && cnt1<16)beginadc_din <= data[15-cnt1]; end
endalways  @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)begindout <= 0;endelse if(middle && cnt1>=1 && cnt1<17)begindout[16-cnt1] <= adc_dout; end
end//8个通道循环一次,输出一个有效位
always  @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)begindout_vld <= 0;endelse begindout_vld <= end_cnt2;end
end

基于FPGA的AD7928驱动相关推荐

  1. 基于FPGA的GV7600驱动

    最近项目上用到FPGA驱动GV7600输出SDI信号,输出分辨率1920*1080p,首先,了解GV7600芯片的特性功能,按照bt1120协议传输10位Y,Cb,Cr数据:其次,我的项目中用的是10 ...

  2. 基于FPGA的VGA/LCD显示控制器设计(中)

    今天给大侠带来基于FPGA的VGA/LCD显示控制器设计,由于篇幅较长,分三篇.今天带来第二篇,中篇,VGA 显示原理以及VGA/LCD 显示控制器的基本框架,话不多说,上货. 之前也有图像处理以及V ...

  3. 基于FPGA的ICG-20330陀螺仪设计

    设计要求 本次设计使用CMOD-S7和ICG-20330搭建一个基于FPGA的陀螺仪驱动系统,最终的设计要求有如下几点: 理解陀螺仪芯片工作原理: 正确使用FPGA驱动ICG-20330陀螺仪芯片,能 ...

  4. 基于FPGA的CAN通信,FPGA驱动SJA1000T芯片代码,实现标准帧与扩展帧的通信驱动

    基于FPGA的CAN通信,FPGA驱动SJA1000T芯片代码,实现标准帧与扩展帧的通信驱动,已上板调通 品牌型号 CAN SJA1000T 与世面上的不同,代码不是SJA1000T芯片代码,而是驱动 ...

  5. 基于FPGA的iic主从机驱动实现 Verilog实现iic slave和iic master

    基于FPGA的iic主从机驱动实现 Verilog实现iic slave和iic master 顶层模块实现master对slave自定义的寄存器读取 带仿真模块 ID:153069768739840 ...

  6. 基于fpga的数码管动态扫描电路设计_【至简设计案例系列】基于FPGA的密码锁设计(altera版)...

    秦红凯 明德扬FPGA科教 一.项目背景概述 随着生活质量的不断提高,加强家庭防盗安全变得非常重要,但传统机械锁的构造过于简单,很容易被打开,从而降低了安全性.数字密码锁因为它的保密性很高,安全系数也 ...

  7. 快手团队长文解读:基于FPGA加速的自动语音识别在大规模直播和短视频场景的应用...

    来源:机器之心 本文约6000字,建议阅读10分钟 本文介绍了基于FPGA加速的自动语音识别在大规模直播和短视频场景的应用. 典型的实时流式自动语音识别业务如语音搜索.语音输入等和用户操作相关,直接影 ...

  8. 基于FPGA的UART接口协议设计

    一.PC终端概述 PC终端,Personal Computer 智能终端,通俗的讲,就是利用电脑GUI界面控制我们的外部硬件电路. 因此设计到了PC与外部硬件电路的通信接口.对于台式电脑.个人笔记本, ...

  9. altera fpga 型号说明_基于FPGA的USB2.0接口通信

    欢迎FPGA工程师加入官方微信技术群 点击蓝字关注我们FPGA之家-中国最好最大的FPGA纯工程师社群 概述 本文主要介绍一种基于FPGA的FT232H接口通信开发方案.传统的USB通信开发对工程人员 ...

最新文章

  1. Go 学习笔记(28)— nil(nil 不能比较、不是关键字或保留字、nil 没有默认类型、不同类型的 nil 指针是一样的、不同类型的 nil 是不能比较的、相同类型的 nil 可能也无法比较)
  2. 强势推荐10款windows端的实用软件,鲜为人知却非常强大!
  3. 卡片的sak为不支持的类型_“师傅”两字是不能随便叫的!78%的网友不支持称顺风车主为“师傅”...
  4. [Python设计模式] 第8章 学习雷锋好榜样——工厂方法模式
  5. Bootstrap 表格 笔记
  6. Effective C++ ------- virtual
  7. 【个推CTO谈数据智能】之本质及技术体系要求
  8. Airflow 中文文档:使用systemd运行Airflow
  9. 严重漏洞已存在16年,数亿台打印机受影响
  10. idea 自动添加doc_公共组件需求自动录入TAPD
  11. js排序的时间复杂度_javascript的array.indexOf的时间复杂度是多少?
  12. 数据科学和人工智能技术笔记 十九、数据整理(下)
  13. 2020年全球及中国干细胞医疗行业发展现状及竞争情况分析,美国领先于世界,北上广领先于中国「图」
  14. 快速导出PDF文件中所有图片(使用Adobe Acrobat 10 )
  15. libdbus 实例以及使用d-feet查看接口方法
  16. 2017车载后市场年终回顾:天下武功,唯快不破
  17. 商业模式新生代_【骆新荐书】商业模式新生代
  18. 小程序动画-循环放大缩小的动画(一闪一闪的)
  19. 一叶知秋,很多IT“专家”其实都只是“砖家”
  20. 题解 乃爱与城市拥挤程度

热门文章

  1. Storm架构及部署
  2. 微信转服服务器,王者荣耀qq转移到微信可以吗 跨平台转区规则介绍
  3. Django的MTV框架基础
  4. chmod命令:修改文件(夹)权限
  5. sequoiaDB连接mysql_SequoiaDB 巨杉数据库Docker镜像使用教程
  6. error: stray ‘\×××’ in program错误原因及解决方法
  7. 人工智能、机器学习、深度学习的区别
  8. QuerySet中常用的方法
  9. mac下使用iTunes备份到U盘
  10. Microsoft OLE DB Provider for Oracle error '80004005'