本帖最后由 雾盈 于 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芯片被选中同时前次转换结果的最高有效位MSBA7自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);
记得加上延迟
附上源代码:
|