USB3.0芯片FT601Q简介及FPGA实现

这篇具有很好参考价值的文章主要介绍了USB3.0芯片FT601Q简介及FPGA实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

FT601Q介绍

  FT601Q 是 FTDI 推出的一款超高速 USB3.0 芯片,提供高达 5Gbps 的带宽。该芯片不需要额外的固件开发,共有 4 个写通道和 4 个读通道,每个通道的缓冲大小均为 4KB。FT601Q 具有多种工作模式,本文介绍并实现相对简单的同步 FIFO 模式——245 mode。

  FT601 工作模式在上电时检测 GPIO0/GPIO1 来确定,当 {GPIO1,GPIO0}=2‘b00 时,FT601Q 将进入 245 工作模式。

  首先对 FT601Q 的引脚功能进行介绍,QFN76 封装如下

USB3.0芯片FT601Q简介及FPGA实现

  • DATA0 - DATA31,数据引脚,inout
  • BE0 - BE3,Byte Enable 引脚,inout,高电平有效;DATA被分成了4Byte,每个 Byte 占据一个通道,通道间相互独立,通过 BE 引脚进行控制
  • RESET_N,input,控制 FT601Q 的上电
  • SIWU_N,input,保留引脚,必须拉高
  • TXE_N,input,USB FIFO 可写信号,低电平有效
  • RXF_N,input,USB FIFO 可读信号,低电平有效
  • WR_N,input,USB FIFO 写使能,低电平有效
  • RD_N,input,USB FIFO 读使能,低电平有效
  • OE_N,input,USB FIFO DATA OUT Enable,数据输出使能信号,低电平有效
  • WAKEUP_N,inout,指示 FT601 是否处于休眠状态,也可以通过拉低该引脚唤醒 FT601Q
  • GPIO0、GPIO1,inout,功能较多,本文这里只用到上电时确定工作模式,其余不表
  • CLK,output,FT601Q 输出的时钟信号,可配置为 66MHz 或 100MHz,默认 100MHz。有一点需要注意,在 FT601Q 启动后,若没能与上位机建立通信,FT601 将自动休眠,该时钟也会消失!因此必须配合上位机 api 进行使用

  245 模式下,同步写时序如下图

USB3.0芯片FT601Q简介及FPGA实现

在检测到 FIFO 可写信号 TXE_N=L 时,FPGA 拉低 WR_N 以开始写 FT601Q 内部的 FIFO,在 CLK 上升沿,数据将被写入 FIFO 中。我们利用全部的 4 个通道,因此 BE 应置为 0b1111。

  同步读时序如下图

USB3.0芯片FT601Q简介及FPGA实现

在检测到 FIFO 可读信号 RXF_N=L 时,FPGA 需要拉低 OE_N 与 RD_N 引脚以开始数据读取(测试表明 RD_N 信号可以和 OE_N 同时有效,而不必如时序图中检测到 OE_N 有效后才拉低),FT601Q 将在 CLK 的下降沿给出数据,因此用户可在上升沿读到稳定的数据。该模式下,读取会用到全部的四个通道,即 USB 芯片给出 BE=0b1111。

FPGA代码实现

  为了可以简单适配各种读写时钟的情况,可以例化两个异步 FIFO,一个用于写通道,将写时钟 clk 下的数据写入 FIFO_w,而一旦检测到 FIFO_w 非空,即可将数据推送给 USB FIFO。另一个用于读通道,一旦检测到 USB FIFO 可读,就获取数据并存入 FIFO_r,用户可在读时钟 clk 域下从 FIFO_r 中获取数据。

/* 
 * file			: FT601Q.v
 * author		: 今朝无言
 * Lab			: WHU-EIS-LMSWE
 * date			: 2023-04-03
 * version		: v2.0
 * description	: usb3.0 芯片 FT601Q-QFN76 读写控制
 * Copyright © 2023 WHU-EIS-LMSWE, All Rights Reserved.
 */
// 两种模式:245 Synchronous FIFO mode、Multi-Channel FIFO mode
// 这里实现 245 Synchronous FIFO mode
module FT601Q(
input				clk,			//用于复位计时及外部FIFO读写时钟
input				rst_n,

//---------------FT601Q------------------
input				USB_CLK,		//FT601Q输出的时钟,可配置为66MHz或100MHz
//通过官方提供的上位机软件(FT600ChipConfigurationProgUtility_v1.3.0.2),可以配置PID、VID、Clock Freq等一系列属性

inout		[31:0]	USB_D,			//32bit数据总线,I/O
inout		[3:0]	USB_BE,			//Byte Enable,高电平有效   1111 表示使用 4 Channel

input				USB_TXE,		//FT601Q-FIFO可写信号(即601Q-FIFO非满),低电平有效
input				USB_RXF,		//FT601Q-FIFO可读信号(即601Q-FIFO非空),低电平有效

output	reg			USB_OE,			//FT601Q-输出使能(Data Output Enable),低电平有效
output	reg			USB_RD,			//FT601Q-读使能,低电平有效
output	reg			USB_WR,			//FT601Q-写使能,低电平有效

inout				USB_Wakeup,
//Suspend/Remote Wakeup pin by default Low when USB is active, high when USB is in suspend. 
//Application can drive this pin low in in USB suspend to generate a remote wakeup signal to the USB host.

output	reg			USB_RSTn,		//RESET_N,也即USB_EN,控制USB的上电

output				USB_SIWU,		//reserved,should pull-up

inout				USB_GPIO0,		//GPIO0
inout				USB_GPIO1,		//GPIO1

//-------------FPGA Control------------------
input				wr_en,			//高电平有效
input		[31:0]	wrdat,
output				full,

input				rd_en,			//高电平有效
output		[31:0]	rddat,
output				empty
);

//-------------------------state define------------------------------
localparam	RESET	=  8'h01;
localparam	IDLE	=  8'h02;
localparam	WRITE	=  8'h04;		//若write fifo非空,且usb fifo可写,将数据推入USB,写优先
localparam	READ	=  8'h08;		//若usb fifo可读,且read fifo非满,将数据读到read fifo

//------------------------------------------------------------------
reg		[7:0]	state		= RESET;
reg		[7:0]	next_state	= RESET;

wire			w_fifo_full;
wire			w_fifo_empty;
wire			r_fifo_full;
wire			r_fifo_empty;

reg				w_fifo_rden		= 1'b0;
reg				r_fifo_wren		= 1'b0;

wire			fifo_rst;
assign			fifo_rst		= ~rst_n;

reg		[7:0]	rst_cnt			= 8'd0;

//----------------------------iobuf---------------------------------
wire	[31:0]	USB_D_buf;
reg				USB_D_link	= 1'b0;

assign	USB_D	= (USB_D_link)? USB_D_buf : 32'dz;

wire			GPIO0_buf;
wire			GPIO1_buf;
reg				GPIO_link	= 1'b0;

assign	GPIO0_buf	= 1'b0;
assign	GPIO1_buf	= 1'b0;
assign	USB_GPIO0	= (GPIO_link)? GPIO0_buf : 1'bz;
assign	USB_GPIO1	= (GPIO_link)? GPIO1_buf : 1'bz;

wire	[3:0]	USB_BE_buf;
reg				USB_BE_link	= 1'b0;

assign	USB_BE_buf	= 4'b1111;
assign	USB_BE		= (USB_BE_link)? USB_BE_buf : 4'dz;

//-------------------------write fifo--------------------------------
//异步FIFO    采用 First Word Fall Through 模式
fifo_generator_ft60x fifo_w(
	.rst		(fifo_rst),
	.wr_clk		(clk),
	.rd_clk		(USB_CLK),
	.din		(wrdat),
	.wr_en		(wr_en),
	.rd_en		(w_fifo_rden),
	.dout		(USB_D_buf),
	.full		(w_fifo_full),
	.empty		(w_fifo_empty)
);

//--------------------------read fifo--------------------------------
//异步FIFO
fifo_generator_ft60x fifo_r(
	.rst		(fifo_rst),
	.wr_clk		(USB_CLK),
	.rd_clk		(clk),
	.din		(USB_D),
	.wr_en		(r_fifo_wren),
	.rd_en		(rd_en),
	.dout		(rddat),
	.full		(r_fifo_full),
	.empty		(r_fifo_empty)
);

//-----------------------------FSM----------------------------------
always @(posedge clk or negedge rst_n) begin
	if(~rst_n) begin
		state		<= RESET;
		rst_cnt		<= 8'd0;
	end
	else begin
		state		<= next_state;

		if(rst_cnt < 8'd200) begin
			rst_cnt		<= rst_cnt + 1'b1;
		end
		else begin
			rst_cnt		<= rst_cnt;
		end
	end
end

always @(*) begin
	case(state)
	RESET: begin
		if(rst_cnt >= 8'd200) begin
			next_state	<= IDLE;
		end
		else begin
			next_state	<= RESET;
		end
	end
	IDLE: begin
		if((~USB_TXE) && (~w_fifo_empty)) begin
			next_state	<= WRITE;
		end
		else if((~USB_RXF) && (~r_fifo_full)) begin
			next_state	<= READ;
		end
		else begin
			next_state	<= IDLE;
		end
	end
	WRITE: begin
		if(USB_TXE || w_fifo_empty) begin
			next_state	<= IDLE;
		end
		else begin
			next_state	<= WRITE;
		end
	end
	READ: begin
		if(USB_RXF || r_fifo_full) begin
			next_state	<= IDLE;
		end
		else begin
			next_state	<= READ;
		end
	end
	default: begin
		next_state	<= IDLE;
	end
	endcase
end

//----------------------------Control--------------------------------
assign	full		= w_fifo_full;
assign	empty		= r_fifo_empty;

assign	USB_SIWU	= 1'b1;

always @(posedge clk) begin
	case(state)
	RESET: begin
		GPIO_link	<= 1'b1;
	end
	default: begin
		GPIO_link	<= 1'b0;
	end
	endcase
end

always @(*) begin
	case(state)
	RESET: begin
		USB_RSTn	<= 1'b0;
	end
	default: begin
		USB_RSTn	<= 1'b1;
	end
	endcase
end

always @(*) begin
	case(state)
	WRITE: begin
		USB_D_link	<= 1'b1;
	end
	default: begin
		USB_D_link	<= 1'b0;
	end
	endcase
end

// ------------USB FIFO write--------------
always @(*) begin
	case(state)
	WRITE: begin
		USB_BE_link		<= 1'b1;
		USB_WR			<= ((~USB_TXE) & (~w_fifo_empty))? 1'b0 : 1'b1;
		w_fifo_rden		<= ((~USB_TXE) & (~w_fifo_empty))? 1'b1 : 1'b0;
	end
	default: begin
		USB_BE_link		<= 1'b0;
		USB_WR			<= 1'b1;
		w_fifo_rden		<= 1'b0;
	end
	endcase
end

// ------------USB FIFO read---------------
always @(*) begin
	case(state)
	READ: begin
		USB_OE			<= ((~USB_RXF) & (~r_fifo_full))? 1'b0 : 1'b1;
		USB_RD			<= ((~USB_RXF) & (~r_fifo_full))? 1'b0 : 1'b1;
	end
	default: begin
		USB_OE			<= 1'b1;
		USB_RD			<= 1'b1;
	end
	endcase
end

always @(posedge USB_CLK) begin
	case(state)
	READ: begin
		r_fifo_wren		<= ((~USB_RXF) & (~r_fifo_full))? 1'b1 : 1'b0;
	end
	default: begin
		r_fifo_wren		<= 1'b0;
	end
	endcase
end

endmodule

环回测试

  使用官方提供的上位机 Loopback 测试程序进行测试,结果如下

USB3.0芯片FT601Q简介及FPGA实现
USB3.0芯片FT601Q简介及FPGA实现

  由测试结果可以看到,FT601Q是小端传输,首先发送 B0(将接收到的第一个字节放在 B0),然后发送 B1(将接收到的第二个字节放在 B1),依次类推 B2、B3 的收发次序。例如本次 LoopBack 测试,发送的 0x764dfffe,在 FPGA 接收到的是 0xfeff4d76,直接转发回上位机,又得 0x764dfffe,实际使用时请务必注意这个问题

something

USB3.0芯片FT601Q简介及FPGA实现

  在上位机测试时遇到的一些坑,在此记录:

  • 使用 Python 进行调试(D3XXPython_Release)时提示缺失 dll:需要将 FTD3XXLibray 压缩包中的 FTD3XX.dll 添加到路径
  • 启动 LoopbackDemo、StreamerDemo 后,检测不到 USB 设备,然而查看设备管理器可以看到该设备:是因为缺少 FTDI 驱动,安装驱动(ftdi_ft60x_1.2.0.5)后即可解决

以上压缩包和驱动均能在 FTDI 官网找到。

  FT600ChipConfigurationProgUtility 压缩包中是 FT600/FT601Q 的配置程序,通过该程序可以修改芯片的 VID、PID、Serial Number、Clock Frequency 等。文章来源地址https://www.toymoban.com/news/detail-448400.html

到了这里,关于USB3.0芯片FT601Q简介及FPGA实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FPGA与CYUSB3014实现USB3.0数据传输学习笔记(1)

    简单介绍          赛普拉斯将CYUSB3014简称为EZ-USB FX3,该芯片用于USB3.0的外设控制。           EZ-USB FX3 集成了 USB 3.0 和 USB 2.0 物理层 (PHY) 以及 32 位 ARM926EJ-S 微处理器,具有强大的数据处理能力,并可用于构建定制应用。 本产品采用了一种巧妙的架构,使从 GPIF II 到

    2024年02月09日
    浏览(31)
  • FPGA和USB3.0通信

    1、USB3.0介绍 USB3.0协议:协议就是传输数据的规则,定义接口设备、器件及信号、总线及通道之间需要满足的关系。 USB3.0接口:接口是一种连接标准,又常常被称之为物理接口。 USB3.0总线:总线是一组传输通道,是各种逻辑器件构成的传输数据的通道,一般由由数据线、地址线、

    2024年02月01日
    浏览(24)
  • 芯片FT量测简介

    概要:芯片的量测需求的资源主要是ATE+Handler+量测治具+测试程序。 ATE:ATE是Automatic Test Equipment的缩写, 于半导体产业意指集成电路(IC)自动测试机, 用于检测集成电路功能之完整性, 为集成电路生产制造之最后流程, 以确保集成电路生产制造之品质。 Handler:即Test Handler集

    2024年02月02日
    浏览(35)
  • FPGA2-采集OV5640乒乓缓存后经USB3.0发送到上位机显示

    基于特权A7系列开发板,采用OV5640摄像头实时采集图像数据,并将其经过USB3.0传输到上位机显示。这是验证数据流能力的很好的项目。其中,用到的软件版本,如下表所示,基本的硬件情况如下。该项目对应FPGA工程源码,qt工程源码,以及USB固件的下载地址 软件 版本 QT 5.15

    2024年02月15日
    浏览(31)
  • CS5366电路原理图|Type-C转HDMI2.0 4K60+USB3.0+PD3.1高集成度视频转换芯片方案电路

    CS5366内部集成了PD3.0及DSC decoder,应用Type-C转HDMI2.0的显示协议转换芯片, 简介: CS5366系列提供了USB Type-C(DisplayPort Alternate Mode)到HDMI转换器的单芯片解决方案,带有电源传输。CS5366系列支持一个USB Type-C插头和一个USB Type-C插座。CS5366系列符合USB电源传输规范3.0。CS5366系列的集成

    2024年02月08日
    浏览(35)
  • Lattice FPGA解码MIPI视频,IMX219摄像头4Line 1080P采集USB3.0输出,提供工程源码硬件原理图PCB和技术支持

    FPGA图像采集领域目前协议最复杂、技术难度最高的应该就是MIPI协议了,MIPI解码难度之高,令无数英雄竞折腰,以至于Xilinx官方不得不推出专用的IP核供开发者使用,不然太高端的操作直接吓退一大批FPGA开发者,就没人玩儿了。 本设计基于Lattice的LCMXO3LF-6900C-5BG256C开发板,采

    2024年02月02日
    浏览(41)
  • USB版本区别(USB2.0、USB3.0、USB3.1、USB3.2Gen1、USB3.2Gen2)

    买了个显示器挂灯,但显示器上没有USB接口,就打算用主板上的USB。挂灯的电源要求是5V2A,主板上有8个USB接口,又分了三个不同版本,看完人有点晕。USB2.0、USB3.0倒是听说过,USB3.2Gen1是啥?USB3.2Gen2又是啥?哪个能输出5V2A?接着就是一顿查,记录一下。。。 首先,主板的

    2024年02月11日
    浏览(28)
  • 【FPGA 芯片设计】FPGA 简介 ( FPGA 芯片架构 | FPGA 芯片相对于传统芯片的优点 )

    摩尔定律 : 价格不变 , 在集成电路上 电子元器件的数量 , 18 ~ 24 个月增加一倍 , 同时芯片性能也增加一倍 ; 同样花 5000 元 , 每隔 18 ~ 24 个月 , 买到的电脑性能可以翻一番 , 买电脑不要买最好的 , 第二年就淘汰 ; FPGA 英文全称 Field Programmable Gate Array , 中文名称为 \\\" 现场可编程门

    2024年02月03日
    浏览(70)
  • Type-C、USB-C、USB3.1 三者关系

    USB-C(USB Type-C) = 传输标准USB3.1 +硬件接口标准 Type-C USB-C接口全称为USB type-c,属于USB 3.0下一代接口,其亮点在于更加纤薄的设计、更快的传输速度(最高可达10Gbps)、更强的电力传输(最高100W),此外USB-C接口还支持双面插入,正反面随便插,相比USB2.0/USB3.0更为先进。 USB-C接

    2023年04月08日
    浏览(63)
  • EagleSDR USB HAT FT600

    给EagleSDR做了个USB 3.0的子卡,采用FT600方案,实物如下: 用FT600DataStreamerDemoApp测试,速度如下: 由于FT600是16bit的接口,如果用FT601的32bit接口,性能应该还会有大幅提升。 测试代码很简单,参考了网上大佬的例程

    2024年02月09日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包