EagleSDR USB HAT FT600

news2024/10/11 22:20:20

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

`timescale 1ns / 1ns

module FT600_stream
(
    //PL时钟
    input                  pl_clk,          //PL端时钟
    // 复位
    input                  rst_n,           //外部复位
    output reg             ft600_reset_n,   //ft600复位

    // FIFO interface    
    input                  ft600_clk,
    inout [15:0]           ft600_data,
    inout [1:0]            ft600_be,
    input                  ft600_rxf_n,
    input                  ft600_txe_n,
    output                 ft600_oe_n,
    output                 ft600_wr_n,
    output                 ft600_rd_n
);

reg ft600_wakeup_reg;

//从host来,退出读操作
wire r_oob;
//从host来,退出写操作
wire w_oob;

// assign ft600_siwu_n = 1'b1;             // pull-up

wire [15:0] rd_data;
wire [15:0] wr_data;
wire [1:0] be_rd;
reg [1:0] be_wr;
reg [2:0] ft600_state;                  //状态

localparam  FT600_IDLE=0,
            FT600_READ=1,
            FT600_READ_ABORT=2,
            FT600_WRITE=3,
            FT600_WRITE_ABORT=4;

assign rd_data  =  ft600_data;
assign ft600_data  =  (ft600_state==FT600_WRITE || ft600_state==FT600_WRITE_ABORT) ? wr_data : 16'bz;
assign be_rd    =   ft600_be;
assign ft600_be =  (ft600_state==FT600_WRITE || ft600_state==FT600_WRITE_ABORT) ? be_wr : 2'bz;// write data dir


reg [15:0] wr_cnt;
assign wr_data = 16'hffff - wr_cnt;

//写计数器
always @(posedge ft600_clk)
begin
    if(!ft600_reset_n)begin
        wr_cnt <= 16'd0;
    end
    else 
    if(!ft600_wr_n) 
    begin
        wr_cnt <= wr_cnt + 1'b1;
    end
end

//写信号
assign ft600_wr_n=!((ft600_state==FT600_WRITE || ft600_state==FT600_WRITE_ABORT) && !ft600_txe_n);
//读信号,读状态且有数据可读
assign ft600_rd_n=!((ft600_state==FT600_READ || ft600_state==FT600_READ_ABORT) && (!ft600_rxf_n));
//在空闲态或读状态,且有数据可读时,允许FT600控制数据线
assign ft600_oe_n=!((ft600_state==FT600_IDLE || ft600_state==FT600_READ || ft600_state==FT600_READ_ABORT) && !ft600_rxf_n);

//定时器
localparam DELAY_5MS_CNT=(5*100000-1);
reg[31:0] delay_timer;

//状态机
always @(posedge ft600_clk)begin
    if(!ft600_reset_n)
    begin
        ft600_state <= FT600_IDLE;
    end
    else 
    begin
        if (r_oob)
        begin
            be_wr<=2'b01;
            delay_timer <= DELAY_5MS_CNT;
            ft600_state<=FT600_WRITE_ABORT;
        end
        else if (w_oob)
        begin
            delay_timer <= DELAY_5MS_CNT;
            ft600_state<=FT600_READ_ABORT;
        end
        else
        begin
            case(ft600_state)
            FT600_IDLE:
            begin
                be_wr <= 2'b11;
                if((!ft600_rxf_n))
                    ft600_state  <= FT600_READ;         //有数据可读
                else if(!ft600_txe_n)
                    ft600_state  <= FT600_WRITE;        //可写入数据
                else
                    ft600_state <= FT600_IDLE;
            end
            FT600_READ:
                if (ft600_rxf_n)
                    ft600_state  <= FT600_IDLE;
            FT600_READ_ABORT:
                if (delay_timer==32'b0)
                    ft600_state <= FT600_IDLE;
                else
                begin
                    delay_timer=delay_timer-1'b1;
                end
            FT600_WRITE:
                if(ft600_txe_n)
                    ft600_state  <= FT600_IDLE;
            FT600_WRITE_ABORT:
                if (delay_timer==32'b0)
                    ft600_state <= FT600_IDLE;
                else
                begin
                    delay_timer=delay_timer-1'b1;
                end
            endcase
        end           
    end
end

//延时复位
localparam RST_CYCLE=100;
reg [19:0] rst_cnt;

always @(posedge pl_clk)
begin
    if (!rst_n)
    begin
        ft600_reset_n<=0;
        rst_cnt<=0;
    end
    else
    begin
        if (rst_cnt<RST_CYCLE)
            rst_cnt<=rst_cnt+1;
        else
        begin
            ft600_reset_n<=1;
        end
    end
end

endmodule

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

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

相关文章

通过Idea或命令将本地项目上传至git

通过Idea或命令将本地项目上传至git 一、Git创建仓库 1、登录Gitee账号&#xff0c;点击新建 2、填写如下相关信息&#xff0c;点击创建 3、在此处可以复制项目链接 二、Idea配置和解绑git&#xff0c;提交项目 1、idea打开项目&#xff0c;操作如下 2、在弹框里选择…

【监控系统】Promethus整合Alertmanager监控告警邮件通知

【监控系统】Promethus整合Alertmanager监控告警邮件通知 Alertmanager是一种开源软件&#xff0c;用于管理和报警监视警报。它与Prometheus紧密集成&#xff0c;后者是一种流行的开源监视和警报系统。Alertmanager从多个源接收警报和通知&#xff0c;并根据一组配置规则来决定…

Linux中的用户和用户组

su和exit命令 su命令就是用于账户切换的系统命令&#xff0c;其来源英文单词:Switch User 语法: su [-] [用户名] - 符号是可选的&#xff0c;表示是否在切换用户后加载环境变量 &#xff08;建议带上&#xff09;参数:用户名&#xff0c;表示要切换的用户&#xff0c;用户名也…

怎么提高自己当众讲话的能力?

当众讲话是一项重要的沟通技能&#xff0c;它可以帮助你在各种场合中表达自己的观点、影响他人&#xff0c;并建立自信。虽然对很多人来说&#xff0c;当众讲话可能是一项挑战&#xff0c;但通过一些实践和技巧&#xff0c;你可以提高自己的当众讲话能力。下面是一些方法&#…

Java开发之Redis核心内容【面试篇 完结版】

文章目录 前言一、redis使用场景1. 知识分布2. 缓存穿透① 问题引入② 举例说明③ 解决方案④ 实战面试 3. 缓存击穿① 问题引入② 举例说明③ 解决方案④ 实战面试 4. 缓存雪崩① 问题引入② 举例说明③ 解决方案④ 实战面试 5. 缓存-双写一致性① 问题引入② 举例说明③ 解决…

第3章_瑞萨MCU零基础入门系列教程之开发环境搭建与体验

本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写&#xff0c;需要的同学可以在这里获取&#xff1a; https://item.taobao.com/item.htm?id728461040949 配套资料获取&#xff1a;https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总&#xff1a; ht…

滚珠螺杆螺母的加工方法

螺母就是螺帽&#xff0c;与螺栓或螺杆拧在一起用来起紧固作用的零件&#xff0c;螺母的用途十分广泛&#xff0c;那么它的加工方法&#xff0c;你了解吗&#xff1f;接下来&#xff0c;我们一起来看一下。 1、车削&#xff1a;最早使用的加工方法&#xff0c;加工螺母的工艺路…

Openlayers 教程 - feature(图形要素)点击和双击事件

Openlayers 教程 - feature&#xff08;图形要素&#xff09;点击和双击事件 核心代码完整代码&#xff1a;在线示例 地图中图形要素&#xff08;Feature&#xff09;的点击事件非常常用&#xff0c;曾经通过给整个地图绑定点击事件&#xff0c;然后判断图形要素&#xff08;Fe…

@Autowired自动装配对象为null,但是通过ApplicationContext注入的时候,却成功的注入了

错误&#xff1a;运行test1的时候&#xff0c;报bookController空指针异常 但是当我通过ApplicationContext注入的时候&#xff0c;却成功的注入了 原因是因为被注入的属性不能为静态属性&#xff01;&#xff01; 扩展&#xff1a; 1.一般而言&#xff0c;标注有(Component|…

RK3568-mpp(Media Process Platform)媒体处理软件平台

第一章 MPP 介绍 1.1 概述 瑞芯微提供的媒体处理软件平台(Media Process Platform,简称 MPP)是适用于瑞芯微芯片系列的通用媒体处理软件平台。 该平台对应用软件屏蔽了芯片相关的复杂底层处理,其目的是为了屏蔽不同芯片的差异,为使用者提供统一的视频媒体处理接口(Medi…

树,二叉树的概念与结构

&#x1f449;树&#xff0c;二叉树的概念与结构 1️⃣ .树的概念及结构1.1树的概念1.2树的相关概念1.3树的实现方式1.4树的实际用途 2️⃣.二叉树的概念及结构2.1二叉树的概念2.2特殊二叉树2.3二叉树的概念2.4二叉树的存储结构 所属专栏&#xff1a;初始数据结构❤️ &#x1…

【STL】模拟实现map和set {带头结点的红黑树;红黑树的核心结构;红黑树的迭代器;红黑树的插入和查找;map和set的封装}

模拟实现map和set map和set是红黑树的两种不同封装形式&#xff0c;底层使用同一颗泛型结构的红黑树。set是红黑树的K模型&#xff1b;map是红黑树的KV模型。 下面的代码和讲解着重体现红黑树的底层实现和map\set上层封装的衔接。关于二叉搜索树性质&#xff0c;map和set的介…

PowerDesigner 逆向工程

1、MySQL数据库连接&#xff08;JDBC方式&#xff09; 1.1 新建一个pdm&#xff0c;dbms选择mysql 1.2 Database - Connect 选择数据库连接 1.3 配置连接信息 数据库连接这里是通过一个配置文件来获取连接信息的&#xff0c;首次的话因为没有&#xff0c;所以我们需要选择…

采用BeautifulSouppqQueryxpath三种方法爬取电影详情页

采用三个框架BeautifulSoup&&pqQuery&&xpath&#xff0c;爬取知名的电影网页 主要是想体验这三种框架爬同一个网页的不同。 当然具体的不同我也说不清道不明 只能是体验了一把 以下代码都是本人亲自撸 如图所示&#xff0c;四个位置。分别爬取 电影名字 -&g…

docker 安装 Node-RED

Node-RED 是构建物联网应用程序的一个强大工具&#xff0c;使用可视化编程方法&#xff0c;连接起来执行任务。而homeassistant是家居智慧中枢&#xff0c;本文介绍如何安装Node-RED及HASS的插件 1、拉取镜像 docker pull nodered/node-red # 2、部署镜像 创建目录 mkidr -…

微调文本到图像扩散模型新方法DreamBooth,实现主题驱动生成(CVPR 2023)

来源&#xff1a;投稿 作者&#xff1a;橡皮 编辑&#xff1a;学姐 论文链接&#xff1a; https://arxiv.org/pdf/2208.12242 项目主页&#xff1a;https://dreambooth.github.io/ 图1. 只需要拍摄某个主题&#xff08;左&#xff09;的几张图像&#xff08;通常为 3-5 张&…

Java守护线程的理解及应用

在Java中有两类线程&#xff0c;分别是User Thread&#xff08;用户线程&#xff09;和Daemon Thread&#xff08;守护线程&#xff09; 。 用户线程很好理解&#xff0c;我们日常开发中编写的业务逻辑代码&#xff0c;运行起来都是一个个用户线程。而守护线程相对来说则要特别…

Java发送(QQ)邮箱、验证码发送

前言 使用Java应用程序发送 E-mail 十分简单&#xff0c;但是首先需要在项目中导入 JavaMail API 和Java Activation Framework (JAF) 的jar包。 菜鸟教程提供的下载链接&#xff1a; JavaMail mail.jar 1.4.5JAF&#xff08;版本 1.1.1&#xff09; activation.jar 1、准备…

C语言“牵手”拼多多商品详情数据方法,拼多多商品详情API接口,拼多多API申请指南

拼多多是中国最大的自营式电商企业&#xff0c;在线销售计算机、手机及其它数码产品、家电、汽车配件、服装与鞋类、奢侈品、家居与家庭用品、化妆品与其它个人护理用品、食品与营养品、书籍与其它媒体产品、母婴用品与玩具、体育与健身器材以及虚拟商品等。 拼多多平台的商品…

容器编排学习(十)控制器介绍与使用

一 控制器 控制器是 k8s内置的管理工具。可以帮助用户实现 Pod的自动部署、自维护、扩容、滚动更新等功能的自动化程序。 为什么要使用控制器? 有大量的 Pod需要维护管理需要维护 Pod的健康状态控制器可以像机器人一样可以替用户完成维护管理的工作 二 Deployment 1 概…