EagleSDR USB HAT FT600

给EagleSDR做了个USB 3.0的子卡,采用FT600方案,实物如下:

用FT600DataStreamerDemoApp测试,速度如下:

由于FT600是16bit的接口,如果用FT601的32bit接口,性能应该还会有大幅提升。

测试代码很简单,参考了网上大佬的例程

c 复制代码
`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
相关推荐
FPGA小迷弟2 小时前
使用FPGA开发高速AD/DA芯片的接口学习
fpga开发
stars-he3 小时前
FPGA学习笔记(6)逻辑设计小结与以太网发送前置
笔记·学习·fpga开发
燎原星火*3 小时前
FPGA 逻辑级数
fpga开发
1750633194517 小时前
Vivado Zynq7020 生成正弦波(查表法) + 行为级仿真
fpga开发
Terasic友晶科技17 小时前
4-DE10-Nano的HDMI方块移动案例——I2C通信协议
fpga开发·i2c·hdmi·de10-nano·i2c通信协议
云雾J视界1 天前
FPGA在AI时代的角色重塑:硬件可重构性与异构计算的完美结合
fpga开发·边缘计算·gpu·vitis·ai推理·azure云·异构编程
s09071362 天前
FPGA中CIC设计注意事项
算法·fpga开发·cic滤波器
Aaron15882 天前
RFSOC+VU13P在无线信道模拟中的技术应用分析
数据结构·人工智能·算法·fpga开发·硬件架构·硬件工程·射频工程
碎碎思2 天前
BerkeleyLab Bedrock:为 FPGA 与加速计算打造的开源基石
fpga开发·开源
zidan14122 天前
xilinx常用文档说明
fpga开发