VHDL的串行同步通信SPI设计

  • 格式:doc
  • 大小:310.50 KB
  • 文档页数:15

课程设计课程名称_电子技术综合设计与实训题目名称基于VHDL的串行同步通信SPI设计学生学院_ 自动化____________专业班级_电子信息科学与技术____学号__3107001554__________学生姓名____陈振添_____________指导教师____蔡述庭__________2009年12 月21 日广东工业大学课程设计任务书题目名称基于VHDL的串行同步通信SPI设计学生学院自动化专业班级电子信息科学与技术姓名陈振添学号3107001554一、课程设计的内容设计一个同步串行通讯SPI二、课程设计的要求与数据设计要求包括:1.深入了解串行通信的方案内容和协议,思考设计方法。

2.设计串行通信方案,并写好传输程序VHDL。

3.下载到DE2板调试,检测其可行性。

三、课程设计应完成的工作1. 利用VHDL语言编程实现SPI;2. 利用DE2板对所设计的思想进行验证;3. 总结VHDL设计结果,撰写课程设计报告。

四、课程设计进程安排五、应收集的资料及主要参考文献[1] PIC单片机原理及应用(第3版)北京航天航空大学出版社[2] 黄智伟,王彦·FPGA系统设计与实践[M]·北京:电子工业出版社,2005发出任务书日期:年月日指导教师签名:计划完成日期:年月日基层教学单位责任人签章:主管院长签章:摘要本设计是用Quartus作为开发环境,以DE2板为硬件平台实现的SPI同步串行通讯。

设计过程方便。

根据接收和发送两个主要部分实现了SPI的基本功能。

此外,该设计还实现了波特率发生器,数码管显示的功能。

用DE2板实现具有电路简洁,开发周期短的优点。

充分利用了EDA设计的优点。

开发过程用了VHDL硬件描述语言进行描述,从底层设计,分模块进行,充分提高了设计者的数字逻辑设计的概念。

关键词:SPI,同步串行通讯,Quartus,DE2板,VHDL硬件描述语言。

目录1引言 (6)2 SPI简介 (6)2.1SPI协议和工作原理 (6)2.2波特率 (7)3 模块设计 (7)3.1顶层模块RTL综合 (7)3.2波特率发生器模块 (9)3.3SDO数据发送模块 (10)3.4SDI数据接收模块 (11)3.5数码管显示模块 (12)4实验验证 (13)4.1实验验证方案选择 (13)4.2实验现象 (13)5 结论与问题讨论 (13)5.1完成设计要求的程度 (13)5.2遇到的问题及解决方法 (14)5.3存在的不足及改进思路 (14)5.4心得体会 (14)参考文献 (15)1引言串行扩展通信接口是器件间进行数据交换的平台和重要渠道。

主控同步串行通信模块主要应用于系统内部近距离的串行通讯,如SPI,I^C等。

SPI是英文Serial Peripheral Interface的缩写,中文意思是串行外围设备接口,SPI是Motorola公司推出的一种同步串行通讯方式,是一种三线同步总线,因其硬件功能很强,与SPI有关的软件就相当简单,使CPU有更多的时间处理其他事务。

2 SPI简介2.1 SPI协议和工作原理顾名思义,串行接口的数据传输方式是串行的,即数据是一位一位地进行传输虽然串行接口的传输方式导致其传输速度会比较慢,但是它却具有较强的抗干扰能力,并能有较长的传输距离,RS232口的最大传输距离为15m。

SPI接口主要应用在EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。

SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,现在越来越多的芯片集成了这种通信协议,比如AT91RM9200. SPI的通信原理很简单,它以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(单向传输时)。

也是所有基于SPI的设备共有的,它们是SDI(数据输入),SDO(数据输出),SCK(时钟),CS(片选)。

(1)SDO - 主设备数据输出,从设备数据输入(2)SDI - 主设备数据输入,从设备数据输出(3)SCLK - 时钟信号,由主设备产生(4)CS - 从设备使能信号,由主设备控制其中CS是控制芯片是否被选中的,也就是说只有片选信号为预先规定的使能信号时(高电位或低电位),对此芯片的操作才有效。

这就允许在同一总线上连接多个SPI设备成为可能。

接下来就负责通讯的3根线了。

通讯是通过数据交换完成的,这里先要知道SPI是串行通讯协议,也就是说数据是一位一位的传输的。

这就是SCK时钟线存在的原因,由SCK提供时钟脉冲,SDI,SDO则基于此脉冲完成数据传输。

数据输出通过SDO线,数据在时钟上升沿或下降沿时改变,在紧接着的下降沿或上升沿被读取。

完成一位数据传输,输入也使用同样原理。

这样,在至少8次时钟信号的改变(上沿和下沿为一次),就可以完成8位数据的传输。

SPI是一个环形总线结构,由ss(cs)、sck、sdi、sdo构成,其时序其实很简单,主要是在sck的控制下,两个双向移位寄存器进行数据交换。

假设下面的8位寄存器装的是待发送的数据10101010,上升沿发送、下降沿接收、高位先发送。

那么第一个上升沿来的时候数据将会是sdo=1;寄存器中的10101010左移一位,后面补入送来的一位未知数x,成了0101010x。

下降沿到来的时候,sdi上的电平将锁存到寄存器中去,那么这时寄存器=0101010sdi,这样在8个时钟脉冲以后,两个寄存器的内容互相交换一次。

这样就完成里一个spi时序。

2.2波特率这是一个衡量通信速度的参数。

它表示每秒钟传送的bit的个数。

例如300波特表示每秒钟发送300个bit。

当我们提到时钟周期时,我们就是指波特率例如如果协议需要4800波特率,那么时钟是4800Hz。

这意味着串口通信在数据线上的采样率为4800Hz。

通常电话线的波特率为14400,28800和36600。

波特率可以远远大于这些值,但是波特率和距离成反比。

串行口每秒发送或接收数据的码元数为传码,单位为波特,也叫波特率。

若发送或接收一位数据所需时间为T,则波特率为1 /T,相应的发送或接收时钟为1 /T Hz 。

发送和接收设备的波特率应一致。

位同步是实现收发双方的码元同步,由数据传输系统的同步控制电路实现。

发送端由发送时钟的定时脉冲对数据序列取样再生,接收端由接收时钟的定时脉冲对接收数据序列取样判断,恢复原来的数据序列。

因此,接收时钟和发送时钟必须同频同相,这是由接收端的定时提取和锁相环电路实现的。

传码率与位同步必须同时满足。

否则,接收设备接收不到有效信息。

3 模块设计3.1 顶层模块RTL综合顶层文件设计,将波特率发生模块,数据发送模块,数据接收模块,和数码显示模块通过例化语句组合成总的顶层模块。

其中数据发送模块为并行输入串行输出模块,在时钟的上升沿发送一位数据,共需要8个时钟脉冲即可发送完一字节数据。

数据接收模块为串行输入并行输出模块,串行输入的数据来自数据发送模块,在时钟的上升沿接收数据,即由“自己发送的数据自己同步接收”来模拟主从器件间数据的全双工传输。

数码管显示模块则是循环显示0~8数字,每循环一次代表传输完一字节。

以下是顶层模块VHDL源程序:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity spi isport(clk,stop,load: in std_logic;data_in: std_logic_vector(7 downto 0 );deng_out : out std_logic_vector(7 downto 0 );shuma_out : out std_logic_vector(6 downto 0 ));end spi;architecture one of spi iscomponent sdiport(clk_sdi : in std_logic;sdi_in : in std_logic;load : in std_logic;shuma:out integer range 0 to 8;sdi_out : out std_logic_vector(7 downto 0 ));end component;component sdoport(clk_sdo,load : in std_logic;sdo_in : in std_logic_vector(7 downto 0);sdo_out : out std_logic);end component;component SHUMGport(num:in INTEGER RANGE 0 TO 8;dout:out std_logic_vector(6 downto 0));end component;component fenpinport(clk,stop:in std_logic;clok:out std_logic);end component;signal A,B : std_logic;signal C : INTEGER range 0 to 8;beginu1:sdi port map(sdi_out=>deng_out,clk_sdi=>A,sdi_in=>B,shuma=>C,load=>load); u2:sdo port map(sdo_out=>B,sdo_in=>data_in,load=>load,clk_sdo=>A);u3:SHUMG port map(dout=>shuma_out,num=>C);u4:fenpin port map(clk=>clk,stop=>stop,clok=>A);end one ;综合后为:3.2波特率发生器模块由于SPI同步串行通讯的缺点是波特率不高,通常常用的SPI波特率有2400,4800,9600,19200等比较低的波特率,晶振的频率一般都比较高,需要分频后才能供给SPI使用。

假设采用6MHZ的晶振作为外部时钟,那么要产生9600波特率的时钟信号,则需要对6MHZ 的时钟进行625分频。

除此之外,为了提高接收电路接收数据的准确度,采取“过采样法”对发送来的同一个数据进行多次采样,这里对数据进行三次采样取平均值。

输入 6 MHz 的时钟,经过计数分频后得到9 6 0 0 Hz的接收时钟信号和脉冲出现的频率是波特率的3倍的采样时钟信号。