tag 标签: slavefifo

相关博文
  • 热度 29
    2012-2-6 12:44
    1612 次阅读|
    3 个评论
    作者:herizon_fei      之前做一个项目,需要对微弱光信号进行较高速(采样率1M)的8位信号采集,然后将数据传输到PC,交由上位机进行处理。这里将大概结构分享给大家。      这套系统以FPGA作为核心控制,数据采集部分采用AD7822,数据传输部分使用CY7C68013A作为USB2.0的核心控制芯片。      在数据采集部分,AD7822是美国模拟器件公司(AD公司)生产的8位并行单通道半闪速结构模数转换器。AD7822最高采样率为2M,转换时间仅需420ns。使用外部参考电压,需要在采集开始前充电1us时间。由于我们采样率较高,因此使用不自动掉电模式进行工作。      在实际使用中,发现这块芯片的采样数据就绪信号convst并非每次都只需要420ns,而是420ns到620ns之间。因此芯片并不能如前所述采样率保持在2M。好在本项目只需要1M的采样率,只需要等待convst置位,然后等到1us时间到,则再次进行下一次转换。这样就可以将数据源源不断的以1M的采样率输出了。      数据输出后,将数据直接传输到USB2.0处,准备发送。      对于数据传输部分,采用CY7C68013A作为USB2.0的核心控制器。使用slavefifo模式进行数据传输,一个数据包520个字节,使用芯片内部两个fifo缓冲区,每个缓冲区满则通过USB发送,并自动切换到另一个缓冲区缓存数据。      由于本项目需要上位机发送命令控制数据采集的开始停止以及控制采样速率等信息,因此需要数据的双向传输。其状态机设计较单向数据传输比较复杂,具体设计思路可以参考我的另一篇博文:《 slavefifo读命令写数据状态机简述 》 http://bbs.ednchina.com/BLOG_ARTICLE_3001333.HTM     这样,这个较高速的数据采集传输系统就设计完成了,希望以上内容对各位网友有所帮助。
  • 热度 19
    2012-1-29 12:59
    2979 次阅读|
    0 个评论
    作者:horizon_fei slavefifo模式是cy7c68013芯片的一种常用模式,是将ezusb芯片作为从设备高速写入或读取的重要方式。在此处,我使用FPGA作为主控制器,控制ezusb芯片。 slavefifo用的较多的是硬件向pc机发送高速大量的数据。这一点可以轻易利用官方设计参考手册上的时序加以实现。然而如果上位机要向硬件发送命令从而控制硬件选择传输数据通道或者传输速度等,同时有需要数据送上PC机,那又应该怎么做呢? 此处我用端点2(下称ep2)作为发送命令的端点,命令信息就从端点2读出。端点6(下称ep6)为写入数据的端点,数据从端点6写入。关键在于当上位机发送命令时,无论FPGA是否在发送数据,都应该在保证了本次数据写入完毕的前提下立即接受命令信息,当命令接收完毕并执行了命令之后,再按照需要继续发送数据。即读数据比写数据有更高的优先级,写数据的数据量远远大于读数据。为此我设计了8个状态,他们分别是usb_idle(空闲)usb_rdset(读设置)usb_rd(读取)usb_cmd(接受命令)usb_wrset(写设置)usb_wr(写入)usb_wrsel(写选择)。 状态机通常处于usb_idle(空闲)状态下,此时sloe、slwr、slrd均置为无效,同时写入(wr_oe)信号和读出信号(rd_oe)也都无效,fifoaddr指向ep2。当ep2非空,即接收到上位机发送来的命令时,状态机跳转到usb_rdset(读设置),当ep2空时,检测FPGA是否有数据要发送到PC机,若有,则跳转到usb_wrset(写设置),否则保持在usb_idle(空闲)。 当ep2非空,即接收到上位机发送来的命令时,状态机跳转到usb_rdset(读设置),在此状态中将sloe、slrd均置为有效。于是直接跳转到下一个状态usb_rd(读取)。在这个状态,置rd_oe信号有效,FPGA读取ep2的命令数据,存入cmd寄存器中。然后直接跳转到下一个状态usb_cmd(接受命令)。在该状态中将rd_oe置为无效,slrd置为无效,同时按照cmd寄存器中的各位数值完成命令操作。在本状态,查看ep2是否为空,如果是则跳转到usb_idle(空闲),否则跳转到usb_rdset(读设置)。至此,读取1个命令以及进行命令处理已经完成。 当ep2空,同时FPGA写入数据信号(fd_oe)有效时,状态机由usb_idle(空闲)跳转到usb_wrset(写设置)。在usb_wrset(写设置)中,将fifoaddr指向ep6的fifo,同时wr_oe有效,使待写入数据送上fd数据线,此时slwr仍无效。然后状态跳转到usb_wr(写入),将slwr置有效,写入数据,然后状态转入usb_wrsel(写选择)。在usb_wrsel(写选择)中,slwr置无效,再wr_oe置无效,从而方便下次写入。如果fd_oe有效,且ep2为空,即有数据要写入没有命令到来,则将状态转入usb_wrset(写设置),否则转入usb_idle(空闲)。至此,写入1个数据处理完成 此状态机制,保证了每次写入或者读出的完整性,同时又保证了读取命令优先于写入数据。同时需要注意本状态机机制从来没有将USB设备关闭挂起过,而是将FPGA的传输数据与否进行了相应控制,从而实现对数据的控制,USB始终处于工作状态。