FX2LP与FPGA的简单批量回环

我需求将FPGA处理的视频数据通过USB发送给电脑,先实现一个小目标,做一个简单的数据回环。

利用赛普拉斯EZ-USB FX2LP系列USB2.0的接口控制器,固件配置好为异步批量模式,并通过官方提供的Control Center进行测试。

上图是FX2LP连接至FPGA时所需的硬件连接

它们之间的接口信号说明如下

  • FLAGA    OUT FIFO空标志位,高电平表示非空
  • FLAGC    IN FIFO满标志位,高电平表示不满
  • SLCS      片选信号,低电平有效
  • SLOE           输出使能,低电平有效
  • SLRD                读控制,低电平有效
  • SLWR               写控制,低电平有效
  • FIFOADR[1:0]  FIFO地址选择,2‘b00为OUT FIFO地址,2‘b10为IN FIFO地址
  • FD[15:0]           双向数据信号

设计时参看规格书给出的时序图

从时序图中,大致可以看出在异步模式下,数据是在SLWR和SLRD的上升沿读入读出,

设计时序如上图,时钟选取为10MHz

下面附上具体代码

module usb_loop(
    input    sys_clk_p    ,
    input    sys_clk_n    ,
    input    reset_n        ,

    input    usb_flaga    ,
    input    usb_flagc    ,

    output    reg    [1:0]    usb_fifoaddr    ,
    output    reg            usb_slcs        ,
    output    reg            usb_sloe        ,
    output    reg            usb_slrd        ,
    output    reg            usb_slwr        ,

    inout        [15:0]    usb_fd
    );

    reg    usb_fd_en;
    reg    [15:0]    usb_data;

    //    Clock
    //    differential clock -> single clock -> 10MHz clock
    wire    sys_clk        ;
    IBUFGDS    buf_clk    (
    .I    (sys_clk_p    ),
    .IB    (sys_clk_n    ),
    .O    (sys_clk    )
    );

    pll_10    u_pll_10    (
    .clk_in1   (sys_clk    ),    // 200Mhz
    .clk_out1  (clk_10    )    // 10Mhz
    );

    // count
    reg    flag_cnt;
    reg [2:0]    cnt;
    wire add_cnt;
    wire end_cnt;
    always @(posedge clk_10 or negedge reset_n) begin
        if(reset_n == 0)
            cnt <= 0;
        else if(add_cnt) begin
            if(end_cnt)
                cnt <= 0;
            else
                cnt <= cnt + 1;
        end
    end
    assign add_cnt = flag_cnt;
    assign end_cnt = add_cnt && cnt == 6 - 1;

    always @(posedge clk_10 or negedge reset_n) begin
        if(reset_n == 0)
            flag_cnt <= 0;
        else if(flag_cnt == 0 && usb_flaga == 1 && usb_flagc == 1)
            flag_cnt <= 1;
        else if(end_cnt)
            flag_cnt <= 0;
    end

    always @(posedge clk_10 or negedge reset_n) begin
        if(reset_n == 0)
            usb_slcs <= 1;
        else
            usb_slcs <= 0;
    end

    /*
    cnt        0    1    2    3    4    5
    addr    0    0    0    2    2    2
    slrd    1    0    1    1    1    1
    sloe    1    0    1    1    1    1
    slwr    1    1    1    1    0    1
    */
    always @(posedge clk_10 or negedge reset_n) begin
        if(reset_n == 0)
            usb_fifoaddr <= 0;
        else if(add_cnt && cnt == 3 - 1)
            usb_fifoaddr <= 2‘b10;
        else if(end_cnt)
            usb_fifoaddr <= 0;
    end

    always @(posedge clk_10 or negedge reset_n) begin
        if(reset_n == 0)
            usb_slrd <= 1;
        else if(add_cnt && cnt == 1 - 1)
            usb_slrd <= 0;
        else if(add_cnt && cnt == 2 - 1)
            usb_slrd <= 1;
    end

    always @(posedge clk_10 or negedge reset_n) begin
        if(reset_n == 0)
            usb_sloe <= 1;
        else if(add_cnt && cnt == 1 - 1)
            usb_sloe <= 0;
        else if(add_cnt && cnt == 2 - 1)
            usb_sloe <= 1;
    end

    always @(posedge clk_10 or negedge reset_n) begin
        if(reset_n == 0)
            usb_slwr <= 1;
        else if(add_cnt && cnt == 4 - 1)
            usb_slwr <= 0;
        else if(add_cnt && cnt == 5 - 1)
            usb_slwr <= 1;
    end

    assign usb_fd = (usb_fd_en) ? usb_data : 16‘hz;

    always @(posedge clk_10 or negedge reset_n) begin
        if(reset_n == 0)
            usb_data <= 0;
        else if(add_cnt && cnt == 2 - 1)
            usb_data <= usb_fd;
    end

    always @(posedge clk_10 or negedge reset_n) begin
        if(reset_n == 0)
            usb_fd_en <= 0;
        else if(add_cnt && cnt == 3 - 1)
            usb_fd_en <= 1;
        else if(end_cnt)
            usb_fd_en <= 0;
    end

endmodule

原文地址:https://www.cnblogs.com/qingkai/p/8665723.html

时间: 2024-10-10 13:02:57

FX2LP与FPGA的简单批量回环的相关文章

一维回环数组求解最大子数组问题

一.题目与要求 题目:返回一个整数数组中最大子数组的和. 要求: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大. 同时返回最大子数组的位置. 求所有子数组的和的最大值.要求时间复杂度为O(n) 二.设计思想 通过上次求解简单一维数组的最大子数组问题的解决,我们找到了一种实现时间复杂为O(n)的方法,采用的是二分法和递归

thread_CyclicBarrier回环栅栏

CyclicBarrier回环栅栏,字面意思是可循环使用(Cyclic)的屏障(Barrier).通过它可以实现让一组线程等待至某个状态之后再全部同时执行. 它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活. 叫做回环是因为当所有等待线程都被释放以后,可以被重用.我们暂且把这个状态就叫做barrier,当调用await()方法之后,线程就处于barrier了. await()            在所有

java下蛇形回环矩阵的实现

前文废话:这个问题据说是腾讯之前的一道笔试题,由于当时没认真看,现在记不清这种矩阵是不是叫"蛇形回环矩阵"......请大家直接看图1,就是那个样子的矩阵. 问题描述:输入一个N,实现N×N的蛇形回环矩阵(即图1类型) (N=5时的蛇形回环矩阵) 我们先把N为奇数和N为偶数的情况分开.先来看N=3.5.7时的该类矩阵是什么情况:               看上去彼此之间并无规律,对这道题最简单粗暴的解法似乎就是构建一个二维数组,然后按人的正常思维向里填数字构建. 但是--如果用(最大

回环网卡驱动设计

回环网卡是一个虚拟网卡,当上层协议栈发出包后,包又会被发回给上层协议栈.下面来编程实现回环网卡驱动. 所需头文件 #include <linux/kernel.h> #include <linux/jiffies.h> #include <linux/module.h> #include <linux/interrupt.h> #include <linux/fs.h> #include <linux/types.h> #includ

ORB-SLAM(六)回环检测

上一篇提到,无论在单目.双目还是RGBD中,追踪得到的位姿都是有误差的.随着路径的不断延伸,前面帧的误差会一直传递到后面去,导致最后一帧的位姿在世界坐标系里的误差有可能非常大.除了利用优化方法在局部和全局调整位姿,也可以利用回环检测(loop closure)来优化位姿. 这件事情就好比一个人走在陌生的城市里,一开始还能分清东南西北,但随着在小街小巷转来转去,已经不知道自己在什么地方了.通过认真辨识周边环境,他可以建立起局部的地图信息(局部优化).再回忆以前走过的路径,他可以纠正一些以前的地图信

wireshark抓取本地回环及其问题 转摘:http://www.cnblogs.com/luminji/p/3503464.html

一:The NPF driver isn’t running 这个错误是因为没有开启NPF服务造成的. NPF即网络数据包过滤器(Netgroup Packet Filter,NPF)是Winpcap的核心部分,它是Winpcap完成困难工作的组件.它处理网络上传输的数据包,并且对用户级提供可捕获(capture).发送(injection)和分析性能(analysis capabilities). 它不仅提供了基本的特性(例如抓包),还有更高级的特性(例如可编程的过滤器系统).前者可以被用来约

(八)ORBSLAM回环检测之位置识别

ORBSLAM2回环检测简介 由于回环检测模块包含两个部分的内容:其一是位置识别,即外观验证,通过图像间的相似度信息进行判断:其二是几何验证,通过回环候选帧与当前关键帧的几何关系来做进一步验证. 由于两部分内容都较为繁琐,因此笔者将回环检测模块拆分成两讲,今天这一讲主要介绍外观验证,下一讲则继续几何验证. 外观验证,或者叫位置识别,实际上是一个图像检索的问题,即输入图像与地图存储的所有关键帧进行相似度比较,找出相似度分数最高的即是最优匹配.由于还有几何验证,因此在外观验证阶段,通常会留下几个相似

(九)ORBSLAM回环检测之几何验证

ORBSLAM2回环检测之几何验证简介 回环检测的目的是找到当前场景在历史中是否出现过,如果出现过,那会给我们提供一个非常强的约束条件,把我们偏离很多的轨迹一下子修正到正确的位置上.当然,这么好的东西,有利自然就有弊.万一我们检测出来的回环不是真正的回环,也就是说我们认错了地方,这种时候提供的回环约束会导致轨迹被错误地“修正”了,结果就是估计的轨迹跟真实的轨迹相差十万八千里,这显然是不可接受的. 因此,回环检测的正确性就显得非常重要.我们会宁愿不要回环约束,也不要一个错误的回环约束.所以ORBS

VS2019 回环剪贴板

简述 在编写程序中总会需要编写相似的代码,如果每一次都写一遍即浪费时间,也减少了编码乐趣,所以在使用开发环境时,会借助一些插件或 IDE 本身的功能来减少重复操作. 之前在 VS2019 实用操作 中介绍了列模式.代码片段.复制等几个快速编码的小技巧,今天介绍一下 VS2019 中的另一个小技巧,或许这也正是你想要的. 显示剪切板历史 如下图所示,我们想在另一个文件中添加 OnProperties 消息处理程序,在此处拷贝OnProperties 的消息映射及函数定义. 切换到另一文件,输入快捷