使用Verilog对USB芯片的控制时序示例
FPGA:Altera Cyclone IV E EP4CE30F23C8
Software:Quartus II 13.0
USB IC: CY7C68013A
本代码针对 所使用的开发板上的USB芯片 调试,不保证一定可以移植到别的平台上正常使用,仅供参考
USB的传输方式选择了异步传输
usb_ctrl.v: CY7C68013A USB芯片的驱动程序,使用verilog语言usb_top.v: 对usb_ctrl.v的示例使用程序(example)
LOOP_WORK: 当该参数设为1时,发送的数据将会是从USB芯片接受到的数据,形成一个loopback,write_data输入端口无效AUTO_WORK: 当该参数设为1时,驱动将会自动完成读取USB数据到向USB写入数据的过程,此参数主要用于测试使用AUTO_RNUM: 当AUTO_WORK为1时,该值有效,该值表示每次读取数据过程的数目,同时rd_wr_num输入端口无效AUTO_WNUM: 当AUTO_WORK为1时,该值有效,该值表示每次写入数据过程的数目,同时rd_wr_num输入端口无效TS_NUM: 每次读取过程或者写入数据过程中需要等待的时间长度,时间最好控制在50ns以上
-
IDLE:空闲状态,如果不在测试状态(AUTO_WORK = 0),会根据rd_wr_en, usb_n_ept_to或usb_n_ful_sx进行状态跳转至RD_PRE,WR;否则会根据usb_n_ept_to或usb_n_ful_sx进行状态跳转至RD_PRE,WR,优先进入RD_PRE -
RD_PRE:读取准备状态,拉低usb_sloe, usb_slrd,然后跳转至RD -
RD:读取状态,如果fifo读取已空,会跳转至RD_BURST;如果不在测试状态,会根据rd_wr_en,cnt_data进行状态跳转至RD_OVER,RD_BURST;否则会根据cnt_data进行状态跳转至RD_BURST,该过程usb_sloe,usb_slrd,ts_cnt会进行相关操作 -
RD_BURST:读取结束状态,如果不在测试状态,状态回到IDLE状态,否则根据usb_n_ful_sx跳转到WR或IDLE状态 -
RD_OVER:再次读取状态,该状态在测试状态下不会使用。仅当非测试状态并且在RD状态下读取完rd_wr_num的数据后rd_wr_en依旧使能读状态时会进入该状态;如果fifo读取已空,会跳转至RD_BURST,会根据rd_wr_en,cnt_data进行状态跳转至RD_OVER,RD_BURST -
WR:写入状态,如果fifo写入已满,会跳转至WR_BURST;如果不在测试状态,会根据rd_wr_en,cnt_data进行状态跳转至WR_OVER,WR_BURST;否则会根据cnt_data进行状态跳转至WR_BURST,该过程usb_sloe,usb_slrd,ts_cnt会进行相关操作 -
WR_BURST:写入结束状态,状态跳转至IDLE状态 -
WR_OVER:再次写入状态,该状态在测试状态下不会使用。仅当非测试状态并且在WR状态下读取完rd_wr_num的数据后rd_wr_en依旧使能写状态时会进入该状态;如果fifo写入已满,会跳转至WR_BURST,会根据rd_wr_en,cnt_data进行状态跳转至WR_OVER,WR_BURST
主要是wr_req(控制inout端口的usb_data的输入输出方向),cnt_data(记录读取或写入数据的数目),ts_cnt(每次读取或者写入过程前的setup time计数器)在各种状态下的输出操作。
主要有tra_data(传输数据),usb_slcs(usb片选信号,低有效),usb_sloe(usb输出有效信号,低有效),usb_slrd(usb读取信号,低有效),usb_slwr(usb写入信号,低有效),usb_addr(usb的fifo地址),read_data(读取的数据),output_valid(输出数据的有效指示信号),write_ready(写入数据的准备信号)。