微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 利用FPGA实现外设通信接口之: 典型实例-USB 2.0接口的设计与实现

利用FPGA实现外设通信接口之: 典型实例-USB 2.0接口的设计与实现

时间:06-05 来源:互联网 点击:

操作;否则转入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机的高速数据传输做了介绍,并通过编译下载在红色飓风的开发板上实现了预定功能。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top