利用FPGA实现外设通信接口之: 典型实例-USB 2.0接口的设计与实现
操作;否则转入WRITE_END状态,写操作结束。
·WRITE_END:把相关寄存器置为初始态,转入IDLE状态,开始下一个60KB的读写操作。
状态机的源代码如下:
case(STATE)
IDLE:
begin
//添加RESET状态
data_wr=h0; //USB接口信号初始化
u_slwr=b1;
u_slrd=b1;
u_sloe=b1;
u_addr0=b1;
u_addr1=b1;
oe=b0;
sram_d_i=h0; //SRAM的控制信号初始化
sram_a=h3ffff;
sram_re=b1;
sram_wr=b1;
wr_flag=b0;
STATE=READ_EVENT;
end
READ_EVENT:
begin
wr_flag=b1; //设定读写标志
u_addr0=b0; //指定端点FIFO
u_addr1=b0;
STATE=POINT_TO_OUT_FIFO;
end
POINT_TO_OUT_FIFO:
begin
if(u_flagc) //如果flagc高,FIFO不空,开始读数据
begin
u_sloe=b0; //开始从FX2的端点FIFO读数据
u_slrd=b1;
STATE=DATA_READY;
end
else
begin //如果flagc为低,FIFO为空,等待FIFO有数据
u_sloe=b1; //停止从FX2的端点FIFO读数据
u_slrd=b1;
STATE=POINT_TO_OUT_FIFO;
end
end
DATA_READY:
begin
if(u_flagc) //如果flagc为高,继续读取下一个数据
begin
u_slrd=b0;
sram_a=sram_a+1; //把上一个读取的数据写入SRAM
sram_d_i=data;
sram_wr=b0;
sram_re=b1;
STATE=READ; //完成数据写入后,进入读数据状态
end
else
begin
u_slrd=b1; //如果FIFO空,回到等待状态
u_sloe=b1;
STATE=POINT_TO_OUT_FIFO;
end
end
READ:
Begin
u_slrd=b1; //完成上一个数据的SRAM写周期
sram_re=b1;
sram_wr=b1;
if(sram_a!=ADDR_FULL) //如果SRAM地址没有到最大值,继续读操作
STATE=DATA_READY;
else
STATE=READ_END; //如果SRAM地址到达最大值,结束读操作
end
READ_END:
begin
u_slrd=b1; //回到初始状态,准备写操作
u_sloe=b1;
u_addr0=b0;
u_addr1=b0;
sram_a=h3ffff;
STATE=WRITE_EVENT;
end
WRITE_EVENT:
begin
u_addr0=b0; //指定写数据的端点FIFO
u_addr1=b1;
oe=b1;
wr_flag=b0;
STATE=POINT_TO_IN_FIFO;
end
POINT_TO_IN_FIFO:
begin
sram_a=sram_a+1; //从SRAM中读取一个数据
sram_re=b0;
sram_wr=b1;
STATE=WRITE_READY;
end
WRITE_READY:
begin
if(u_flagb)
begin //如果FIFO不满,开始写数据到FX2的FIFO
data_wr=sram_d;
u_slwr=b0;
u_slrd=b1;
STATE=WRITE;
end
else
begin
u_slwr=b1; //如果FIFO已满,等待
u_slrd=b1;
STATE=WRITE_READY;
end
end
WRITE:
begin
u_slwr=b1;
u_slrd=b1;
if(sram_a!=ADDR_FULL)
begin
sram_a=sram_a+1; //如果SRAM地址没有达到最大值,继续从SRAM读数据
sram_wr=b1;
sram_re=b0;
STATE=WRITE_READY;
end
else
begin
sram_a=h3ffff;//如果SRAM地址达到最大值,复位SRAM地址,进入写结束
sram_wr=b1;
sram_re=b1;
STATE=WRITE_END;
end
end
WRITE_END:
begin
wr_flag=b0; //结束写FX2FIFO状态,回到初始的IDLE状态
sram_a=h3ffff;
u_addr0=b1;
u_addr1=b1;
STATE=IDLE;
end
default:
STATE=IDLE;
endcase
10.7.5小结
本节对利用USB接口芯片FX2来完成FPGA和PC机的高速数据传输做了介绍,并通过编译下载在红色飓风的开发板上实现了预定功能。
- 利用FPGA实现外设通信接口之:利用FPGA实现USB 2.0通信接口(06-05)
- 基于总线的嵌入式高速图像通信系统设计(12-21)
- 基于USB 2.0数据采集系统的程序设计(12-21)
- USB2.0接口全接触(12-14)
- 如何轻松地将USB 2.0变为USB Type-C(12-13)
- USB设备插在物理机USB2.0接口上无法正常映射的解决方法(12-13)