VHDL的串行同步通信SPI设计说明_第1页
VHDL的串行同步通信SPI设计说明_第2页
VHDL的串行同步通信SPI设计说明_第3页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、课程设计课程名称.电子技术综合设计与实训SPI设计题目名称基于VHDL的串行同步通信学生学院自动化专业班级电子信息科学与技术学号_3107001554学生匠匪指导教师_蔡述庭2009年12月21日工业大学课程设计任务书题目名称基丁VHDLB申行同步通信SPI设计学生学院自动化专业班级电子信息科学与技术姓名振添3107001554一、课程设计的容设计一个同步串行通讯SPI二、课程设计的要求与数据设计要求包括:1. 深入了解串行通信的方案容和协议,思考设计方法。2. 设计串行通信方案,并写好传输程序VHDL下载到DE2板调试,检测其可行性。1. 三、课程设计应完成的工作利用VHD通言编程实现SPI

2、;利用DE2板对所设计的思想进行验证;总结VHD成计结果,撰写课程设计报告。四、课程设计进程安排设计各阶段容地点起止日期1任务的确定-spi实验2号楼21412.142查找资料实验2号楼30712.153编写SPI的各个模块VHDLS序实验2号楼21612.164仿真,分配管脚实验2号楼21412.175验证修改验收实验2号楼21412.186整理说明书,报告实验楼12.19五、应收集的资料及主要参考文献PIC单片机原理及应用(第3版)北京航天航空大学2 黄智伟,王彦FPG麻统设计与实践M发出任务书日期:年月计划完成日期:年月主管院长签章:北京:电子工业,2005日指导教师签名:日基层教学单位

3、责任人签章:摘要本设计是用Quartus作为开发环境,以DE2板为硬件平台实现的SPI同步申行通讯。设计过程方便。根据接收和发送两个主要部分实现了SPI的基本功能。此外,该设计还实现了波特率发生器,数码管显示的功能。用DE2板实现具有电路简洁,开发周期短的优点。充分利用了ED双计的优点。开发过程用了VHD应件描述语言进行描述,从底层设计,分模块进行,充分提高了设计者的数字逻辑设计的概念。关键词:SPI,同步申行通讯,Quartus,DE2K,VHDLJM件描述语言。2 1弓I言6SPI简介62.1SPI协议和工作原理63 2.2波特率7模块设计73.1顶层模块RTL综合73.2波特率发生器模块

4、93.3 SDCa据发送模块103.4 SDI数据接收模块114 3.5数码管显示模块12实验验证134.1实验验证方案选择134.2实验现象135结论与问题讨论135.1完成设计要求的程度135.2遇到的问题及解决方法145.3存在的不足及改进思路145.4心得体会14参考文献151引言申行扩展通信接口是器件间进行数据交换的平台和重要渠道。主控同步申行通信模块主要应用丁系统部近距离的申行通讯,如SPI,|AC等。SPI是英文SerialPeripheralInterface的缩写,中文意思是申行外围设备接口,SPI是Motorola公司推出的一种同步申行通讯方式,是一种三线同步总线,因其硬件

5、功能很强,与SPI有关的软件就相当简单,使CPUt更多的时间处理其他事务。2SPI简介2.1SPI协议和工作原理顾名思义,串行接口的数据传输方式是串行的,即数据是一位一位地进行传输虽然串行接口的传输方式导致其传输速度会比较慢,但是它却具有较强的抗干扰能力,并能有较长的传输距离,RS232口的最大传输距离为15mnSPI接口主要应用在EEPROMFLASH实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片

6、集成了这种通信协议,比如AT91RM9200.SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(单向传输时)。也是所有基于SPI的设备共有的,它们是SDI(数据输入),SDO(数据输出),SCK(时钟),CS(片选)。(1)SDO-主设备数据输出,从设备数据输入(2)SDI-主设备数据输入,从设备数据输出(3)SCLK-时钟信号,由主设备产生(4)CS-从设备使能信号,由主设备控制其中CS是控制芯片是否被选中的,也就是说只有片选信号为预先规定的使能信号时(高电位或低电位),对此芯片的操作才有效。这就允许在同一总线上连接多个S

7、PI设备成为可能。接下来就负责通讯的3根线了。通讯是通过数据交换完成的,这里先要知道SPI是串行通讯协议,也就是说数据是一位一位的传输的。这就是SCK时钟线存在的原因,由SC锥供时钟脉冲,SDI,SDCU基于此脉冲完成数据传输。数据输出通过SDO线,数据在时钟上升沿或下降沿时改变,在紧接着的下降沿或上升沿被读取。完成一位数据传输,输入也使用同样原理。这样,在至少8次时钟信号的改变(上沿和下沿为一次),就可以完成8位数据的传输。SPI是一个环形总线结构,由ss(cs)、sck、sdi、sdo构成,其时序其实很简单,主要是在sck的控制下,两个双向移位寄存器进行数据交换。假设下面的8位寄存器装的是

8、待发送的数据10101010,上升沿发送、下降沿接收、高位先发送。那么第一个上升沿来的时候数据将会是sdo=1;寄存器中的10101010左移一位,后面补入送来的一位未知数x,成了0101010xo下降沿到来的时候,sdi上的电平将锁存到寄存器中去,那么这时寄存器=0101010sdi,这样在8个时钟脉冲以后,两个寄存器的容互相交换一次。这样就完成里一个spi时序。2.2波特率这是一个衡量通信速度的参数。它表示每秒钟传送的bit的个数。例如300波特表示每秒钟发送300个bit。当我们提到时钟周期时,我们就是指波特率例如如果协议需要4800波特率,那么时钟是4800Hz。这意味着串口通信在数据

9、线上的采样率为4800Hz。通常线的波特率为14400,28800和36600。波特率可以远远大于这些值,但是波特率和距离成反比。串行口每秒发送或接收数据的码元数为传码,单位为波特,也叫波特率。若发送或接收一位数据所需时间为T,则波特率为1/T,相应的发送或接收时钟为1/THz。发送和接收设备的波特率应一致。位同步是实现收发双方的码元同步,由数据传输系统的同步控制电路实现。发送端由发送时钟的定时脉冲对数据序列取样再生,接收端由接收时钟的定时脉冲对接收数据序列取样判断,恢复原来的数据序列。因此,接收时钟和发送时钟必须同频同相,这是由接收端的定时提取和锁相环电路实现的。传码率与位同步必须同时满足。

10、否则,接收设备接收不到有效信息。3模块设计3.1顶层模块RTL综合顶层文件设计,将波特率发生模块,数据发送模块,数据接收模块,和数码显示模块通过例化语句组合成总的顶层模块。其中数据发送模块为并行输入串行输出模块,在时钟的上升沿发送一位数据,共需要8个时钟脉冲即可发送完一字节数据。数据接收模块为串行输入并行输出模块,串行输入的数据来自数据发送模块,在时钟的上升沿接收数据,即由“自己发送的数据自己同步接收”来模拟主从器件间数据的全双工传输。数码管显示模块则是循环显示08数字,每循环一次代表传输完一字节。以下是顶层模块VHDL源程序:libraryieee;useieee.std_logic_116

11、4.all;useieee.std_logic_unsigned.all;entityspiisport(clk,stop,load:instd_logic;data_in:std_logic_vector(7downto0);deng_out:outstd_logic_vector(7downto0);shuma_out:outstd_logic_vector(6downto0);endspi;architectureoneofspiiscomponentsdiport(clk_sdi:instd_logic;sdi_in:instd_logic;load:instd_logic;shuma

12、:outintegerrange0to8;sdi_out:outstd_logic_vector(7downto0);endcomponent;componentsdoport(clk_sdo,load:instd_logic;sdo_in:instd_logic_vector(7downto0);sdo_out:outstd_logic);endcomponent;componentSHUMGport(num:inINTEGERRANGE0TO8;dout:outstd_logic_vector(6downto0);endcomponent;componentfenpinport(clk,s

13、top:instd_logic;clok:outstd_logic);endcomponent;signalA,B:std_logic;signalC:INTEGERrange0to8;beginu1:sdiportmap(sdi_out=>deng_out,clk_sdi=>A,sdi_in=>B,shuma=>C,load=>load);u2:sdoportmap(sdo_out=>B,sdo_in=>data_in,load=>load,clk_sdo=>A);u3:SHUMGportmap(dout=>shuma_out,nu

14、m=>C);u4:fenpinportmap(clk=>clk,stop=>stop,clok=>A);endone;综合后为:3.2波特率发生器模块由于SPI同步串行通讯的缺点是波特率不高,通常常用的SPI波特率有2400,4800,9600,19200等比较低的波特率,晶振的频率一般都比较高,需要分频后才能供给SPI使用。假设采用6MHZ的晶振作为外部时钟,那么要产生9600波特率的时钟信号,则需要对6MHZ的时钟进行625分频。除此之外,为了提高接收电路接收数据的准确度,采取“过采样法”对发送来的同一个数据进行多次采样,这里对数据进行三次采样取平均值。输入6MHz

15、的时钟,经过计数分频后得到9600Hz的接收时钟信号和脉冲出现的频率是波特率的3倍的采样时钟信号。下面是实现该功能的VHDL程序:libraryieee;useieee.std_logic_1164.all;entityfenpinisport(clk,stop:instd_logic;clok,clk3:outstd_logic);endfenpin;architectureoneoffenpinisbeginprocess(clk)variablecounter:integerrange0to625;beginifstop='1'thenifclk'eventand

16、clk='1'thenifcounter=625thencounter:=0;clok<='1'elsecounter:=counter+1;clok<='0'endif;endif;if(counter=106orcounter=313orcounter=520)thenclk3<='1'elseclk3<='0'endif;endif;endprocess;endone;其中,clk为6MHz的时钟;clok为9600Hz的接收时钟;clk3为脉冲出现的频率是波特率的3倍的采样时钟。3.

17、3SDO数据发送模块发送电路是在时序脉冲的控制下,利用移位寄存器并行输入串行输出的把数据一位一位的送出去。VHDLW程序如下:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entitysdoisport(clk_sdo,load:instd_logic;sdo_in:instd_logic_vector(7downto0);sdo_out:outstd_logic);endsdo;architectureoneofsdoissignalbuff:std_logic_vector(7downto0);b

18、eginprocess(clk_sdo)beginifclk_sdo'eventandclk_sdo='1'thenifload='1'thenbuff<=sdo_in;elsebuff(7downto1)<=buff(6downto0);endif;endif;sdo_out<=buff(7);endprocess;endone;其中,sdo_in:instd_logic_vector(7downto0);为并行输入端口8位数据,clk_sdo为输入端口发送时钟;sdo_out:outstd_logic为输出串行端口;当load=&#

19、39;1则把待发送的数据送入数据缓冲区BUFF,然后根据时钟的上升沿的到来把数据一位一位的从缓冲器送给串行输出。如图所示,第一次装载待发送数据10101010,第二次装载待发送数据01010101于缓冲区,共2字节数据,从仿真图上可以看到,串行输出分贝输出了2字节数据:10101010,和01010101E-4»5一Tsd(i_i-zdoi-3.J.D-s-do-sdo-s4o-sdoQ1lUULUUUUUUUL'UUUULIULUUU.rnc"Trfo:-1III1iriH门ia3incnin.l侦卬J3.4SDI数据接收模块接收电路的功能是在时钟控制下,采样串行

20、输入端口上的数据,执行采样判断,检测帧同步标志,把后续数据依次送达对应的并行输出端口上。下面是实现上述功能的VHDL源程序:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entitysdiisport(clk_sdi:instd_logic;sdi_in:instd_logic;shuma:outintegerrange0to8;sdi_out:outstd_logic_vector(7downto0);endsdi;architectureoneofsdiissignalbuff:std_logic

21、_vector(7downto0);beginprocess(clk_sdi)variablecout:integerrange0to8;beginifclk_sdi'eventandclk_sdi='1'thenifcout=8thencout:=0;sdi_out<=buff;elsebuff(7-cout)<=sdi_in;cout:=cout+1;endif;endif;shuma<=cout;endprocess;endone;数据一位一位的接收,接收一位就把它存放于接收缓冲寄存器,等待缓冲器满后就并行输出数据由程序读取。如仿真图所示,串行传

22、来的两字节数据10101010和01010101,数码管循环显示从08,当显示8时代表缓冲器满,并串行输出数据,SDI_OUT为串行输出的数据。3.5数码管显示模块libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;entitySHUMGisport(num:inINTEGERRANGE0TO8;dout:outstd_logic_vector(6downto0);endSHUMG;architecturea1ofSHUMGisbeginwithnum

23、selectdout<="1111110"when0,"0110000"when1,"1101101"when2,"1111001"when3,"0110011"when4,"1011011"when5,"1011111"when6,"1110000"when7,"1111111"when8,"0000000"whenothers;enda1;8代表数据传输完数码管显示模块用来方便表示出数据

24、传输的过程,从08循环显示,毕准备传送或接收下一字节数据。4实验验证4.1实验验证方案选择由于要在DE2板上验证SPI有一定难度。我们的方案一就是利用串口调试助手,PC机作为从器件,目标板做为主器件进行SPI通讯。我们的方案二是完全在DE2板上模拟主从同步串行通讯,但是由于考虑到DE2板上可以用的验证设备(开关和LED灯)不够,所以我们决定在DE2版上对所设计的SPI模块进行调整,自己发送的数据自己接收,模拟实现了主从之间通过不串行通讯。在这里我们采用的是方案2,优点是易于实现。我们把SD破送数据模块直接接到了SDI数据接收模块,因此我们只要验证:通过发送以自己数据,待8个时序脉冲后数据发送完的同时也被接收,则说明我们的思路正确。4.2实验现象说明:开关SW8弋表LOA或据装载。开关SW9弋表时钟时能SW0SW7为发送数据的数据缓冲器,即发送模块数据输入端,存待发送的数据。LED0LED7读取数据接收模块的数据接收状态。数码管循环显示08.当我们拨动开关,准备好待发送数据时,先LOADS数据送入缓冲区,然后使时钟时能,这是开始发送和接收数据同步。数码管从08显示,当数码管显示8时,灯的状态与开关的状

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论