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

下载本文档

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

文档简介

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

2、试,检测其可行性。三、课程设计应完成的工作1. 利用VHDL语言编程实现SPI; 2. 利用DE2板对所设计的思想进行验证; 3. 总结VHDL设计结果,撰写课程设计报告。四、课程设计进程安排序号设计各阶段内容地点起止日期1任务的确定-spi实验2号楼21412.142查找资料实验2号楼30712.153编写SPI的各个模块VHDL程序实验2号楼21612.164仿真,分配管脚实验2号楼21412.175验证修改 验收实验2号楼21412.186整理说明书,报告实验楼12.19五、应收集的资料及主要参考文献1PIC单片机原理及应用(第3版) 北京航天航空大学出版社2黄智伟,王彦·FP

3、GA系统设计与实践M·北京:电子工业出版社,2005发出任务书日期: 年 月 日 指导教师签名:计划完成日期: 年 月 日 基层教学单位责任人签章:主管院长签章:摘 要本设计是用Quartus作为开发环境,以DE2板为硬件平台实现的SPI同步串行通讯。设计过程方便。根据接收和发送两个主要部分实现了SPI的基本功能。此外,该设计还实现了波特率发生器,数码管显示的功能。用DE2板实现具有电路简洁,开发周期短的优点。充分利用了EDA设计的优点。开发过程用了VHDL硬件描述语言进行描述,从底层设计,分模块进行,充分提高了设计者的数字逻辑设计的概念。关键词:SPI,同步串行通讯,Quartus

4、,DE2板,VHDL硬件描述语言。目 录1引言62 SPI简介62.1 SPI协议和工作原理62.2波特率73 模块设计73.1 顶层模块RTL综合73.2波特率发生器模块83.3 SDO数据发送模块93.4 SDI数据接收模块103.5 数码管显示模块114实验验证124.1实验验证方案选择124.2实验现象125 结论与问题讨论125.1完成设计要求的程度125.2遇到的问题及解决方法135.3存在的不足及改进思路135.4心得体会13参考文献141引言 串行扩展通信接口是器件间进行数据交换的平台和重要渠道。主控同步串行通信模块主要应用于系统内部近距离的串行通讯,如SPI,IC等。SPI是

5、英文Serial Peripheral Interface的缩写,中文意思是串行外围设备接口,SPI是Motorola公司推出的一种同步串行通讯方式,是一种三线同步总线,因其硬件功能很强,与SPI有关的软件就相当简单,使CPU有更多的时间处理其他事务。2 SPI简介2.1 SPI协议和工作原理顾名思义,串行接口的数据传输方式是串行的,即数据是一位一位地进行传输 虽然串行接口的传输方式导致其传输速度会比较慢,但是它却具有较强的抗干扰能力,并能有较长的传输距离,RS232口的最大传输距离为15m。SPI接口主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码

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

7、号,由主设备产生(4)CS - 从设备使能信号,由主设备控制其中CS是控制芯片是否被选中的,也就是说只有片选信号为预先规定的使能信号时(高电位或低电位),对此芯片的操作才有效。这就允许在同一总线上连接多个SPI设备成为可能。接下来就负责通讯的3根线了。通讯是通过数据交换完成的,这里先要知道SPI是串行通讯协议,也就是说数据是一位一位的传输的。这就是SCK时钟线存在的原因,由SCK提供时钟脉冲,SDI,SDO则基于此脉冲完成数据传输。数据输出通过 SDO线,数据在时钟上升沿或下降沿时改变,在紧接着的下降沿或上升沿被读取。完成一位数据传输,输入也使用同样原理。这样,在至少8次时钟信号的改变(上沿和

8、下沿为一次),就可以完成8位数据的传输。SPI是一个环形总线结构,由ss(cs)、sck、sdi、sdo构成,其时序其实很简单,主要是在sck的控制下,两个双向移位寄存器进行数据交换。假设下面的8位寄存器装的是待发送的数据10101010,上升沿发送、下降沿接收、高位先发送。那么第一个上升沿来的时候 数据将会是sdo=1;寄存器中的10101010左移一位,后面补入送来的一位未知数x,成了0101010x。下降沿到来的时候,sdi上的电平将锁存到寄存器中去,那么这时寄存器=0101010sdi,这样在 8个时钟脉冲以后,两个寄存器的内容互相交换一次。这样就完成里一个spi时序。2.2波特率这是

9、一个衡量通信速度的参数。它表示每秒钟传送的bit的个数。例如300波特表示每秒钟发送300个bit。当我们提到时钟周期时,我们就是指波特率例如如果协议需要4800波特率,那么时钟是4800Hz。这意味着串口通信在数据线上的采样率为4800Hz。通常电话线的波特率为14400,28800和36600。波特率可以远远大于这些值,但是波特率和距离成反比。串行 口每秒发送或接收数据的码元数为传码 ,单位为波特,也叫波特率。若发送或接收一位数据所需时间为 T,则波特率为 1 T,相应的发送 或接收时钟为 1 T Hz 。发送和接收设备的波特率应 一致。位 同步是实现收发双方的码元同步,由数据传输系统的同

10、步控制电路实现。发送端由发送时钟 的定时脉冲对数据序列取样再生,接收端由接收时 钟的定时脉冲对接收数据序列取样判断,恢复原来 的数据序列。因此,接收时钟和发送时钟必须同频 同相,这是由接收端的定时提取和锁相环 电路实现 的。传码率与位同步必须同时满足 。否则,接收设备接收不到有效信息。 3 模块设计3.1 顶层模块RTL综合顶层文件设计,将波特率发生模块,数据发送模块,数据接收模块,和数码显示模块通过例化语句组合成总的顶层模块。其中数据发送模块为并行输入串行输出模块,在时钟的上升沿发送一位数据,共需要8个时钟脉冲即可发送完一字节数据。数据接收模块为串行输入并行输出模块,串行输入的数据来自数据发

11、送模块,在时钟的上升沿接收数据,即由“自己发送的数据自己同步接收”来模拟主从器件间数据的全双工传输。数码管显示模块则是循环显示08数字,每循环一次代表传输完一字节。以下是顶层模块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

12、);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_log

13、ic; 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 : INT

14、EGER 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); en

15、d one ;综合后为:3.2波特率发生器模块由于SPI同步串行通讯的缺点是波特率不高,通常常用的SPI波特率有2400,4800,9600,19200等比较低的波特率,晶振的频率一般都比较高,需要分频后才能供给SPI使用。假设采用6MHZ的晶振作为外部时钟,那么要产生9600波特率的时钟信号,则需要对6MHZ的时钟进行625分频。除此之外,为了提高接收电路接收数据的准确度,采取“过采样法”对发送来的同一个数据进行多次采样,这里对数据进行三次采样取平均值。输入 6 MHz 的时钟 ,经过计数分频后得到 9 6 0 0 Hz的接收时钟信号和脉冲出现的频率是波特率的3倍的采样时钟信号。下面是实现该

16、功能的VHDL程序:library ieee; use ieee.std_logic_1164.all; entity fenpin is port(clk,stop:in std_logic;clok,clk3:out std_logic); end fenpin;architecture one of fenpin is beginprocess(clk)variable counter:integer range 0 to 625; beginif stop = '1' thenif clk'event and clk='1'thenif coun

17、ter=625 then counter:=0;clok<='1'else counter:=counter+1;clok<='0'end if;end if;if(counter=106 or counter=313 or counter=520)then clk3<='1'else clk3<='0'end if;end if;end process;end one; 其中,c l k为 6 MHz的时钟;c l o k 为 9 6 0 0 Hz 的接收时钟;c l k3为脉冲出现的频率是波特率的 3

18、倍的采样时钟。3.3 SDO数据发送模块发送电路是在时序脉冲的控制下,利用移位寄存器并行输入串行输出的把数据一位一位的送出去。VHDL源程序如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity sdo isport(clk_sdo,load : in std_logic; sdo_in : in std_logic_vector(7 downto 0); sdo_out : out std_logic);end sdo;architecture one of sdo issignal

19、 buff : std_logic_vector(7 downto 0);beginprocess(clk_sdo)beginif clk_sdo'event and clk_sdo = '1' thenif load = '1' thenbuff<=sdo_in;else buff(7 downto 1) <= buff(6 downto 0);end if;end if;sdo_out <= buff (7);end process;end one ;其中,sdo_in : in std_logic_vector(7 downto

20、0); 为并行输入端 口 8位数据,clk_sdo为输入端口发送时钟;sdo_out : out std_logic为输出串行端口;当 load=1,则把待发送的数据送入数据缓冲区BUFF,然后根据时钟的上升沿的到来把数据一位一位的从缓冲器送给串行输出。如图所示,第一次装载待发送数据10101010,第二次装载待发送数据01010101于缓冲区,共2字节数据,从仿真图上可以看到,串行输出分贝输出了2字节数据:10101010,和01010101 3.4 SDI数据接收模块接收电路的功能是在时钟控制下,采样串行输 入端口上的数据,执行采样判断, 检测帧同步标志, 把后续数据依次送达对应的并行输出

21、端口上。下面 是实现上述功能的 VHDL源程序: library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity sdi isport(clk_sdi : in std_logic; sdi_in : in std_logic; shuma:out integer range 0 to 8; sdi_out : out std_logic_vector(7 downto 0 );end sdi;architecture one of sdi issignal buff : std_logic_vec

22、tor(7 downto 0);beginprocess(clk_sdi)variable cout : integer range 0 to 8 ;beginif clk_sdi'event and clk_sdi = '1' thenif cout=8 then cout:=0;sdi_out<=buff;else buff(7-cout)<=sdi_in;cout := cout + 1 ; end if;end if;shuma <= cout;end process;end one ;数据一位一位的接收,接收一位就把它存放于接收缓冲寄存器,等

23、待缓冲器满后就并行输出数据由程序读取。如仿真图所示,串行传来的两字节数据10101010和01010101,数码管循环显示从08,当显示8时代表缓冲器满,并串行输出数据,SDI_OUT为串行输出的数据。3.5 数码管显示模块library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity SHUMG is port(num:in INTEGER RANGE 0 TO 8;dout:out std_logic_vector(6 downto 0)

24、;end SHUMG;architecture a1 of SHUMG isbeginwith num selectdout<="1111110" when 0, "0110000" when 1, "1101101" when 2, "1111001" when 3, "0110011" when 4, "1011011" when 5, "1011111" when 6, "1110000" when 7, "111

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

温馨提示

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

评论

0/150

提交评论