@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; /*产生写u*** FIFO信号的下降沿
end
Sstate3:
begin
Sstate<=Sstate0;
/*在此添加处理帧发送完毕的代码和清除SendEN 信号的代码,本文略*/
end
end
else
begin
Sstate<=Sstate0;
USB_WR<=0;
End
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的数据;而发送数据则可自动或手动发送,由用户自己设置。以上操作与操纵标准的串行口完全一致。