logo资料库

VHDL的SPI控制.doc

第1页 / 共13页
第2页 / 共13页
第3页 / 共13页
第4页 / 共13页
第5页 / 共13页
第6页 / 共13页
第7页 / 共13页
第8页 / 共13页
资料共13页,剩余部分请下载后查看
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
分享到:
收藏