集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 20890|回复: 3

雾盈FPGA笔记之(二)AD转换电压测量数码管显示

[复制链接]
雾盈 发表于 2016-9-10 12:46:24 | 显示全部楼层 |阅读模式
本帖最后由 雾盈 于 2016-9-10 12:56 编辑

AD转换实验——基于FPGA的电压测量数码管显示装置

雾盈 2016-8-5


雾盈FPGA笔记汇总目录

A/D 转换器将各种模拟信号转换为抗干扰性更强 的数字信号

一、写在前面

                这是课程刚开始的时候做的一个小实验,

二、简单概念介绍

1)AD转换

AD转换就是模数转换。顾名思义,就是把模拟信号转换成数字信号。其相对应于DA转换。


2)A/D转换器(ADC)

A/D转换器是用来通过一定的电路将模拟量转变为数字量。TCL549是AD转换器的其中一种。
模拟量可以是电压、电流等电信号,也可以是压力、温度、湿度、位移、声音等非电信号。但在A/D转换前,输入到A/D转换器的输入信号必须经各种传感器把各种物理量转换成电压信号。


三、TLC549 芯片


1)芯片引脚图如下:

       


TLC549 AD转换芯片是8位单输入逐次逼近式AD转换器 内部4M时钟 IO最大速度I,IMHZ。

2)TLC549引脚含义:

1.  REF+  : 正基准电压输入端  2.5V ≤ REF+ ≤ Vcc+0.1 。

2.  REF -  : 负基准电压输入端-0.1V ≤ REF- ≤2 .5V 。

3.  ANALOGIN:
模拟信号输入端  REF- ≤ ANALOGIN ≤ Vcc
当ANALOGIN ≥ REF+电压时转换结果为全“1”(0FFH),
当ANALOGIN ≤ REF-电压时转换结果为全“0”(00H)。

4.         I/O  CLOCK:
外接输入/输出时钟输入端,无需与芯片内部系统时钟同步。

5.        DATA OUT  :
转换结果数据,串行输出端与TTL电平兼容,输出时高位在前,低位在后。

6.  (cs) ̅  : 芯片选择输入端 (低电平有效)

VCC  :系统电源3v≤Vcc≤6v。
GND  :接地端。


四、AD器件工作时序(TLC549)


时序图如下:
       
               

当/CS变为低电平后TLC549芯片被选中同时前次转换结果的最高有效位MSBA7自DATA OUT端输出
接着要求自I/O CLOCK端输入8个外部时钟信号前7个I/O CLOCK
信号的作用是配合TLC549输出前次转换结果的A6-A0位(下降沿发送数据)并为本次转换做准备
在第4个I/O CLOCK信号由高至低的跳变之后,片内采样/保持电路对输入模拟量采样开始
第8个I/O CLOCK信号的下降沿使片内采样/保持电路进入保持状态并启动A/D开始转换。

转换时间为36个系统时钟周期最大为17us。直到A/D转换完成前的这段时间内TLC549的控制逻辑要求: 或者/CS保持高电平,或者I/O CLOCK时钟端保持36个系统时钟周期的低电平。

所以在自TLC549的I/O CLOCK端输入8个外部时钟信号期间需要完成以下工作
>>>读入前次转换结果
>>>对本次转换的输入模拟信号采样并保持
>>>启动本次A/D转换开始

这个例子IO时钟为200Khz
在某次的时钟下降沿将cs拉低并开始从data线上获取数据  
每个下降沿到下一个下降沿之间获取一次数据
转换收到的数据并显示到LED数码管


五、框图:

               

六、程序分析解释


其实,仔细看一下发现,这个AD时序协议和IIC协议,有一些不一样的时,它并不需要状态的跳转,只是按照时钟时间按部就班有序进行,所以,我们不用有限状态机(FSM)来写,用线性序列机(LSM)来写。

代码很简单,源代码后面附上:

       



下面是我当时做这个实验时,遇到的一些问题,希望也能给你一个参考

Q 1:仿真波形全线飚红,程序检查了半天也没看出什么

A 1: 纠结了半天,老师走过,瞄了一眼,“没赋初值”。一语惊醒梦中人。哈哈。
谨记:复位(rst_n)的时候要对所有的输出变量赋初值,否则波形会出现红线。测试的时候,要对所有的输入变量赋初值。

Q 2:中间值data_temp 问题
A 2:不用中间值,数据输出不是完整的数据。

Q 3:随机数任务函数random的用法

Reg [7:0] num;
Num = {$random} % 256  //意为num 在0——255 之间随机取数;
Num = $random % 256  // 意为num 在 -255——255 之间随机取数;
产生一个在min, max之间随机数的例子:
num = min+{$random}%(max-min+1);

               

记得加上延迟

附上源代码:
       
               

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
Sunlife 发表于 2016-9-11 18:55:06 | 显示全部楼层
                          高手
芙蓉王 发表于 2016-9-12 09:24:30 | 显示全部楼层
      
王子特 发表于 2016-12-5 09:55:35 | 显示全部楼层
大神,请问为什么你的CS一直处于高电平,/cs的意思不就是低电平有效吗
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2024-11-16 19:03 , Processed in 0.060080 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表