(已通过板级验证)
实验工具
AC620实验开发板
Quartus ii 18.0
VHDL
实验原理
下图为ADC器件的管脚:
IN0-IN7为八个输入的通道,可以选择任意通道作为输入,本次实验每次只选择一个通道。
SCLK为时钟输入,范围从3.2MHZ~8MHZ(AC620参考时钟为50MHZ,因此采用八分频时钟,SCLK=6.25MHZ)。
DIN为输入信号,输入控制通道地址信号,SCLK的上升沿采样输入
DOUT为输出信号,在SCLK的下降沿输出,每次输出一位数据,一次转换从高到低总共输出12位数字信号。
ADC时序
如下图所示,一个串行转换(帧)开始于 c s ‾ \overline{cs} cs的下降沿,结束于 c s ‾ \overline{cs} cs的上升沿。每次ADC的转换包含16个SCLK信号,前三个SCLK为采样模式(track),后13个SCLK信号为保持模式(hold)。
DIN:control register一共有八个控制寄存器,采用bit3-bit5表示ADD0-ADD2,代表8个输入通道的地址。比如000代表选择第0个通道作为输入。
对于DOUT,ADC在前4个SCLK的下降沿输出为前导0,然后在剩下的13个SCLK的下降沿输出转换后的数据,因此,ADC_driver需要在SCLK的上升沿采集DOUT信号。
实验要求
通过ADC128S052模数转换芯片和线性序列机实现模拟信号转数字信号,并用七段显示器显示转换后的结果。
channel[2:0]: 八通道输入控制信号
clk_par: SCLK频率控制信号,SCLK为 (clk/(clk_par2)) ,(50MHZ/(42))= 6.25MHZ
start: 脉冲使能信号,使能单次转换
DOUT: 接收ADC芯片转换输出的数据
SCLK: ADC 串行数据接口时钟信号
CS_N:ADC串行数据接口使能信号
DIN: ADC 控制信号,从高到低依次输出channel的数据
ADC_STATE: ADC的工作状态。0:工作,1:空闲
conv_done:脉冲信号,代表一次转换完成
data[11:0]: ADC一次转换的结果,将串行的DOUT信号变成并行的data输出。
线性状态机时序:
ADC_CNT: 每12.5MHZ(80ns)后加1。
ADC_CNT | 信号变化 | ADC_CNT | 信号变化 |
---|---|---|---|
0 | CS_N=1;SCLK=1;DIN=0 | 18 | SCLK=0; |
1 | SCLK=1; CS_N=0; | 19 | SCLK=1; data(7) = DOUT; |
2 | SCLK=0; | 20 | SCLK=0; |
3 | SCLK=1; | 21 | SCLK=1; data(6) = DOUT; |
4 | SCLK=0; | 22 | SCLK=0; |
5 | SCLK=1; | 23 | SCLK=1; data(5) = DOUT; |
6 | SCLK=0; DIN=ADD2; | 24 | SCLK=0; |
7 | SCLK=1; | 25 | SCLK=1;data(4) = DOUT; |
8 | SCLK=0; DIN=ADD1; | 26 | SCLK=0; |
9 | SCLK=1; | 27 | SCLK=1;data(3) = DOUT; |
10 | SCLK=0; DIN=ADD0; | 28 | SCLK=0; |
11 | SCLK=1; data(11) = DOUT; | 29 | SCLK=1;data(2) = DOUT; |
12 | SCLK=0; | 30 | SCLK=0; |
13 | SCLK=1; data(10) = DOUT; | 31 | SCLK=1;data(1) = DOUT; |
14 | SCLK=0; | 32 | SCLK=0; |
15 | SCLK=1; data(9) = DOUT; | 33 | SCLK=1;data(0) = DOUT; |
16 | SCLK=0; | 34 | CS_N=1; |
17 | SCLK=1; data(8) = DOUT; |
代码实现
----------------将地址寄存到寄存器中,防止在读取地址的时候地址改变-----
----------------------每一次脉冲使能信号start读取一次地址------------
process(clk)
begin
if(nrst = '0') then
r_channel