当前位置:首页 > 智能硬件 > 智能硬件
[导读]介绍了USB 协议芯片FT245BM的工作原理,设计了FT245BM与FPGA的接口电路,给出了FPGA发送和接收数据帧状态机的Verilog语言的描述,并介绍了PC机软件的设计方法。

摘要 介绍了USB 协议芯片FT245BM的工作原理,设计了FT245BM与FPGA的接口电路,给出了FPGA发送和接收数据帧状态机的Verilog语言的描述,并介绍了PC机软件的设计方法。该电路被成功地应用到光纤陀螺多路测试系统中,简化了电路设计,提高了测试效率。该设计具有很强的通用性。
关键字 通用串行总线(USB)  FT245BM   FPGA   状态机

一、引言

USB总线因其传输速度快、占用资源少以及真正的即插即用等诸多优点,受到了广大开发者的青睐,已经成为很多计算机设备的一种基本配置。目前被广泛采用的USB设备开发方案主要有以下两种(1)利用USB设备端接口芯片加微控制器结构。如国内用的比较多的Philips公司的PDIUSBD12/ISP1581等。(2)采用USB单片机。采用这两种方案要求开发者彻底理解USB协议的细节,并编写出固件程序。固件的运行要占用微控制器的时间和空间资源,实际通信效率不会很高。也有人用FPGA实现固件的功能,但这种方案开发和调试的难度很大。本人在实际工作中用FPGA外部直接连接一片USB协议芯片FT245BM,实现了FPGA与PC机的USB通信,该方法不用微控制器,减少了元器件的个数,并且占用FPGA资源很少,FPGA仍然可以实现其他逻辑功能,系统设计的灵活性很大。

二、FT245BM简介

FT245BM由FTDI (Future Technology Devices Int. Ltd.)公司推出,该芯片的主要功能是进行USB和并行I/O口之间的协议转换。芯片一方面可从主机通过USB串行总线接收数据,并将其转换为并行I/O口的数据流格式发送给外设;另一方面外设可通过并行I/O口将数据转换为USB串行数据格式传回主机。中间的转换工作全部由芯片自动完成,开发者无须考虑固件的设计。该芯片提供了通用的并行I/O口方便与微控制器、FPGA或其他外设接口。在PC机端安装了FTDI公司提供的驱动程序,只需熟悉简单的VB、VC编程,就可很容易地进行上位机软件开发。

关于FT245BM的内部结构及详细地引脚介绍读者可以参考其他相关资料,在此仅对与本设计相关的内容作一个介绍。FT245BM内含两个FIFO数据缓冲区,一个是128字节的接收缓冲区,另一个是384字节的发送缓冲区。它们用作USB数据与并行I/O口数据的交换缓冲区。FIFO实现与外界(微控制器、FPGA或其它器件)的接口,主要通过8根数据线D0~D7、读写控制线RD#和WR#以及FIFO发送缓冲区空标志TXE#和FIFO接收缓冲区非空标志RXF#来完成数据交互。TXE#为低表示当前FIFO发送缓冲区为空,为高表示当前FIFO发送缓冲区满或者正在存储前一个字节,禁止向缓冲区中写数据。RXF#为低表示当前FIFO的接收缓冲区非空。RD#信号由低变高将从FIFO缓冲区中读取数据。当RD#变低时将数据送到数据总线。RXF#为高不能从FIFO读数据。读写时序见图1和图2。

 

图2 写数据时序

三、           FT245BMFPGA接口设计

3.1 硬件电路设计

    图3是FT245BM的USB与FPGA的接口电路,FPGA选用ALTERA EPF1K50TC-144,其中D0~D7是FT245BM与FPGA交换数据的数据总线,USB_RD#、USB_WR、USB_TXE#、USB_RXF#是相关的控制总线。

图3  FT245BM与FPGA的接口电路

3.2   FPGA收发状态机设计

   下面是用Verilog HDL 描述的FPGA收发状态机,为便于读者理解FPGA对FT245BM的读写过程,本文将接收和发送状态机分开给出。当然在实际应用中也可以将接收和发送操作合成一个状态机来实现。

3.2.1 接收状态机

    接收状态机主要功能是查询USB_RXF引脚的状态,当检测到USB_RXF变低,即可获知上位机已经将数据写入到FT245BM的缓冲区,然后产生读控制时序,将FT245BM接收缓冲区中的数据读入到FPGA的缓冲区。重复以上步骤直到将一帧数据读完,然后执行相应的帧处理操作。下面是用Verilog HDL描述的接收状态机。

@always (posedge clk )    /*clk为FPGA工作时钟。

if(rst && USB_RXF==0)

begin

       case(Rstate)

        Rstate0:

 begin

          USB_RD<=0;      /*产生读信号的下降沿

          Rstate<=Rstate1;

        end

        Rstate1:

begin

RframeBuf[Rpointer]<=USB_DATA; /*读FT245BM芯片FIFO的当前字节

Rstate<=Rstate2;

              end

        Rstate2:

          begin

            if(Rpointer== FrameLen-1) /*如果已经接收到完整的一帧,则转Rstate3,

              begin

              Rstate<=Rstate3;

                Rpointer<=0;

             end 

           else            /*一帧未接收完,转Rstate0继续接收

           begin

            Rstate<=Rstate0;

            Rpointer<=Rpointer+1;

           end

           USB_RD<=1;

          end

       Rstate3:        /*处理收到的帧

         begin

           Rstate<=Rstate0;

           /*在此添加处理帧的代码,本文略*/

         end

     end

else

  begin

       Rstate<=Rstate0;

       USB_RD<=1;

     End

3.2.2  发送状态机

发送状态机完成的主要功能是将外设产生的数据通过FT245BM和USB总线传送到PC机。外设将数据准备好后,将发送允许信号(SendEN)置为有效,当状态机检测到SendEN=1时,即启动发送操作。首先状态机从外设的缓冲区按字节将待发送的数据读到FPGA的缓冲区,并产生写FT245BM发送缓冲区的时序,将数据写到FT245BM发送缓冲区。直到将一帧数据发送完毕。下面是FPGA向FT245BM发送数据的状态机。

@always (posedge clk )    /*clk为FPGA工作时钟。

if(rst && USB_TXE==0&& SendEN==1)   /*rst为异步复位信号, SendEN为发送允许信号,由给Pc机发送数据的逻辑电路置位,数据发送完成由发送状态机将其清除。

  begin

    case(Sstate)

     Sstate0:

        begin

          USB_WR<=1;      /*产生写信号的上升沿

          Sstate<=Sstate1;

        end

     Sstate1:

begin

USB_DATA <=SframeBuf[Spointer];   /*写一个字节到FIFO,SframeBuf为发送缓冲区

Sstate<=Sstate2;

            end

     Sstate2:

        begin

          if(Spointer == FrameLen-1)    /*如果已经发送完一帧,则转Sstate3,

            begin

            Sstate<=Sstate3;

              Spointer <=0;

            end 

          else            /*未完,转Sstate0继续发送

           begin

             Sstate<=Sstate0;

             Spointer <= Spointer +1;

           end

         USB_WR<=0;         /*产生写usb FIFO信号的下降沿

        end

     Sstate3:       

       begin

         Sstate<=Sstate0;

         /*在此添加处理帧发送完毕的代码和清除SendEN 信号的代码,本文略*/

       end

  end

else

  begin

    Sstate<=Sstate0;

    USB_WR<=0;

  End

限于篇幅,以上状态机只给出了帧收发的基本操作,因为在不同的应用场合,帧处理的方法也不相同,所以本文没有给出帧处理代码。另外,在实际应用时需要注意以下内容:由于FPGA读写FT245BM共用一组数据总线,状态机不能同时对FT245BM进行读写操作,当所以当两个状态机分开编写时,为避免冲突需分出读写的优先级,此时只需对以上状态机稍加修改即可。比如当若令读的优先级高,则在写的状态机中将if(rst && USB_TXE==0&& SendEN==1)语句的条件改为if(rst && USB_TXE==0&& SendEN==1&& USB_RXF==1)即可。写优先级高的情况可以仿照此方法修改。

四、PC机软件设计

PC机软件的设计有两种方法:一种是在PC机上安装一个由FTDI公司免费提供的虚拟串行口VCP(Virtual COM Port)驱动程序,将USB口虚拟成一个串口,像一个标准的串口那样进行进行外设和PC机的通信。可本质上所有针对虚拟串口的数据通信都是通过USB总线完成的。另外一种方法是利用FTDI公司提供的D2XX驱动程序,通过调用驱动程序的动态链接库直接访问USB。由于人们对串口的操作比较熟悉,通常用前一种方法访问USB。比如,在PC端,应用VB对VCP(通常设置为COM3)进行编程。可以直接应用MSComm控件,将MSComm.CommPort置为3,MSComm.Setings置为“9600,n,8,1”(该速率为默认设置,实际上VCP驱动程序总是使数据以最快速率传输);通过MSComm.PortOpen设置COM3的开关状态;通过MSComm.Input和MSComm.Output读入或输出数据。在读取数据时,设置MSComm.Rthreshold的值为1。只要有数据传到PC机,就立即触发MSComm.CommEvent事件,自动读取COM3的数据;而发送数据则可自动或手动发送,由用户自己设置。以上操作与操纵标准的串行口完全一致。

五、结语

以上状态机在MaxPlusII10.2下调试并下载到FPGA运行通过,软件在Windows 2000,VB6.0环境下调试通过。该电路成功应用到光纤陀螺多路测试系统中,实现了同时对4路陀螺信号的同时测试,简化了电路设计,提高了测试效率。

参考文献:

[1] FT245BM data sheet. Future Technology Devices Int. Ltd.

[2] 夏宇闻. Verilog 数字系统教程[M]. 北京:北京航空航天大学出版社,2004

[3] 张俊安. 用VB实现windows 9x环境下的串口通信[J]. 山东煤炭科技, 2000年增刊:73~74

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

最近为什么越来越多的研究开始利用FPGA作为CNN加速器?FPGA与CNN的相遇究竟能带来什么神奇效果呢?原来,FPGA拥有大量的可编程逻辑资源,相对于GPU,它的可重构性以及高功耗能效比的优点,是GPU无法比拟的;同时...

关键字: FPGA 可编程逻辑资源 GPU

FPGA的应用领域包罗万象,我们今天来看看在音乐科技领域及医疗照护的智能巧思。

关键字: FPGA 科技领域 智能

强大的产品可降低信号噪音并提高分辨率与动态

关键字: Spectrum仪器 数字化仪 FPGA

最近某项目采用以太网通信,实践起来有些奇怪,好像设计成只能应答某类计算机的ICMP(ping)命令, 某类计算机指的是Windows特定系统,其他系统发送ping都不能正确识别。

关键字: 嵌入式Linux FPGA 协议

近两年,国外厂商的FPGA芯片价格飙升,由于价格,货期,出口管制等多方面因素的影响,很多公司都在寻找FPGA国产化替代方案。我工作中正在使用的几款芯片也面临停产的风险,用一片少一片,了解到国产FPGA发展的也不错,完全自...

关键字: FPGA 芯片 EDA

本篇是FPGA之旅设计的第十二例,在前面的例程中,完成了DS18B20温度传感器数据的采集,并且将采集到的数据显示在数码管上。由于本例将对温湿度传感器DHT11进行采集,而且两者的数据采集过程类似,所以可以参考一下前面的...

关键字: FPGA DS18B20温度传感器

这是FPGA之旅设计的第十三例啦,本例是一个综合性的例程,基于OLED屏幕显示,和DHT11温湿度采集,将DHT11采集到的温湿度显示到OLED屏幕上。

关键字: FPGA OLED屏幕

第八例啦,本例将介绍如何通过FPGA采集DS18B20传感器的温度值。

关键字: FPGA DS18B20传感器

这是FPGA之旅设计的第九例啦!!!本例将介绍如何使用FPGA驱动OLED屏幕,并在接下来的几例中,配合其它模块,进行一些有趣的综合实验。由于使用的OLED屏是IIC接口的,对IIC接口不是很清楚的,可以参考第五例的设计...

关键字: FPGA OLED屏幕

这是FPGA之旅设计的第十例啦,在上一例中,已经成功驱动了OLED屏幕,本例将结合上一例,以及第四例多bytes串口通信做一个有趣的例程。

关键字: FPGA OLED屏 串口

智能硬件

22034 篇文章

关注

发布文章

编辑精选

技术子站

关闭