已阅读5页,还剩24页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
FPGA有限状态机模拟I2C总线设计时间:2007-08-01 来源: 作者:潘小冬 点击:2758 字体大小:【大 中 小】 -摘要:以I2C总线协议为根据。用有限状态机(FSM:Finite State Machine)设计了基于FPGA的I2C初始化程序模块。主要内容包括简述I2C总线的特点;介绍用FPGA中FSM开发I2C总线模块时的设计思想和实现过程;给出并解释了部分用Verilog HDL描述I2C总线初始化SAA7111和SAA7121的程序,最后在QuartusII中进行了I2C总线主从模式下的时序仿真和用其内嵌逻辑软分析仪SignalTap II完成了硬件调试。 在现代电子系统中,有为数众多的IC需要进行相互之间以及与外界的通信。为了简化电路的设计,Philips公司开发了一种用于内部IC控制的简单的双向两线串行总线PC (IntelIntegrated Circuit bus)。该总线具有接口线少、通讯效率高等特点。 在进行FPGA设计时,经常需要和外围提供PC接口的芯片通信,虽然市场上有专用I2C总线接口芯片,但是地址可选范围小、性能指标固定、功能单一、使用不方便。根据I2C总线的电气特性及其通讯协议,在Altera公司的FPGA(EP2S30)上可以很方便地实现I2C总线的通讯接口,且具有高速、易调试、可以灵活地实现地在线配置等优点,同时大大地减少了系统的开发周期。1 I2C总线协议概述 I2C总线系统由两根总线即SCL(串行时钟)线和SDA(串行数据)线构成。I2C 总线主从器件之间传送的一次数据称为一帧,由启动信号、地址码、若干数据字节、应答位以及停止信号等组成。通讯启动时,主器件发送一个启动信号(当SCL线上是高电平时,SDA线上产生一个下跳沿)、从器件的地址(唯一的7位地址码)和1位读写方向标志位;通讯停止时,主器件发送一个停止信号(当SCL线上是高电平时,SDA线上产生一个上跳沿)。在数据传送过程中。当SCL线上是高电平时,必须保证SDA线上的数据稳定,传完一个字节的数据,必须由从器件送回一个应答信号。总线的传输速率为100kbit/s(标准)-400kbit/s(快速)。 这种总线可以设计成很多种通讯配置,考虑到在课题中的实际应用,该I2C总线模型如下:单主操作,只实现简单的写和读操作,写地址连续,没有竞争和仲裁,是很简单的I2C总线系统。在本设计中,用FPGA模拟的I2C总线协议模块完成对SAA7111和SAA7121(Philips公司的视频解码和编码芯片)先后进行初始化。2 I2C 模块的设计与实现2.1 I2C模块设计思路 I2C 总线写命令格式如下: 写信号: 图1为I2C总线一次完整的数据传输时序图,可以将整个过程分为5个状态:(1)起始,(2)写数(0或1),(3)应答,(4)暂停,(5)结束。针对SAA7111进行初始化,需要在I2C总线上传输的参数共有34个字节:从器件地址(7bits)和写操作位(1bit)占一个字节,基地址参数占一个字节,再加上内部地址连续的32个寄存器(每个寄存器写一个字节数据),写完最后第34个字节后产生一个信号,作为初始化SAA7111的启动信号,初始化SAA7121的过程与前者类似 只是传输的参数共有130个字节,就不再赘述。整个初始化SAA711l的具体状态转化过程如图2所示。 为了准确控制和描述每个状态,将SDA和SCL的每一状态都分成四部分(00,01,10,11),如下图3,图中是Ack1是非应答状态,Ack0是应答状态,另外设置Idle状态是为了在传输完一个字节后如果继续传输数据,则在这个状态准备下一个要传输的数据保障了传输过程中的可靠性。 图中每一状态的四个部分都用4个时钟周期来描述,也就是说时钟频率是总线的传输速率(100kb/s400kb/s)的4倍,即其时钟频率为400kHz1600kHz(2.5us-O.625us),所以SDA与SCL之间的跳变沿,都相应地满足I2C通信协议中SDA与SCL之间的建立与保持时间(O.6us)。2.2 I2C 模块程序编写 整个程序用Verilog HDL语言编制,选择I2C总线的传输速率为200kb/s,则输入时钟频率应为800kb/s。在这里把双向数据线SDA用分成两条线模拟:SDAOUT为SDA数据输出,SDAACK为SDA的应答信号。 程序由5个状态组成:Start,Write,Ack,Idle,Stop。状态机的编码方式会影响到逻辑设计的性能,针对FPGA触发器资源丰富,这里采用独热(One-Hot)的编码方式,虽然多用了触发器,但可以有效节省和简化组合电路,提高电路的速度和可靠性,也有利于提高器件资源的利用率。状态定义如下:parameter 19:0 St_Start0=20b0000_0000_0000_0000_0001;parameter 19:0 St_Start1=20b0000_0000_0000_0000_0010;parameter 19:0 St_Start2=20b0000_0000_0000_0100,2.2.1 状态机描述:(1)开始信号(Start)的产生St_Start0:begin SCLOUT=1b1;SDAOUT=1b1;NS=St_Start1;end (2)写信号(Write)的产生St_Write0:begin SCLOUT =1b0;SDAOUT=SDA_TEMP;NS=St_Write1;end2.2.2 数据输入 一般情况下,I2C总线传输的数据由外部ROM或其它专门的数据存储区来存储,但在数据相对固定且数据量不是很大的情况下,可以将初始化的数据写在程序中,这样可减少频繁的数据交换,简化操作。SAA7111的初始化数据就属于这种情况,可以通过检测应答信号来改变输入的值。程序如下:always (posedge CLKIN)begin /Input Data for Initializafioncase(ACK_CNT) /ACK_CNT is a counter for acknowlege 8h00:DATA_REG=8h48; /-Slave Address+Wr 8h01:DATA_REG=8h00;2.2.3 数据并串转换 由于数据寄存器的数据位宽是8bits,而在I2C总线上传输的是位宽是1bit,所以要进行并串转换,且需满足数据高位在前,低位在后。2.2.4 产生初始化SAA7121的启动信号 当SAA7111初始化完后,应产生开始初始化SAA7121的启动信号,该信号的要求是平时为低电平,当检测到SAA7111的SDA和SCL均为高电平时,生成一个高脉冲,作为SAA7121初始化状态机的Reset信号。3 I2C仿真与调试 下图4是在Quartus II中时序仿真的信号波形,其中SDAACK为高时,即模拟I2C总线上非应答时的情况,可以从SCL和SDA的波形看到,I2C总线又重新进入开始状态,开始第二次初始化。这样万一初始化失败,还可以再次重新开始,提高了设计的可靠性。 图5(a)和图5(b)是在Quartus II中把相关程序下载到EP2S30中,用其内嵌的在线逻辑分析仪SignalTap II采得的初始化SAA7111时的信号波形,信号依次为SCL,SDA,START7121。4 结束语 以该I2C总线协议为基础,编写FPGA初始化SAA7111和SAA7121的程序,仿真顺利通过并在硬件上调试成功,实现了FPGA与SAA7111和SAA7121实际通讯实验,结果工作正常,验证了FPGA有限状态机模拟I2C总线设计的正确性和可行性。该模块只需修改“2.2.2数据输入”中的参数和ACK_CNT计数器的值,就能移植到对其它满足I2C总线通信协议的器件的初始化中,如AD公司的ADV7170,ADV7179等,效果不错。基于FPGA/CPLD设计与实现UART(VHDL)时间:2007-05-08 来源: 作者: 点击:7379 字体大小:【大 中 小】 -1 引言 由于微电子学和计算机科学的迅速发展,给EDA(电子设计自动化)行业带来了巨大的变化。特别是进入20世纪90年代后,电子系统已经从电路板级系统集成发展成为包括ASIC、FPGA/CPLD和嵌入系统的多种模式。可以说EDA产业已经成为电子信息类产品的支柱产业。EDA之所以能蓬勃发展的关键因素之一就是采用了硬件描述语言(HDL)描述电路系统。就FPGA和CPLD开发而言,比较流行的HDL主要有Verilog HDL、VHDL、ABEL-HDL和 AHDL 等,其中VHDL和Verilog HDL因适合标准化的发展方向而最终成为IEEE标准。 下面的设计就是用VHDL来完成实现的。2 UART设计实例 通常设计数字电路大都采用自顶向下将系统按功能逐层分割的层次化设计方法,这比传统自下向上的EDA设计方法有更明显的优势(当时的主要设计文件是电路图)。因为由自顶向下的设计过程可以看出,从总体行为设计开始到最终逻辑综合,形成网络表为止。每一步都要进行仿真检查,这样有利于尽早发现系统设计中存在的问题,从而可以大大缩短系统硬件的设计周期。 下面以UART的设计为例具体说明:(本设计只对本设计的总模块做各种基于MAX+PLUS II环境下的各种分析,对于各分模块只是作些必要的说明。) UART(即Universal Asynchronous Receiver Transmitter 通用异步收发器)是一种应用广泛的短距离串行传输接口。UART允许在串行链路上进行全双工的通信。串行外设用到的RS232-C异步串行接口,一般采用专用的集成电路即UART实现。如8250、8251、NS16450等芯片都是常见的UART器件,这类芯片已经相当复杂,有的含有许多辅助的模块(如FIFO),有时我们不需要使用完整的UART的功能和这些辅助功能。或者设计上用到了FPGA/CPLD器件,那么我们就可以将所需要的UART功能集成到FPGA内部。使用VHDL将UART的核心功能集成,从而使整个设计更加紧凑、稳定且可靠。本文应用EDA技术,基于FPGA/CPLD器件设计与实现UART。2.1 UART简介2.1.1 UART结构 UART主要有由数据总线接口、控制逻辑、波特率发生器、发送部分和接收部分等组成。本设计主要设计UART中最重要的发送部分和接收部分,其他部分设计不在赘述。 功能包括发送缓冲器(tbr)、发送移位寄存器(tsr)、帧产生、奇偶校验、并转串、数据接收缓冲器(rbr)、接收移位寄存器(rsr)、帧产生、奇偶校验、串转并。图1是UART的典型应用。图12.1.2 UART的帧格式UART的帧格式如图2所示。图2包括线路空闲状态(idle,高电平)、起始位(start bit,低电平)、58位数据位(data bits)、校验位(parity bit,可选)和停止位(stop bit,位数可为1、1.5、2位)。 这种格式是由起始位和停止位来实现字符的同步。 UART内部一般有配置寄存器,可以配置数据位数(58位)、是否有校验位和校验的类型、停止位的位数(1,1.5,2)等设置。 本设计没有奇偶校验位,所设置的奇偶校验只是检验数据中是否有奇数或偶数个1。数据位为8位,停止位为1位。2.2 UART的设计与实现2.2.1 UART发送器 发送器每隔16个CLK16时钟周期输出1位,次序遵循1位起始位、8位数据位、1位停止位。CPU何时可以往发送缓冲器tbr写入数据,也就是说CPU要写数据到tbr时必须判断当前是否可写,如果不判这个条件,发送的数据会出错。本设计由wrn控制。 数据的发送是由微处理器控制,微处理器给出wrn信号,发送器根据此信号将并行数据din7.0锁存进发送缓冲器tbr7.0,并通过发送移位寄存器tsr7.0发送串行数据至串行数据输出端sdo。在数据发送过程中用输出信号tbre、tsre作为标志信号,当一帧数据由发送缓冲器tbr7.0送到发送发送移位寄存器tsr7.0时,tbre信号为1,而数据由发送移位寄存器tsr7.0串行发送完毕时,tsre信号为1,通知CPU在下个时钟装入新数据。发送器端口信号如图3所示。图3引入发送字符长度和发送次序计数器no_bits_sent,实现设计的源程序如下。library ieee ;use ieee.std_logic_1164.all ;use ieee.std_logic_arith.all ;entity txmit isport (rst,clk16x,wrn : in std_logic ;din : in std_logic_vector(7 downto 0) ;tbre : out std_logic ;tsre : out std_logic ;sdo : out std_logic ) ;end txmit ;architecture v1 of txmit issignal clk1x_enable : std_logic ;signal tsr : std_logic_vector (7 downto 0) ;signal tbr : std_logic_vector (7 downto 0) ;signal parity : std_logic ;signal clkdiv : unsigned (3 downto 0) ; -用来控制数据采样时钟的signal clk1x : std_logic ;signal no_bits_sent : unsigned (3 downto 0) ;signal wrn1 : std_logic ;signal wrn2 : std_logic ;beginprocess (rst,clk16x) -对wrn进行脉宽处理,以防接收数据错误beginif rst = 1 thenwrn1 = 1 ;wrn2 = 1 ;elsif clk16xevent and clk16x = 1 thenwrn2 = wrn1 ;wrn1 = wrn ;end if ;end process ;process (rst,clk16x) -对clk1x_enable进行控制beginif rst = 1 thenclk1x_enable = 0 ;tbre = 1 ;elsif clk16xevent and clk16x = 1 thenif wrn1 = 0 and wrn2 = 1 thentbre = 0 ;clk1x_enable = 1 ;elsif std_logic_vector(no_bits_sent) = 0010 thentbre = 1 ;elsif std_logic_vector(no_bits_sent) = 1101 thenclk1x_enable = 0 ;end if ;end if ;end process ;process (rst,wrn) -接收数据至tbrbeginif rst = 1 thentbr 0) ;elsif wrnevent and wrn = 0 thentbr = din ;end if ;end process ;process (rst,clk16x,clk1x_enable)beginif rst = 1 thenclkdiv = 0000 ;elsif clk16xevent and clk16x = 1 thenif clk1x_enable = 1 thenclkdiv = clkdiv + 0001 ;end if ;end if ;end process ;clk1x = clkdiv(3) ; -产生clk1x时钟process (rst,clk1x,no_bits_sent,tbr)beginif rst = 1 thensdo = 1 ;tsre = 1 ;tsr = 00000000 ;parity = 1 ;elsif clk1xevent and clk1x = 1 thenif std_logic_vector(no_bits_sent) = 0001 thentsr = tbr ; -发送缓冲器tbr数据进入发送移位寄存器tsrtsre = 0 ; -发送移位寄存器空标志置“0”elsif std_logic_vector(no_bits_sent) = 0010 thensdo = 0011 and std_logic_vector(no_bits_sent) = 1010 thentsr = tsr(6 downto 0) & 0 ; -从低位到高位进行移位输出至串行输出端sdosdo = tsr(7) ;parity = parity xor tsr(7) ; -数据位中的1校验end if ;end if ;end process ;process (rst,clk1x,clk1x_enable) -产生发送字符长度和发送次序计数器beginif rst = 1 or clk1x_enable = 0 thenno_bits_sent = 0000 ;elsif clk1xevent and clk1x = 1 thenif clk1x_enable = 1 thenno_bits_sent = no_bits_sent + 0001 ;end if ;end if ;end process ;end ;2.2.2 UART接收器 串行数据帧和接收时钟是异步的,发送来的数据由逻辑1变为逻辑0可以视为一个数据帧的开始。接收器先要捕捉起始位,确定rxd输入由1到0,逻辑0要8个CLK16时钟周期,才是正常的起始位,然后在每隔16个CLK16时钟周期采样接收数据,移位输入接收移位寄存器rsr,最后输出数据dout。还要输出一个数据接收标志信号标志数据接收完。接收器的端口信号如图4所示。图4引入接收字符长度和接收次序计数器no_bits_rcvd,实现设计的源程序如下。由于与发送器的一些说明相似,这里就不再重复。library ieee ;use ieee.std_logic_1164.all ;use ieee.std_logic_arith.all ;entity rcvr isport (rst,clk16x,rxd,rdn : in std_logic ;dout : out std_logic_vector (7 downto 0) ;data_ready : out std_logic ;framing_error : out std_logic ;parity_error : out std_logic ) ;end rcvr ;architecture v1 of rcvr issignal rxd1 : std_logic ;signal rxd2 : std_logic ;signal clk1x_enable : std_logic ;signal clkdiv : unsigned (3 downto 0) ;signal rsr : unsigned (7 downto 0) ;signal rbr : unsigned (7 downto 0) ;signal no_bits_rcvd : unsigned (3 downto 0) ;signal parity : std_logic ;signal clk1x : std_logic ;beginprocess (rst,clk16x)beginif rst = 1 thenrxd1 = 1 ;rxd2 = 1 ;elsif clk16xevent and clk16x = 1 thenrxd2 = rxd1 ;rxd1 = rxd ;end if ;end process ;process (rst,clk16x,rxd1,rxd2,no_bits_rcvd)beginif rst = 1 or std_logic_vector(no_bits_rcvd) = 1100 thenclk1x_enable = 0 ;elsif clk16xevent and clk16x = 1 thenif rxd1 = 0 and rxd2 = 1 thenclk1x_enable = 1 ;end if ;end if ;end process ;process (rst,clk16x,rdn,no_bits_rcvd)beginif rst = 1 or rdn = 0 thendata_ready = 0 ;elsif clk16xevent and clk16x = 1 thenif std_logic_vector(no_bits_rcvd) = 1100 thendata_ready = 1 ;end if ;end if ;end process ;process (rst,clk16x,clk1x_enable)beginif rst = 1 thenclkdiv = 0000 ;elsif clk16xevent and clk16x = 1 thenif clk1x_enable = 1 thenclkdiv = clkdiv + 0001 ;end if ;end if ;end process ;clk1x = clkdiv(3) ;process (clk1x,rst)beginif rst = 1 thenrsr = 00000000 ;rbr = 00000000 ;parity = 1 ;framing_error = 0 ;parity_error = 0001 and std_logic_vector(no_bits_rcvd) 1001 then - 数据帧数据由接收串行数据端移位入接收移位寄存器rsr(0) = rxd2 ;rsr(7 downto 1) = rsr(6 downto 0) ;parity = parity xor rsr(0) ;elsif std_logic_vector(no_bits_rcvd) = 1010 thenrbr = rsr ; -接收移位寄存器数据进入接收缓冲器elsif parity = 0 thenparity_error = 1 ;elsif std_logic_vector(no_bits_rcvd) = 1001 and rxd2 = 0 thenframing_error = 1 ;end if ;end if ;end process ;process (rst,clk1x,clk1x_enable,no_bits_rcvd)beginif rst = 1 or (std_logic_vector(no_bits_rcvd) = 1100 and clk1x_enable = 0) thenno_bits_rcvd = 0000 ;elsif clk1xevent and clk1x = 1 thenif clk1x_enable = 1 thenno_bits_rcvd = no_bits_rcvd + 0001 ;end if ;end if ;end process ;dout rst,clk16x = clk16x,din = din,tbre = tbre,tsre = tsre,sdo = sdo);u2 : rcvr PORT MAP (rst = rst,clk16x = clk16x,rxd = rxd,rdn = rdn,data_ready = data_ready,framing_error = framing_error,parity_error = parity_error,dout = dout) ;end v1 ;总模块RTL图如图5图5SPI串行总线接口的Verilog实现时间:2007-08-01 来源: 作者:孙丰军 余春暄 点击:4151 字体大小:【大 中 小】 -摘 要:集成电路设计越来越向系统级的方向发展,并且越来越强调模块化的设计。SPI(Serial Peripheral Bus)总线是Motorola公司提出的一个同步串行外设接口,容许CPU 与各种外围接口器件以串行方式进行通信、交换信息。本文简述了SPI总线的特点,介绍了其4条信号线,SPI串行总线接口的典型应用。重点描述了SPI串行总线接口在一款802.11b芯片中的位置,及该接口作为基带和射频的通讯接口所完成的功能,并给出了用硬件描述语言Verilog HDL 实现该接口的部分程序。该实现已经在Modelsim 中完成了仿真, 并经过了FPGA 验证, 最后给出了仿真和验证的结果。 在SOC设计中,利用EDA 工具设计芯片实现系统功能已经成为支撑电子设计的通用平台.并逐步向支持系统级的设计方向发展。而且,在设计过程中,越来越强调模块化设计。 SPI总线是Motorola公司提出的一个同步串行外设接口,具有接口线少、通讯效率高等特点。本文给出的是利用Verilog HDL实现的SPI总线模块,该模块是802.11b无线局域网芯片中一个子模块,该模块完成了芯片中基带(base band)与RF的通讯工作.1 SPI总线接口概述 SPI(Serial Parallel Bus)总线是Motorola公司提出的一个同步串行外设接口,允许CPU 与各种外围接口器件(包括模/数转换器、数/模转换器、液晶显示驱动器等)以串行方式进行通信、交换信息。他使用4条线:串行时钟线(SCK)、主机输入/从机输出线(MISO)、主机输出/从机输入线(MOSI)、低电平有效的使能信号线(CS)。这样,仅需34根数据线和控制线即可扩展具有SPI接口的各种I/O器件 其典型结构如图1所示。SPI总线具有以下特点:(1)连线较少,简化电路设计。并行总线扩展方法通常需要8根数据线、816根地址线、23根控制线。而这种设计,仅需4根数据和控制线即可完成并行扩展所实现的功能。(2)器件统一编址,并与系统地址无关,操作SPI独立性好。(3)器件操作遵循统一的规范,使系统软硬件具有良好的通用性。2 SPI总线接口的设计与实现 该模块是802.1lb无线局域网芯片中的一子模块,其在芯片中的位置如图2所示。 其中base band(基带)为SPI的主控器(master),RF(射频)为SPI的受控器(slave)。SPI interface作为baseband与RF的通讯接口,主要完成以下工作:(1)将从base band接收到的16位的并行数据,转换为RF所能接收的串行数据,并将该数据根据SPI协议送给RF。(2)产生RF所需的时钟信号SCLK,使能信号CSB。(3)接收从RF传回的串行数据,并将其转换为并行数据。(4)将base band发送的数据,与RF返回的数据进行比较,并把比较结果传给base band。 下面给出用Verilog HDL语言实现前两项功能的关键程序,相关变量的声明在此略去。/generate a counteralways (posedge clock or negedge reset)begin if(!reset) counter= 0; else if(enable) begin if(counter 53) counter=counter + 1; endend/generate signal csbalways (posedge clock or negedge reset)begin if(!reset) csb = 1 & counter = 50) csb = 0; else csb = 1;end/Generate sclkalways (posedge clock or negedge reset)begin case(counter) 6d02: sclk = 1; 6d05: sclk = 1; 6d08: sclk = 1; 6d11: sclk = 1; 6d14: sclk = 1; 6d17: sclk = 1; 6d20: sclk = 1; 6d23: sclk = 1; 6d26: sclk = 1; 6d29: sclk = 1; 6d32: sclk = 1; 6d35: sclk = 1; 6d38: sclk = 1; 6d41: sclk = 1; 6d44: sclk = 1; 6d47: sclk = 1; default sclk = 0;endcaseendalways (counter or csb)begin if(csb = 0) case(counter) 6h00, 6h01, 6h02, 6h03:mosi_index = 5h00; 6h04, 6h05, 6h06:mosi_index = 5h01; 6h07, 6h08, 6h09:mosi_index = 5h02; 6h0A, 6h0B, 6h0C:mosi_index = 5h03; 6h0D, 6h0E, 6h0F:mosi_index = 5h04; 6h10, 6h11, 6h12:mosi_index = 5h05; 6h13, 6h14, 6h15:mosi_index = 5h06; 6h16, 6h17, 6h18:mosi_index = 5h07; 6h19, 6h1A, 6h1B:mosi_index = 5h08; 6h1C, 6h1D, 6hlE:mosi_index = 5h09; 6h1F, 6h20, 6h21:mosi_index = 5h0A ; 6h22, 6h23, 6h24:mosi_index = 5h0B; 6h25, 6h26, 6h27:mosi_index = 5h0C ; 6h28, 6h29, 6h2A:mosi_index = 5h0D ; 6h2B, 6h2C, 6h2D:mosi_index = 5h0E; 6h2E, 6h2F, 6h30:mosi_index = 5h0F; default:mosi_index = 5h00; endcase else mosi_index = 5h00:endassign mosi=spi_datamosi_index3;(声明:以上程序已经过修改,只供借鉴,不可用作商业用途) 用Verilog HDL实现的SPI总线接口模块,在ModelSim 中编译、调试,并做了前仿真。 前仿真通过后,又在Altera公司的EPXA10 Develop Board上做了FPGA验证,结果与在ModelSim 中的仿真结果一致。最后在base band与RF的联合调试过程中,该SPI总线接口模块达到了预期的要求。参考文献1 任志斌,车长征.串行外设接口SPI的应用J.电子技术应用,2002,29(10):20-22.2 易志明.SPI串行总线接口及其实现j.自动化与仪器仪表,2002,(6):45-48.3 夏宇闻.Verilog数字系统设计教程M.北京:北京航空航天大学出版社,2003.在FPGA中实现SPI与总线接口转换时间:2007-06-22 来源: 作者:刘伯栋 点击:2216 字体大小:【大 中 小】 -摘要:FPGA和CPLD可编程逻辑器件具有可编程的特点,这为不同接口之间转换提供了灵活性。具有SPI接口或总线接口的各种芯片在电路设计中的应用日益广泛。为了能够对这些芯片进行设置以及实现相互之间的数据传输,往往需要在它们之间进行接口转换。主要介绍了在FPGA中通过时接口时序和接口速率的处理,实现SPI接口与总线接口转换,完成了M68HC912832和P89C5lRD2FA之间的数据双向传输,并给出了实现方案、仿真结果以及硬件调试结果。1 引言 随着印刷电路板设计向着密集化、多功能化和小型化的方向发展,电路板上通常配置了多种不同芯片,为了能够对这些芯片进行设置以及实现相互之间的数据传输,往往需要在它们之间进行接口转换。 FPGA和CPLD等可编程逻辑器件具有现场可编程、逻辑资源丰富以及集成度高等特点,通过FPGA或者CPLD进行接口转换,具有很强的灵活性,因此在电路设计中被广泛应用。2 器件介绍 本文主要介绍在FPGA中实现SPI接口与总线接口的转换,其中选用的芯片是:Motorola公司的M68HC912B32,Philips公司的P89C51RD2FA,FPGA是Xilinx公司SPARTANE系列中xc2s600e。接口之间的连接关系如图1所示,图中省去了电平适配的考虑。 M68HC912B32是Motorola公司的一款16bit微处理器。它具有32kbyte的FLASH EEPROM空间,1kbyte的RAM空间。该处理器含有丰富的外部接口单元,除了同步串行外设接口(SPI),还有异步串行通信接口(SCII),8通道10bit的A/D转换器,以及4通道8bit或2通道16bit的脉宽调制器(PWM)等。M68HC912832具有较强的处理能力,加上丰富的外设资源,使得该处理器在多种终端设备中得到应用。 P89C51RD2FA是Philips公司的一款单片机。P89C51RD2FA具有64kbyte的Flash EPROM,1kbyte的BOOTROM,用于在系统编程。与其他单片机相比,P89C51RD2FA具有在系统可编程的特点。通过改变P89C51RD2FA引脚psen接地,用标准串行接口,由普通PC下载程序到该款单片机中。该方式省去了专门的编程器,也省去了单片机程序下载和在目标板上运行之间的来回移动。 Xilinx公司的SPARTANE系列器件是基于成熟的VirtexE系列器件的结构,内核电压采用1.8V,系统时钟速率可达到200MHz,最大系统门为60万门,就是本文中的xc2s600e。SPARTANE系列器件主要由可配置逻辑块(CLB)、输入输出模块(IOB)、块存储器(Block-RAM)和数字锁相环(DLL)四大部分组成。内部丰富的逻辑资源,支持多达19种I/O标准,高性能的路由结构等特点,使得SPARTANE系列FPGA具有非常高的性价比。3 接口转换特点 M68HC912B32具有SPI接口,即同步串行外设接口。构成SPI接口的四根信号线通常是:从机选择线/SS、时钟信号线SCK、主机出从机入信号线MOSI和主机入从机出信号线MISO。由此可见,通过SPI接口进行通信的双方有主机和从机之分。在本系统中M68HC912B32作为主机,从机在FPGA中实现。为了简化设计,还增加了从机发送数据请求信号线/TREO。 M68HC912B32的SPI接口时序受内部控制寄存器控制,在时钟相位CPHA=l条件下,当有数据要传输时,首先/SS变成低电平,然后在SCK时钟推动下,数据由MOSI或者MISO传输。数据传输结束后(可以传多个字节),/SS再还原成高电平。为了区分数据传输方向,由/TREQ作为从机向主机发送数据的握手信号,即/TREQ变成低电平时,主机为接收状态,MISO上的数据有效。 单片机P89C51RD2FA与FPGA以总线的方式相连,信号线包括地址/数据总线(8位),数据写使能/WR,数据读使能/RD,以及外部中断请求/INT0,数据读写是在外部中断控制下完成的。 FPGA的作用就是把M68HC12以同步串行传输过来的数据转换成总线数据形式,然后由P89C51RD2FA读出。反之,接收P89C51RD2FA中的总线数据,完成并串转换,然后再以同步串行的方式将数据发送给M68HC912B32,实现逆向数据转换。4 FPGA实现方案与调试结果 通过FPGA实现SPI接口与总线接口转换,需要考虑以下因素: 接口时序。主要包括/SS与SCK的时序关系;/TREQ与/SS的时序关系;SCK与MOSI和MISO的时序关系,比如MOSI数据在SCK下降沿被从机采集接收,而MISO数据必须在SCK上升沿由从机输出,这样在相邻的下降沿被主机接收;另外,在多字节传输时,为保证数据传输的连续性,相应增加了一些控制时序等; 接口速率。在本设计中的SPI接口数据速率是125kbps,该速率大于一般异步串口速率(如19.2 kbps),接口转换必须满足处理速度要求。比如设计中采用了接口数据缓冲的方法。当FPGA接收来自主机的数据时,首先逐位移入接收寄存器
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 买卖树地协议合同书
- 企业与职工合同范本
- 京东店铺注册协议书
- 拍卖服务框架合同范本
- 施工购买砂石合同范本
- 新设围挡安全协议书
- 柴油供应商安全协议书
- 旅游家庭协议书范本
- 教辅材料订购协议书
- 木制作加工合同范本
- 子宫内膜异位症的病因与治疗新进展
- 电力安全工作规程(变电部分)课件
- 华为H12-611 V1.0 HCIA-openEuler认证备考试题库及答案(高分刷题版)
- 办公用品、耗材采购服务投标方案
- 职业道德与法律中职PPT完整全套教学课件
- 2022年包头市中小学教师招聘考试真题
- 娱乐场所安全保卫工作方案
- 数据中心基础设施管理系统DCIM技术方案
- GB/T 18033-2007无缝铜水管和铜气管
- GB/T 13912-2020金属覆盖层钢铁制件热浸镀锌层技术要求及试验方法
- 色彩构成(心理篇)课件
评论
0/150
提交评论