摘要:本论文使用VHDL语言设计快速SPI核。在设计中介绍SPI的工作原理,并用VHDL语言来编写源代码,应用QuartusⅡ软件实现仿真,最后在硬件上实现和测试,实现主器件对从器件的控制,数据传送及从器件对主器件的数据反馈的全双工通信过程。在本次设计中,采用分块的设计方法,将设计分成三大块:并行数据串行移位,分频和模式选择。因此,只要分别对各个模块的功能进行设计,对各部分软件模块的调试采取分步调试,最后再将各模块组合进行综合和调试,最终完成设计。
论文关键词:SPI,VHDL,分频,模式选择
1.1设计简介
目前控制系统微型化的要求越来越高,为了使数字处理系统微型化,必须舍弃常用的并行总线接口方案,采用只需少量引脚线的串行总线接口方案。SPI接口的英文全称是Serial Peripheral Interface,可以翻译为串行外围设备接口。因为它是同步串行通讯的,通常称为同步串口。SPI总线是一种三线同步总线,因其硬件能力很强,与SPI有关的软件就相当简单,使CPU有更多的时间处理其它事务,因此得到广泛应用。SPI实际上是一种串行总线标准,它是一种真正的同步方式,两台设备在同一个时钟下工作,因此传输速率高达几十兆。现在与SPI总线兼容的芯片越来越多,因此,SPI为控制系统的设计带来了很大方便。例如,SPI接口提供了单片机和外围期间短距离高速通讯的接口,主模式下最高速度可以达到系统时钟的二分之一。很多器件是SPI接口的从设备比如一些EEPROM,比如AT25128;有些LCD,比如PG12864-N;有的FLASH芯片也是SPI接口的。SPI接口也可以作为CPU之间通讯的方式。该接口一般使用4条线:串行时钟线(SCK)、主机输入/从机输出数据线MISO、主机输出/从机输入数据线MOST和低电平有效的从机选择线SS。SPI有主、从两种工作模式,SPI的结构通过两类寄存器来体现:数据类寄存器和控制类寄存器。在使用SPI工作方式之前必须对含有SPI接口的模块做初始化的工作,主要是在SSPCON寄存器和SSPTAT寄存器中设置相关的标志位。
2 SPI原理简介
2.1 SPI的概述
SPI(Serial Peripheral Interface--串行外设接口)总线系统是一种同步串行外设接口,它可以使MCU与各种外围设备以串行方式进行通信以交换信息。外围设置FLASHRAM、网络控制器、LCD显示驱动器、A/D转换器和MCU等。SPI总线系统可直接与各个厂家生产的多种标准外围器件直接接口,该接口一般使用4条线:串行时钟线(SCK)、主机输入/从机输出数据线MISO、主机输出/从机输入数据线MOST和低电平有效的从机选择线SS(有的SPI接口芯片带有中断信号线INT或INT、有的SPI接口芯片没有主机输出/从机输入数据线MOSI)。由于SPI系统总线一共只需3~4位数据线和控制即可实现与具有SPI总线接口功能的各种I/O器件进。行接口,而扩展并行总线则需要8根数据线、8~16位地址线、2~3位控制线,因此,采用SPI总线接口可以简化电路设计,节省很多常规电路中的接口器件和I/O口线,提高设计的可靠性。
2.2 SPI总线的组成
SDI引脚-—串行数据输入(Serial Data Input)
SDO引脚--串行数据输出(Serial Data Output)
SCK引脚――串行时钟(Serial Clock)
SS引脚――从动选择(Slave Select)
2.3 SPI主控方式
由于控制时钟SCK的输出,主控模式可以在任何时候开始数据的传输。主控模式通过软件协议控制从动模式数据输出。
在主控模式,一旦SSPBUF寄存器写入,数据就会发送或接收。如果SPI模式只考虑接收,可以禁止SDO工作(软件设置为输入)。在接收数据时,SSPSR寄存器按照时钟速率移位,一旦接收到一个字节,数据就传输到SSPBUF,同时中断标志位和状态标志位置位。
2.4 SPI从动模式
在SPI从动模式,数据的发送和接收依靠SCK引脚上输入的外时钟脉冲,当最后一位被锁存后,中断标志位SSPIF(PIPI的D3)置位。
在休眠模式,从动,模式仍可以发送和接收数据。一旦接收到数据,芯片就从休眠中唤醒。
如果采用SS控制的从动模式,当SS引脚接到 时SPI模式复位。如果采用CKE=1
3应用程序
3.1 流程图
设计流程图如图1所示
3.2基本程序

图1 设计流程图
(1)复位设置
process(reset,write,e)
begin
c<=write;
ckp<= 1;
cke<='1';
if(reset='0')then
bit_cnt<='0000';
loadh<='1';
b<='0';
else
if (c='1')then
b<=e;
elsif(c='0')then
(2) 寄存器及时钟上升下降沿的设置
case ckp is
when 0 =>b<='0';
if(cke='1')then
a<='1' ;
else a<='0' ;
end if;
when 1 => b<='1';
if(cke='1')then
a<='0' ;
else a<='1' ;
end if;
end case;
end if;
if (a='1')then
if(e'event and e='1') then
if (bit_cnt='1011')then
bit_cnt<='0000';
loadh<=not loadh;
if(loadh='1')then
shift_reg<=dac_high;
else
shift_reg<=dac_low;
end if;
else
bit_cnt<=bit_cnt+1;
end if;
end if;
elsif(e'event and e='0') then
if (bit_cnt='1011')then
bit_cnt<='0000';
loadh<=not loadh;
if(loadh='1')then
shift_reg<=dac_high;
else
shift_reg<=dac_low;
end if;
3.3 软件仿真(运用SignalTap II嵌入逻辑分析仪)
嵌入式逻辑分析仪可以随设计文件一并下载于目标芯片中,用以捕捉目标芯片内部,设计者感兴趣的信号节点处的信号,而又不影响愿硬件系统的正常工作。
1/2 1 2 下一页 尾页 |