热度 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始终处于工作状态。