用状态机设计的TLC1196采样控制电路

更新时间:2023-10-07 13:27:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

基于FPGA的TLC1196采样控制器设计

徐威

宁波大学、信息科学与工程学院、通信112班、116040040

摘要:本次实验是基于FPGA的数字系统设计。设计出一个由状态机控制的LTC1196采样控制电路,进行ADC的采样。采样率为100KSPS,有两种采样方式,一种是每按一次键,自动产生和一组时钟完成一次转换,将转换结果显示在数码管上;另一种是一直自动进行采样和转换,并将转换结果显示在数码管上。实验的主要是状态机的设计、串并行数据的转换和signalTap Ⅱ的使用。

关键字:FPGA、ADC、采样、串并转换、signalTap Ⅱ。

一、设计任务与要求

实验设备:

quartus软件一套;

CG_DSE_03数字电路与系统实验平台; USB-BLASTER下载器;

设计要求:

1. 以约100KSPS的采样率,连续对直流电压进行AD转换,将串行结果转换成并行,显示在数码管上,测量三个以上电压点,分析ADC精度。

2. 输入信号为100Hz、幅度约4.5V的正极性正弦信号,用SignalTapII逻辑分析仪分析转换结果。

3. 实现单次AD转换:每按一次键,自动产生和一组时钟完成一次转换,将转换结果显示在数码管上。

二、方案设计与论证 2.1 LTC1196-2B介绍

该实验所用的ADC是采样率最高为1MHz的8位串行LTC1196,可编程器件的PIO26提供控制该ADC片选CS的信号;PIO25为转换时钟信号CLK,串行转换结果由PIO24输出。ADC2的输入模拟信号在实验箱的左侧,允许输入0~5V的信号。

LTC1196-2B是8位、1MSPS 、3线高速串行低功耗AD转换器。供电电压3~6V,模拟信号输入范围0~5V。内含采样和保持电路,具有高阻抗方式的串行接口,完成一次转换需要12个时钟周期。

图1 LTC1196引脚图

图1所示,是LTC1196引脚图,下面是LTC1196-2B引脚说明表: 引脚名称: 功能描述: 片选,低有效 模拟输入端 模拟/数字地 时钟 数字转换输出 CS 1 ?IN,?IN 2、3 GND 4 CLK 7 Dout 6 Vref 5

参考电压 表1 LTC1196-2B引脚说明

图2 LTC1196-2B时序图

从时序图可以知道:采样时间tSMPL至少为2.5个fCLK,单次转换时间不少于12个fCLK;片选下降沿离上一CLK上升沿至少13ns,离下一CLK上升沿,CS建立时间tsucs至少26ns;时钟频率fCLK不高于12MHz。转换关系为

DATA?255?Vin/5?

2.2系统总体设计思路

根据实验的要求进行系统的设计。系统要求100KPS采样率,由LTC1196-2B的时序图可以知道每十二个fCLK完成一次AD转换,所以系统时钟应该设置为1.2MHz。由于实验箱上没有1.2MHz的时钟,所以要用分频。串行结果转换成并行,可以通过编写VHDL语言,生成模块完成。单次和持续的转换可以通过按键切换,在控制器模块中完成。最后,AD转换的结果是0~255,转换结果在数码管上显示是16进制的,不方便阅读,可以考虑在完成实验要求之后再加上一个rom模块,通过查表转换,在数码管上显示成实际的电压值。

三、单元电路设计

根据系统总统设计思路,满足实验要求只需要设计一个状态机实现的控制器模块和一个LPM_ROM模块。

3.1 控制器模块

控制器完成的功能有:第一,控制AD单次或持续采样,输出串行数据;第二,进行串并转换,将LTC1196-2B输出的串行数据转换为并行数据输出。

系统时钟采用的是50MHz的时钟。为了满足ADC采样率100Kbps的要求,要将系统时钟进行分频,分出1.2MHz供给ADC,作为采样时钟。

控制器模块的代码及说明如下所示:

library ieee;

use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity adc is port( clkz :in std_logic; datain :in std_logic; reset :in std_logic; en :in std_logic; en2 :in std_logic; clk_rom :out std_logic; clk_o :out std_logic; cs :out std_logic; dataout :out std_Logic_vector(7 downto 0) ); end adc;

architecture behave of adc is type states is (s0,s1,s2); signal current_state,next_state:states; signal temp :std_logic_vector(7 downto 0); signal clk_tp:std_logic; signal clk :std_logic; signal clklk :std_logic;

signal cnt_en:std_logic; signal cnt_f :std_logic_vector(4 downto 0); signal cnt_f1:integer;

signal cnt :std_logic_vector(3 downto 0); signal datatemp:std_logic_vector(7 downto 0); begin

clk_o<=clk_tp; clk_rom<=clkz; clk_1k<=clklk;

process(clkz,cnt_f,cnt_f1) begin --系统时钟 --AD串行数据输入 --系统复位键 --单次采样按键 --持续采样按键 --LPM_ROM模块时钟 --AD时钟 --AD转换使能 --并行结果输出 --状态机三个状态,分别为初始 状态、计数状态和显示状态。 --串并转换临时存储单元 --移位寄存数量控制使能 --分频计数 --此进程为分频,输入的是 50MHz的系统时钟,计数0

if(clkz'event and clkz='1') then cnt_f<=cnt_f+1; if cnt_f=\ clk<=not clk; cnt_f<=\ end if; end if; end process;

process(clk,reset,datain) begin if reset='1' then current_state<=s0; elsif clk'event and clk='0' then current_state<=next_state; elsif clk'event and clk='1' then if cnt>=\

temp<=temp(6 downto 0)&datain; else null; end if; else null; end if; end process;

process(current_state,datain,en,en2) begin

case current_state is when s0=>

clk_tp<='1'; cs<='1';

datatemp<=\ cnt_en<='0';

if (en or en2)='1' then next_state<=s1; else next_state<=s0; end if; when s1=>

clk_tp<=clk; cs<='0';

datatemp<=\ cnt_en<='1'; if cnt=\ then next_state<=s2; else next_state<=s1; end if; when s2=>

到20,分频后约为1.19MHz

--此进程为状态机,控制AD转 换

clk_tp<='1'; cs<='1';

datatemp<=temp(7 downto 0); dataout<=datatemp;

if en='1' then

next_state<=s2; elsif en2='1' then next_state<=s1; else next_state<=s0; end if; when others=>

clk_tp<='1'; cs<='1';

datatemp<=\ cnt_en<='0'; next_state<=s0; end case; end process; process(clk_tp) begin

if clk_tp'event and clk_tp='1' then if cnt_en='1' then cnt<=cnt+1;

if cnt=\ cnt<=\ end if;

else cnt<=\ end if; else null; end if;

end process; end behave;

--检测单次采样按键是否为‘1’,是 则停留在状态2,显示结果。 --判断持续采样按键是否为‘1’,是 则跳转到状态1,接着进行AD采 样,否则跳回状态零,等待单次或 持续采样按键开启。

3.2 LPM_ROM模块

LPM_ROM模块是用来将数码管上显示的十六进制数转化为十进制数,方面阅读。其计算公式如下:

y?round??x/255?*5*10?

y 是数码管上显示的数字,x为输入的0-255的八位并行数据。因为LTC1196-2B的基准电压是5V,所以乘以5。结果乘以10之后取整,是取出在数码管显示的整数位和第一位小数位。

LPM_ROM的ROM表数据如下:

图3 LPM_ROM表

LPM_ROM的模块的时钟要比ADC的采样率要高,保证ADC输出数据时能LPM_ROM模块能尽快同步查询出十进制数,并输出。这里就采用的是系统时钟,为ADC采样率的12倍,满足要求。

3.3总体系统示意图与引脚配置

按照功能分析已经控制器模块,LPM_ROM模块的说明,在quartus中生成模块,组成系统。总体系统的示意图和引脚的配置如下。

图4 总体系统与引脚示意图

保存后进行编译程序,进行程序的调试。完成后测试实验系统,分析实验数据。

四、系统测试与分析

按照实验要求,先对直流以约100KSPS的采样率,连续对直流电压进行AD转换,将串行结果转换成并行,显示在数码管上,测量三个以上电压点,分析ADC精度。测量结果如下表所示。 测试点1 测试点2 测试点3 电压表读数V 八位并行数据 1.1 2.5 4.9 39 81 FA 数码管数据 1.1 2.5 4.9

理论结果 38 7F FA 精度 100% 99.3% 99.6% 表2 直流电源AD采样精度测量数据

输入信号为100Hz、幅度约4.5V的正极性正弦信号,用SignalTapII逻辑分析仪分析转换结果。下图是用signalTapII逻辑分析仪观察到的实验结果。

图5 使用signalTap观察到的100KHz正弦波

观察波形数据,在正弦波的峰峰值最大数据为D8h,按照ADC原理还原为实际电压值为4.24伏。在图中可以明显看到,在一个正弦波的周期中,有十个数据点,数据点正好在正弦波峰峰值处,即数据为E5的概率很小。所有实验得到的结果是合理有效的。

实现单次AD转换:每按一次键,自动产生和一组时钟完成一次转换,将转换结果显示在数码管上。

这个功能在已经达到要求,实现的原理是,通过按键,产生一个脉冲信号,开始第一次转换,在状态机中进行状态转换。当到达状态2,在数码管显示出电压数据之后,对该按键判断,如果按键仍然为1则停在显示状态,否则跳回状态零,等待按键开启转换。

五、实验结论

从本次实验中,对VHDL编写状态机有了更深的了解。学会了用时钟的上升沿和下降沿作为触发条件。

对系统时钟的分频有了实践,对分频时钟的选取有所了解。 掌握了使用LTC1196-2B的方法,完成ADC数据的串并转换。

对LPM_ROM模块有了更深的了解,在实践中了解用于ROM查表的时钟要比数据输入时钟要快,保证数据及时转化为十进制。

学会了signalTap的基本使用,对实验程序的调试很有帮助。还能观察内部数据的变换,直接对实验结果进行验证。

本文来源:https://www.bwwdw.com/article/lk3d.html

Top