驱动ft232h通信

FT232H是一个单通道USB 2.0高速(480Mb/s)转换为UART/FIFO IC,具有多种工业标准串行或并行接口配置能力。

1.实验板卡

FPGA型号:

FT232H型号:

FT232H SINGLE CHANNEL HI-SPEED USB TO MULTIPURPOSE UART/FIFO IC Datasheet
Version 2.0

2.数据手册说明

选择的是同步fifo模式。上面是管脚信号说明。

以上是读写时序

注意这里的时钟周期是60mhz,我用的是FPGA上的PLL输出的60m的时钟,因为如果要用FT232H输出的时钟的话,需要对EEPROM进行配置,配置成FIFO模式,再通过上位机发送同步指令才可以输出60MHZ时钟。

时钟周期等于16.67 ns,也就是时钟频率是1/T=1/16.67ns=1/1.67*10^(-9),结果约等于60MHZ。

FT232配置见:FPGA外接FT232H配置FIFO实现USB通信回环测试-CSDN博客

3.代码设计

FPGA中FIFO IP的时序。写的时候写使能和数据是同步的,读出数据的时候,读出的数据延迟读使能信号一个周期。

3.1 ft232h_top

module ft232h_top(/////////////////////////////debuginput jtag_inst1_CAPTURE  ,input jtag_inst1_DRCK 	  ,input jtag_inst1_RESET 	  ,input jtag_inst1_RUNTEST  ,input jtag_inst1_SEL 	  ,input jtag_inst1_SHIFT 	  ,input jtag_inst1_TCK 	  ,input jtag_inst1_TDI 	  ,input jtag_inst1_TMS 	  ,input jtag_inst1_UPDATE   ,output jtag_inst1_TDO	  ,/////////////////////////////////input 				i_usb_60m		,//input 				reset		,input 				rxf_n		,input 				txe_n		,output  			rd_n		,output  			wr_n		,output 				siwu_n		,output  			oe_n		, //oe_n:0,FT232h数据输出;oe_n:1,FPGA数据输入到FT232中去	input 	[7:0]		data_in		,output  [7:0]		data_out	,output  [7:0]		data_out_oe	);wire empty;
wire [7:0]data_wr;
wire wr_fifo;
wire rst_busy;
wire full;
wire [7:0] data_rd;
wire reset		;
wire [7:0]data_count;
wire rd_fifo_flag_r;
wire rd_fifo_flag;assign siwu_n=1'b1;        //用于唤醒主机电脑fifo u_fifo(
.full_o 		( full ),
.empty_o 		( empty ),
.rdata 			( data_rd ),
.clk_i 			( i_usb_60m ),
.wr_en_i 		( wr_fifo ),
.rd_en_i 		( rd_fifo ),
//.a_rst_i 		( vio_reset_n ),
.a_rst_i 		( reset ),
.wdata 			( data_wr ),
.datacount_o 	( data_count ),
.rst_busy 		(  ) //高电平有效,高电平复位
);ft232h_send ft232h_send_inst(.clk_60m	(i_usb_60m)	,//.reset	(vio_reset_n)	,.reset	(reset)	,.rxf_n		(rxf_n)		, .data_in	(data_in)	, .wr_n		(wr_n),.rd_n		(rd_n)		, .oe_n	    (oe_n) , .empty_o	(empty)		,.full_o		(full)		,//.rst_busy	(rst_busy)	,.data_wr    (data_wr)  	, .wr_fifo	(wr_fifo)	
);ft232h_recv ft232h_recv_inst(.clk_60m	(i_usb_60m)	,//.reset	(vio_reset_n)	,.reset	(reset)	,.txe_n		(txe_n),.rd_n		(rd_n),.oe_n		(oe_n),.rxf_n		(rxf_n),.wr_fifo	(wr_fifo),.wr_n		(wr_n),.data_out	(data_out),.data_out_oe(data_out_oe),//.rst_busy	(rst_busy),.data_count (data_count),.full_o		(full),.empty_o	(empty)	,.data_rd	(data_rd)	,.rd_fifo	(rd_fifo)	,.rd_fifo_flag_r	(rd_fifo_flag_r),.rd_fifo_flag	(rd_fifo_flag)
);edb_top edb_top_inst (.bscan_CAPTURE      ( jtag_inst1_CAPTURE ),.bscan_DRCK         ( jtag_inst1_DRCK ),.bscan_RESET        ( jtag_inst1_RESET ),.bscan_RUNTEST      ( jtag_inst1_RUNTEST ),.bscan_SEL          ( jtag_inst1_SEL ),.bscan_SHIFT        ( jtag_inst1_SHIFT ),.bscan_TCK          ( jtag_inst1_TCK ),.bscan_TDI          ( jtag_inst1_TDI ),.bscan_TMS          ( jtag_inst1_TMS ),.bscan_UPDATE       ( jtag_inst1_UPDATE ),.bscan_TDO          ( jtag_inst1_TDO ),.la0_clk            ( i_usb_60m ),.la0_rxf_n      	( rxf_n ),.la0_txe_n      	( txe_n ),.la0_rd_n       	( rd_n ),.la0_wr_n       	( wr_n ),.la0_oe_n       	( oe_n ),.la0_data_in        ( data_in ),.la0_data_out       ( data_out ),.la0_data_out_oe    ( data_out_oe ),.la0_siwu_n     	( siwu_n ),.la0_reset      	( reset ),.la0_data_wr        ( data_wr ),.la0_empty      	( empty ),.la0_full       	( full ),.la0_wr_fifo        ( wr_fifo ),.la0_data_rd        ( data_rd ),.la0_rd_fifo        ( rd_fifo ),.la0_data_count		(data_count),.la0_rd_fifo_flag_r  (rd_fifo_flag_r ),.la0_rd_fifo_flag     (rd_fifo_flag ),.vio0_clk       	( i_usb_60m ),.vio0_data_in   	( data_in ),.vio0_data_out  	( data_out ),.vio0_data_out_oe	( data_out_oe ),.vio0_reset     	( reset )
);endmodule

3.2  ft232h_send

//读出FT232H的值,也就是驱动FT232H发送数据,
module ft232h_send(input 				clk_60m		,input 				reset		,input 				rxf_n		, //FT232h输出的信号,当rxf_n为低时,fpga可以通过驱动RD低来读取数据。input 	[7:0]		data_in		, //FT232h从上位机中读出的数据input 				wr_n		,			output  reg 		rd_n		, //output 	reg 		oe_n	, //oe_n:驱动FT232H引脚上的数据输出到FPGA//fifo信号	input				empty_o		,input 				full_o		,//input 				rst_busy	,output reg [7:0]	data_wr    , //	data_wr_reg:要写入FPGA里面的FIFO的数据。output reg 			wr_fifo		 //fifo的写使能信号	
);reg [7:0] data_wr_reg;reg rxf_n_r		;
reg wr_n_r		;
reg empty_o_r	;
reg oe_n_r;
reg rd_n_r;always@(posedge clk_60m or posedge reset)beginif(reset==1'b1)oe_n<=1'b1;else if(rxf_n==1'b0&&wr_n==1'b1)	oe_n<=1'b0;else oe_n<=1'b1;
endalways@(posedge clk_60m or posedge reset)beginif(reset==1'b1)rd_n<=1'b1;else beginif(oe_n==0 && wr_n == 1&&rxf_n==1'b0)  rd_n<=1'b0;elserd_n<=1'b1;end
endalways@(posedge clk_60m or posedge reset)beginif(reset==1'b1)rd_n_r<=1'b1;else beginrd_n_r<=rd_n;end
endalways@(posedge clk_60m or posedge reset)beginif(reset==1'b1)data_wr<='d0;else if(oe_n==1'b0&&wr_n==1'b1&&rd_n==1'b0)data_wr<=data_in;elsedata_wr<=8'h00;
end//wr_fifo:wr_fifo延迟rd_n一个周期
always@(posedge clk_60m or posedge reset)beginif(reset==1'b1)wr_fifo <= 1'b0;else if (rd_n_r==1'b1&&rd_n==1'b0&&rxf_n==1'b0&&full_o==1'b0&&wr_n==1'b1)	wr_fifo <= 1'b1;else if(rxf_n==1'b1)wr_fifo <= 1'b0;elsewr_fifo<=wr_fifo;
endendmodule

3.3 ft232h_recv

module ft232h_recv(input 				clk_60m		,input 				reset		,input 				txe_n		,input 				rd_n		,input 				oe_n		,input 				rxf_n		,input 				wr_fifo		,output reg 			wr_n		,output reg [7:0]	data_out	,output reg [7:0]    data_out_oe  ,//fifo信号//input    			rst_busy	,input 				data_count	,input				full_o		,input 				empty_o		,input [7:0]			data_rd		,output reg			rd_fifo		,output reg 			rd_fifo_flag_r,output reg 			rd_fifo_flag
);reg rd_fifo_r;
reg rd_fifo_flag;
//reg rd_fifo_flag_r;
reg empty_o_r		;always@(posedge clk_60m or posedge reset)beginif(reset==1'b1)empty_o_r<=1'b0;elseempty_o_r<=empty_o;
endalways@(posedge clk_60m or posedge reset)beginif(reset==1'b1)rd_fifo<=1'b0;else if(txe_n==1'b0&&empty_o==1'b0&&rd_n==1'b1)rd_fifo<=1'b1;elserd_fifo<=1'b0;
endalways@(posedge clk_60m or posedge reset)beginif(reset==1'b1)rd_fifo_flag<=1'b0;else if(rd_fifo==1'b1&&rd_fifo_r==1'b0)rd_fifo_flag<=1'b1;elserd_fifo_flag<=1'b0;
endalways@(posedge clk_60m or posedge reset)beginif(reset==1'b1)rd_fifo_flag_r<=1'b0;else rd_fifo_flag_r<=rd_fifo_flag;
endalways@(posedge clk_60m or posedge reset)beginif(reset==1'b1)rd_fifo_r<=1'b0;elserd_fifo_r<=rd_fifo;
endalways@(posedge clk_60m or posedge reset)beginif(reset==1'b1)begindata_out<='d0;endelsedata_out<=data_rd;	
endalways@(posedge clk_60m or posedge reset)beginif(reset==1'b1)begindata_out_oe<='d0;endelse if(rd_fifo_flag==1'b1&&txe_n==1'b0&&empty_o==1'b0&&rd_n==1'b1)data_out_oe<=8'hff;else if(empty_o_r==1'b1||txe_n==1'b1)data_out_oe<='d0;elsedata_out_oe<=data_out_oe;
endalways@(posedge clk_60m or posedge reset)beginif(reset==1'b1)wr_n<=1'b1;else beginif(rd_fifo_flag==1'b1&&txe_n==1'b0&&empty_o==1'b0&&rd_n==1'b1)wr_n<=1'b0;	else if(empty_o_r==1'b1||txe_n==1'b1)wr_n<=1'b1;elsewr_n<=wr_n;end
endendmodule

4.波形分析

5.管脚绑定

6.注意事项

(1)如果要使用外部输入的时钟作为FPGA的工作时钟,需要对时钟进行约束。

例如:

(2)下载比特流文件出错的原因

使用上面这个版本有bug,烧录比特流文件的时候,直接在下载比特流文件界面下载,把频率改成5mhz,然后再debug界面直接连接,不再下载。

(3)连接usb线的时候需要下载正确的驱动

(4)为什么要用相位差为270°的时钟?

(5)PLL的使用说明

PLL用法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/95789.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/95789.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

隔空盗刷、AI钓鱼、代理劫持…金融黑产竟进化至此?

【导读】中国工商银行发布的《2024网络金融黑产研究报告》&#xff0c;以深度洞察拆解黑产攻击“新变种”、勾勒防护新路径&#xff0c;自发布以来&#xff0c;成为金融安全行业的重要参考坐标。本文会提炼出报告中黑产攻击的五大技术演变与体系化防护思路&#xff0c;再结合金…

服务器为啥离不开传感器?一文看懂数据中心“隐形守护者”的关键角色

在现代数据中心或企业机房中&#xff0c;服务器不仅仅是“跑程序”的机器&#xff0c;它们还是一整套复杂系统的一部分。为了保证这些服务器稳定、高效、安全地运行&#xff0c;传感器成了不可或缺的角色。那么&#xff0c;服务器为啥要有传感器&#xff1f;这些传感器到底是干…

React JSX 语法讲解

&#x1f680; React JSX 语法讲解 1. 课程概述 本课程旨在系统讲解 JSX&#xff08;JavaScript XML&#xff09; 的核心概念与实战应用。JSX 是 React 的核心语法扩展&#xff0c;它允许我们在 JavaScript 中编写类似 HTML 的结构&#xff0c;使得构建用户界面变得直观和高效。…

软件安装教程(四):在 Windows 上安装与配置 MATLAB(超详细)

文章目录前言1. 安装前准备&#xff08;必看&#xff09;2. 下载 MATLAB&#xff08;推荐在线安装&#xff09;3. 在 Windows 上安装&#xff08;详细步骤&#xff09;4. 激活 MATLAB&#xff08;在线与离线&#xff09;5. 首次启动与界面入门6. 推荐的基本配置&#xff08;让环…

【运维自动化-标准运维】如何创建流程嵌套(子流程)

什么是子流程节点 标准运维里的流程节点有两类&#xff1a;标准插件节点和子流程节点。子流程节点实际上也是一个流程&#xff0c;比如某个业务线做全网更新时需要更新多个模块&#xff0c;那每个模块的更新流程可以称之为一个子流程。在总流程里直接添加子流程&#xff0c;就通…

clickhouse迁移工具clickhouse-copier

原来的集群没有高可用而且配置很低&#xff0c;所有准备将一个3分片1副本集群迁到1分片2副本的高配置集群&#xff0c;数据量比较大。 虽然官方已经标记clickhouse-copier已经过时&#xff0c;但为了方便和高效还是用了copier&#xff0c;效果还挺好 以下是使用步骤&#xff1a…

高频超声波传感器:以精准感知重塑未来科技生态

在智能制造的浪潮中&#xff0c;高频超声波传感器正以“隐形工程师”的角色&#xff0c;重新定义着工业检测、医疗诊断与环境监测的边界。这款融合了压电材料科学与微纳电子技术的精密仪器&#xff0c;凭借其亚毫米级测量精度与纳秒级响应速度&#xff0c;正在成为高端装备制造…

残差连接与归一化结合应用

残差连接&#xff08;Residual Connection / Skip Connection&#xff09;和归一化&#xff08;Normalization&#xff09;的结合&#xff0c;是现代深度学习模型&#xff08;尤其是深度神经网络和Transformer架构&#xff09;成功的关键因素之一。 核心概念回顾残差连接 (Resi…

K8s集群+Rancher Server:部署DolphinScheduler 3.2.2集群

本文手把手演示了如何在 K8s Rancher 环境中快速拉起一套生产可用的 Apache DolphinScheduler 3.2.2 集群。全文围绕“镜像加速、依赖本地化、存储持久化”三大痛点展开&#xff0c;附有详细的代码解析&#xff0c;收藏细看吧&#xff01; 环境准备 1、软件准备2、环境规划部署…

查询语言的进化:SQL之后,为什么是GQL?数据世界正在改变

数据是现代世界的核心驱动力。 在数据驱动的世界里&#xff0c;查询语言就像人与数据沟通的桥梁。 如何高效地获取、操作和理解数据&#xff0c;取决于查询语言的演进。 自20世纪70年代关系型数据库兴起以来&#xff0c;SQL&#xff08;Structured Query Language&#xff0…

AgentThink:一种在自动驾驶视觉语言模型中用于工具增强链式思维推理的统一框架

文章目录摘要1. 引言2. 相关工作2.1 自动驾驶中的语言模型2.2 自动驾驶中的视觉问答3. 方法3.1 数据生成流水线3.2 两阶段训练流程3.2.1 基于 SFT 的推理预热3.2.2 基于 RLFT 的推理增强3.3 推理与评估4. 实验4.1 主要实验结果4.2 工具使用分析4.3 消融实验4.4 泛化性评估5. 结…

Bug 排查日记:打造高效问题定位与解决的技术秘籍

一、引言在软件开发的漫漫征程中&#xff0c;Bug 如影随形&#xff0c;成为开发者们必须跨越的一道道障碍。它们或如微小的瑕疵&#xff0c;影响用户体验&#xff1b;或似隐藏的炸弹&#xff0c;引发系统故障&#xff0c;导致严重后果。高效排查 Bug&#xff0c;不仅是保障软件…

使用 Sentry 为 PHP 和 Web 移动小程序提供多平台错误监控

今天我在 reddit 上看到 Sentry 的推广&#xff0c;想到 19 年我第一次在公司自研产品b2b2c上使用 Sentry 的经历&#xff0c;后面在其他项目上多次使用Sentry&#xff0c;今天就顺手分享一下在 Laravel 项目中接入 Sentry 的实践心得。现代项目往往涉及 Web、移动端和小程序&a…

Python包管理工具全对比:pip、conda、Poetry、uv、Flit深度解析

在Python开发中&#xff0c;包的管理和使用是重要环节&#xff0c;现如今python包管理工具众多&#xff0c;如何选择合适的管理工具&#xff1f;常用的工具有pip、conda、Poetry、uv、Flit&#xff0c;下面这些工具进行详细对比分析。一、工具概览对比工具类型开发者主要特点适…

车载诊断架构 --- Service 14一丢丢小汇总

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做你把时间花在哪里,你的人生就在哪里。千万别看见别人发光,就觉得自己暗淡。人生如逆旅,你我皆行人。唯有不断阅己、越己、悦己才能活出生命的意…

Struts2 工作总结

一 in&#xff0c;在SQL中&#xff0c;IN 是一个条件操作符&#xff0c;用于指定多个可能的值&#xff0c;通常用在 WHERE 子句中。它的作用是检查某个字段的值是否在给定的值列表中&#xff0c;相当于多个 OR 条件的简写形式。不使用 IN&#xff08;冗长&#xff09;SELECT * …

MQTT 认证与授权机制实践(二)

四、实战案例&#xff1a;主流 Broker 的认证授权配置指南&#xff08;一&#xff09;EMQ X&#xff1a;企业级物联网 Broker 的安全方案1. 认证配置&#xff08;用户名密码 证书&#xff09;EMQ X 作为一款企业级物联网 Broker&#xff0c;在安全认证方面提供了丰富且灵活的配…

多路转接介绍及代码实现

目录 1.多路转接技术的产生背景 2.select 3.poll 3.epoll 1.多路转接技术的产生背景 一个技术的出现必然有它要解决的问题,那么多路转接解决的问题是什么嗯? 我们知道,一个进程里面有一个文件描述符表管理这个进程所打开的文件,我们进行网络通信的时候,本质就是创建一个…

《sklearn机器学习——回归指标1》

skearn.metrics模块实现一些损失函数&#xff0c;评分&#xff0c;并且应用函数去测度回归标签。其中一些已经改进&#xff0c;可以处理多指标案例&#xff1a;mean_squared_error&#xff0c;mean_absolute_error&#xff0c;explained_variance_score和r2_score。 这些函数使…

消息存储机制-索引文件及页缓存

对于生产者来说&#xff0c;将消息写到commit log文件里面。这里会有消息的逻辑队列&#xff0c;逻辑队列里面保存了消息的偏移量。除了consumerquenue之外&#xff0c;它还会将数据分发到另外一个文件叫indexfile索引文件里面。这个索引文件可以保存消息的一些信息&#xff0c…