AD9516-3 的 SPI 控制
摘要:本文着重使用 VHDL 语言对 AD9516-3 进行软件仿真配置。通过输入输出的波形来查看是否配置正确。
题目分析:
1. 题目:1)仔细阅读AD9516-3 Datasheet,要求通过SPI配置芯片寄存器使其功能如下:
输入源时钟为10MHz,使用芯片内部VCO。
要求全部差分输出,OUT0-OUT3输出122.88MHz;OUT4-OUT5输出61.44MHz;OUT6-OUT9输出
30.72MHz。
2)设计要点: EDA厂商标准格式Datasheet阅读与理解。
HDL的设计方法尤其是状态机的设计方法。
SPI总线的配置方法。
2.通过阅读该芯片的数据手册,可以知道:所有的设置都是选择需要用的寄存器,按要求给出相关数据;
然后按照Datasheet中SERIAL CONTROL PORT 写控制字的格式将寄存器和数据组合成24位的二进制数,依据
写控制字的方式写入芯片即可。
设计:
通过阅读数据手册我们需要以下数据:
1、核心数据:
选择 AD9516 的 REFIN1 端口作为 10M 的源时钟
1)使用芯片内部 VCO
配置 0x1E1=00000010;则必选择 VCO divider 0x1E0=00000010(4 分频); 14-bit R divider Bits[7:0](LSB)0X011=01111101
Bits[13:8](MSB)0X12=00000000(R=125) 6-bit A counter 0X13=00000000 13-bit B counter Bits[7:0](LSB)0X14=00000000
Bits[12:8](MSB)0X15=00001100(B=3072) Prescaler P 0X16=00000100 (Divide-by-8 (8/9 mode))
2)全部差分输出
OUT0-OUT9: 0x0F0=00001000; 0x0F1=00001010; 0x0F2=00001000; 0x0F3=00001000; 0x0F4=00001000;
0x0F5=00001000; 0x140=01000010; 0x141=01000010; 0x142=01000010; 0x143=01000010;
i) OUT0-OUT3 输出 122.88MHz
Divider 0 0x190=00010001;
Divider 1 0x193=00010001;
ii) OUT4-OUT5 输出 61.44MHz
Divider 2 0x196=00110011
iii) OUT6-OUT9 输出 30.72MHz
Divider 3.1 0x199=00010001;Divider 3.2 0x19B=00010001
Divider 4.1 0x19E=00010001;Divider 4.2 0x1A0=00010001;
这些数据的输入和处理,手工操作太慢,效率不高。所以选择使用 AD9516_17_18 Evaluation Software 来
产生需要的数据,使用 MATLAB 进行数据处理,得到 68 组 24 位的二进制数(数据见附录 1,MATLAB 程序见
附录二)。其中有很多数据都是寄存器的默认值,无需再写。这为状态机的代码编写提供了便利。
程序设计
我们做了两个 VHDL 程序,一个使用两个状态机嵌套传递数据,一个状态机控制数据何时
传送,另一个状态机控制数据传送顺序,在 CS=0 时分状态串行传出相应数据;另一个使
用 ROM 存储数据,每次遇到 CS=0;传出一条 24 位指令数据,所有传输结束后,有一个信
号将拉高,表示芯片配置结束。
程序一:将 68 组数据全部存到芯片的 ROM 里,按时钟依次读写,直到读写结束(程序见
附录二)。部分波形如下:
程序二:建立 3 个控制写的状态:idle:空闲状态,data:写数据状态,stop:突发意外停
止状态;数据状态设置 data1,data2,data3;这里,根据我们对 DATASHEET 和 SPI 协议的
理解,并没有讲多个控制字序列不可以连起来在 CS 置低的时候传输到芯片上。所以我们
将控制字连起来,分三个状态写(使用数据和上一程序不同,见附录一,本程序见附录二)。
部分波形如下:
总结:
这次课程设计使用评估板软件减轻了数据组织方面的工作量,尤其是在使用 ROM 时,
显得很方便,而且程序具有一般性。但是如果严格按照要求写状态机,那在状态机的程序
里的任务也相当繁重,数据的状态会导致程序很长。通过这次数字系统课程设计,我们基
本熟悉了 VHDL 语言的使用,虽然在程序的编写过程中遇到了一些问题,但我们还是通过
查阅相关资料,一起讨论,把问题解决了。
附录一
68 组数据(程序一):
000000000000000000011000
000000000000000100000000
000000000000001000010000
000000000000001101000011
000000000000010000000000
000000000001000001111101
000000000001000101111101
000000000001001000000000
000000000001001100000000
000000000001010000000000
000000000001010100001100
000000000001011000000100
000000000001011100000000
000000000001100000000110
000000000001100100000000
000000000001101000000000
000000000001101100000000
000000000001110000000000
000000000001110100000000
000000000001111000000000
000000000001111100001110
000000001010000000000001
000000001010000100000000
000000001010001000000000
000000001010001100000001
000000001010010000000000
000000001010010100000000
000000001010011000000001
000000001010011100000000
000000001010100000000000
000000001010100100000001
000000001010101000000000
000000001010101100000000
000000001111000000001000
000000001111000100001000
000000001111001000001000
000000001111001100001000
000000001111010000001000
000000001111010100001000
000000010100000001000010
000000010100000101000010
000000010100001001000010
000000010100001101000010
000000011001000000010001
000000011001000100000000
000000011001001000000000
000000011001001100010001
000000011001010000000000
000000011001010100000000
000000011001011000110011
000000011001011100000000
000000011001100000000000
000000011001100100010001
000000011001101000000000
000000011001101100010001
000000011001110000000000
000000011001110100000000
000000011001111000010001
000000011001111100000000
000000011010000000010001
000000011010000100000000
000000011010001000000000
000000011010001100000000
000000011110000000000010
000000011110000100000010
000000100011000000000000
000000100011000100000000
000000100011001000000000
MIF 文件中的数据只需要将十进制的粘贴进去(如下)
36 组数据(程序二使用)
000000000000000000011000
000000000000000100000000
000000000000001000010000
000000000000001101000011
000000000000010000000000
000000000001000101111101
000000000001001000000000
000000000001001100000000
000000000001010000000000
000000000001010100001100
000000000001011000000100
000000000001111100001110
000000001111000000001000
000000001111000100001000
000000001111001000001000
000000001111001100001000
000000001111010000001000
000000001111010100001000
000000010100000001000010
000000010100000101000010
000000010100001001000010
000000010100001101000010
000000011001000000010001
000000011001000100000000
000000011001001000000000
000000011001001100010001
000000011001011000110011
000000011001100100010001
000000011001101100010001
000000011001110000000000
000000011001110100000000
000000011001111000010001
000000011010000000010001
000000011110000000000010
000000011110000100000010
000000100011001000000000
附录二:
MATLAB 程序,只需将评估板产生的 txt 文件中所有的双引号替为单引号,复制到矩阵 a,运行就可以得
到数据
clear;
clc;
a=['0000','00011000','18'
'0001','00000000','00'
'0002','00010000','10'
'0003','01000011','43'
'0004','00000000','00'
'0010','01111101','7D'
'0011','01111101','7D'
'0012','00000000','00'
'0013','00000000','00'
'0014','00000000','00'
'0015','00001100','0C'
'0016','00000100','04'
'0017','00000000','00'
'0018','00000110','06'
'0019','00000000','00'
'001A','00000000','00'
'001B','00000000','00'
'001C','00000000','00'
'001D','00000000','00'
'001E','00000000','00'
'001F','00001110','0E'
'00A0','00000001','01'
'00A1','00000000','00'
'00A2','00000000','00'
'00A3','00000001','01'
'00A4','00000000','00'
'00A5','00000000','00'
'00A6','00000001','01'
'00A7','00000000','00'
'00A8','00000000','00'
'00A9','00000001','01'
'00AA','00000000','00'
'00AB','00000000','00'
'00F0','00001000','08'
'00F1','00001000','08'
'00F2','00001000','08'
'00F3','00001000','08'
'00F4','00001000','08'
'00F5','00001000','08'
'0140','01000010','42'
'0141','01000010','42'
'0142','01000010','42'
'0143','01000010','42'
'0190','00010001','11'
'0191','00000000','00'
'0192','00000000','00'
'0193','00010001','11'
'0194','00000000','00'
'0195','00000000','00'
'0196','00110011','33'
'0197','00000000','00'
'0198','00000000','00'
'0199','00010001','11'
'019A','00000000','00'
'019B','00010001','11'
'019C','00000000','00'
'019D','00000000','00'
'019E','00010001','11'
'019F','00000000','00'
'01A0','00010001','11'
'01A1','00000000','00'
'01A2','00000000','00'
'01A3','00000000','00'
'01E0','00000010','02'
'01E1','00000010','02'
'0230','00000000','00'
'0231','00000000','00'
'0232','00000000','00'];
n=size(a);
n(1,1)
b1=num2str(a(1:n(1,1),2:4));
c1=hex2dec(b1);
c1=dec2bin(c1,12);
d(1:n(1,1),2:5)='0';
d(1:n(1,1),6:17)=c1(1:n(1,1),:);
d(1:n(1,1),18:25)=a(1:n(1,1),5:12);
%d(1:68,1:1)='"';
%d(1:68,26:26)='"';
d
bin2dec(d)
程序一:
--SPI(ROM 的文件是自动生成的,所以没有列出)
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
--------------------------------
entity spi is