74软件导刊?2006?7月号
基于FPGA 的SPI 接口AD 转换器
TLV2543的接口应用
苏旭武1,吴斌方1,杨光友1,程良明2
(1.湖北工业大学机械工程学院,湖北武汉430068;2.武汉精伦电子股份有限公司,湖北武汉430223)
摘要:给出了SPI 接口AD 转换器TLV2543与FPGA 的接口应用方案。首先介绍了TLV2543的特点及操作时序。以
VerilogHDL 为编程语言,
采用有限状态机,以半双工方式实现了SPI 接口读、写的时序逻辑。实践证明该方法简洁、有效。关键词:串行外设接口;FPGA ;AD 转换器;
有限状态机中图分类号:TP21文献标识码:A 文章编号:1672-7800(2006)07-0074-03
0前言
串行外设接口SPI (Serial Peripheral In-terface )是一种高速同步串行输入输出端口,近年来广泛应用外部移位寄存器、DA 转换器、AD 转换器、串行EEPROM 、LED 显示驱动器等外部设备的扩展。SPI 接口可以共享,便于组成带多个SPI 接口器件的系统。其传送速率可编程,连接线少,
具有良好的扩展性。
TLV2543是典型的具有SPI 接口的
AD 转换器,它可以方便地与带有SPI 接
口的处理器或控制器连接。在现在的数
据采集系统中,现场可编程门阵列FPGA
配置的灵活性正越来越多地使其成为主
控制器,采用标准SPI 接口IP 核可以实
现与SPI 接口器件的连接,但是,标准SPI
接口IP 核往往占用较多的片内资源。本
文将给出一种简洁的方法,以实现TLV2543
与FPGA 的接口设计。1TLV2543的特点及操作时序TLV2543是TI 公司生产的开关电容逐次逼近型模数转换器。其特点是:①12位分辨率;②工作温度范围内10us 转换时间;③11路模拟输入通道;④3路内置自测方式;⑤固有的采样保持电路;⑥线性误差最大±1LSB ;⑦片内系统时钟;⑧转换结束(EOC )输出;⑨单极性或双极性
输出;⑩可编程输出数据长度及MSB 或LSB 前导。其引脚功能见图1
。图1TLV2543引脚功能TLV2543工作过程分为2个周期:I/O 周期和转换周期。I/O 周期由外部时钟I/OCLOCK 决定,延续8、12或16个时钟周期,取决于选定数据输出长度。I/O 周期同时进行2种操作:①一个包括地址和控制信息的8位数据流被送到DA TA INPUT 端口。该数据在前8个时钟的上升沿被移入器件。当12或16个I/O 时钟传送时,在前8个时钟后DA TA INPUT 便无效。②在DA TA OUT 端串行地提供8、12或16位
长度的数据输出。当CS 保持为低电平,
第一个数据位出现在EOC 的上升沿。若
AD 转换中CS 被取消,则第一个输出数据
位出现在CS 的下降沿。该数据是前一次
转换周期的结果。第一位之后的各数据
位在后续时钟的下降沿同步输出。
转换周期对用户是透明的,它是由与
I/O 时钟同步的内部时钟控制的。当进行
AD 转换时,器件对模拟输入电压完成逐次逼近的转换。在转换周期开始时EOC 输出低电平,当转换完成且输出数据寄存器被锁存时EOC 变高。只有在I/O 周期
完成后才开始一次转换周期,这样可以减
少外部数字噪音对转换精度的影响。
数据输入端在内部被连接到一个8
位输入的地址和控制寄存器。控制器提
供的数据以MSB 为前导位。每个数据位
在I/OCLOCK 的上升沿被输入。寄存器中的控制字选择器件的输入通道(测试和节电方式)、数据长度、输出数据格式等,控制字格式如图2所示。根据上表中控制字格式,采用12位数据长度、MSB 在前方式数据传送、单极性输入,第0通道的AD 转换控制字为00H 。采用MSB 在前方式、使用CS 的16时钟传送时序,其操作时序图如图2所示。2FPGA 接口设计标准SPI 接口有主、从2种工作模式,并有9个寄存器用于模块操作,协议较复杂,而根据图3的时序图,可以看出TLV2543没有用到全部SPI 接口的时序。为了简洁地实现符合以上逻辑的时序,并减少标准SPI 接口IP 核对FPGA 资源的浪费,本文采用Verilog 硬件描述语言用有限同步状态机(FSM )的设计方法实现。为了避免SPI 接口双向数据通信时要同时捕捉时钟的上升沿和下降沿,可能由于
76软件导刊?2006?7月号always @(posedge clk )
begin
if (rst )
……//初始化reg 变量值;
ad_state<=state_idle;
adr_state<=adr_bit11;
else
begin
case (ad_state )
state_idle://空闲状态;
begin
CSAD<=1;flag<=0;
link<=0;link_ad<=0;
if (ad_enable )
begin
datain_buf<=datain;busy<=1;
ad_state<=state_write;
//AD 允许进写状态;
write_state<=write_bit7;
end
else
begin
ad_state<=state_idle;busy<=0;
end
end
state_write:
begin
if (flag==0)//是否完成标志
writeSPI;//进入写状态机
else
begin
link<=0;flag<=0;
if (ad_enable )//写完进等待状态
ad_state<=state_waitADEOC;
else
begin
ad_state<=state_stop;busy<=0;
end
end
end
state_waitADEOC:
begin
if (flag==0)
begin
if (ADEOC )flag<=1;//转换完成end else begin flag<=0;CSAD<=0;ad_state<=state_readAD;//进读状态adr_state<=adr_bit11;//读状态初值end end state_readAD:begin if (flag==0)readSPI;//读AD 结果;else begin flag<=0;busy<=0;CSAD<=1;link_ad<=1;//读完并行输出ad_state<=state_stop;//进完成状态end end state_stop:begin CSAD<=1;if (!ad_enable )//AD 结束进空闲状态ad_state<=state_idle;else ad_state<=state_stop;end default:begin ad_state<=state_idle;CSAD<=1;end endcase end end task writeSPI;//写控制字状态机begin casex (write_state )write_bit7://从高位写起if (!SCLK )begin if (ad_enable )begin CSAD<=0;link<=1;end DI_buf<=datain_buf [7];write_state<=write_bit6;//写完转入下位;end else write_state<=write_bit7;……//依次类推;write_end:if (!SCLK )begin link<=0;CSAD<=1;flag<=1;write_state<=write_bit7;end else write_state<=write_end;default:if (!SCLK )write_state<=write_bit7;endcase end endtask task readSPI;……//限于篇幅,读状态机部分略;endtask endmodule 4结语本文用有限状态机在FPGA 上实现了与SPI 接口AD 转换器TLV2543的接口应用,相比标准SPI 接口IP 核更为简洁,节约了FPGA 的片上资源。在Modelsim 中仿真正确后,利用ALTERA 公司Quar-tusII 软件在ACEX1K50芯片上成功地实现了综合,作为一个模块在“嵌入式动态可重构测控系统”项目中取得了良好的应用效果。虽然不是全双工操作,但仍然可以实现较高的采样速率。参考文献:[1]梁祥,封吉平,安学军.基于PC/104总线与CPLD 的SPI 接口设计[J ].微计算机信息,2005.[2]夏宇闻.Verilog 数字系统设计教程[M ].北京:北京航空航天大学出版社,2003.(责任编辑:王钊)