wye11083 发表于 2012-10-4 23:37:26

CY68013-FX2速度真的达到了50MB/s(W64平台)

改了很久,最后觉得用IOCTL操作太麻烦,所以直接用CyUSB操作了。单线程读写(BulkLoop)最快25MB/s,4线程才能达到50MB/s,所以想要达到高带宽,就只好用读写数据池了。发现CyUSB速度比EzUSB要慢不少,Ez单线程就能达到35MB/s,而Cy却慢得多。可能是驱动或者操作的优化问题吧。用异步模式可能会好些。

health 发表于 2012-10-4 23:55:22

理论上不可能。

wye11083 发表于 2012-10-5 10:02:27

health 发表于 2012-10-4 23:55 static/image/common/back.gif
理论上不可能。

不可能是因为你没做到。用数据池方式暂存数据,然后批量读写,完全可以达到。

mcuprogram 发表于 2012-10-5 10:10:38

贴出代码

wye11083 发表于 2012-10-5 10:28:32

mcuprogram 发表于 2012-10-5 10:10 static/image/common/back.gif
贴出代码

USB+FPGA,FPGA做BulkLoop,上位机多线程同时读写。FX2配置为SlaveFIFO,IFCLK Out,FPGA使用源同步模式工作,USBIF时钟48MHz,内核时钟96MHz。传输使用32KB包,而不是512B包。FPGA端使用经优化后的读写方式,可以达到1w/1cyc。
                private void btnBulkLoop_Click(object sender, EventArgs e)
                {
                        System.Threading.Thread thWrite = new System.Threading.Thread(new System.Threading.ThreadStart(BulkWrite));
                        System.Threading.Thread thRead = new System.Threading.Thread(new System.Threading.ThreadStart(BulkRead));
                        thWrite.Start();
                        thRead.Start();
                }

                public void BulkWrite()
                {
                        byte[] buf = new byte;
                        for (int i = 0; i < FIFO_Cache.Length; i += buf.Length)
                        {
                                for (int j = 0; j < buf.Length; j++)
                                {
                                      buf = FIFO_Cache;
                                }
                                int localError = 0;
                                int len = USBIO.WriteBuf(buf, outlocalError);
                        }
                }

                public void BulkRead()
                {
                        int ErrorCnt = 0;
                        byte[] buf = new byte;
                        for (int i = 0; i < FIFO_Cache.Length; )
                        {
                                int localError = 0;
                                int len = USBIO.ReadBuf(buf, buf.Length, outlocalError);
                                for (int j = 0; j < len; j++)
                                {
                                        if (buf != FIFO_Cache)
                                                ErrorCnt++;
                                }
                                i += len > 0 ? len : 0 ;
                        }
                        if (ErrorCnt > 0)
                                MessageBox.Show(ErrorCnt.ToString());
                }
这是带有校验的读写Loop测试函数,单线程OK,多线程不OK,因为不知道哪个线程发的包有没有被这个线程收到。

NJ8888 发表于 2012-10-5 10:59:41

wye11083 发表于 2012-10-5 10:28 static/image/common/back.gif
USB+FPGA,FPGA做BulkLoop,上位机多线程同时读写。FX2配置为SlaveFIFO,IFCLK Out,FPGA使用源同步模式 ...

68013缓冲是512B,32K缓冲如何理解?

wye11083 发表于 2012-10-6 08:25:15

NJ8888 发表于 2012-10-5 10:59 static/image/common/back.gif
68013缓冲是512B,32K缓冲如何理解?

如果你死板的用512B包传送,那你得用几十个线程才能达到饱和带宽。USB是队列式传输,包进去时是按队列的,你一次用512B的包,在1/8微帧就传完了,然而此时返回你的程序,早已产生巨大的延时。驱动每次最多可以传送65535B数据,这样一个大包可以占用64-128个微帧,总线利用率不就上去了?

FDSOFT 发表于 2012-10-6 08:52:29

我用EzUSB读写FPGA,但是读和写之间必需要加上很长的延时,可不可以不用延时的?加上就慢了

wye11083 发表于 2012-10-6 12:39:48

FDSOFT 发表于 2012-10-6 08:52 static/image/common/back.gif
我用EzUSB读写FPGA,但是读和写之间必需要加上很长的延时,可不可以不用延时的?加上就慢了 ...

为什么要加延时?驱动程序会给你做好。你只管读,不用管有没有数据,没数据自然是读不出来的。

mcuprogram 发表于 2012-10-20 19:57:45

哪位有相关的资料能弄个完整的工程吗.

mcuprogram 发表于 2012-10-25 10:37:14

wye11083 发表于 2012-10-6 08:25 static/image/common/back.gif
如果你死板的用512B包传送,那你得用几十个线程才能达到饱和带宽。USB是队列式传输,包进去时是按队列的 ...

哪里有写说是最大65535B,假如大于会怎么样?

ffbiao 发表于 2012-10-26 09:23:08

请问CyUSB和Ezusb有何不同?我有一个开发板CY7C68013A的,同样的芯片但是用ezusb的程序驱动总结检测不到

wye11083 发表于 2012-10-26 19:02:23

ffbiao 发表于 2012-10-26 09:23 static/image/common/back.gif
请问CyUSB和Ezusb有何不同?我有一个开发板CY7C68013A的,同样的芯片但是用ezusb的程序驱动总结检测不到 ...

API不同,所以老的驱动不支持新的接口,换了CyAPI就必须使用CyAPI。

wye11083 发表于 2012-10-26 19:06:11

mcuprogram 发表于 2012-10-25 10:37 static/image/common/back.gif
哪里有写说是最大65535B,假如大于会怎么样?

包长最大只有16位,你说最大能传多少?

ffbiao 发表于 2012-10-27 10:18:11

wye11083 发表于 2012-10-26 19:02 static/image/common/back.gif
API不同,所以老的驱动不支持新的接口,换了CyAPI就必须使用CyAPI。

没有做上位机的操作,单片机的编程应该FX2和FX2LP的代码是兼容吗??

winkle 发表于 2013-1-9 08:30:41

mark 字数补丁

sblpp 发表于 2013-1-10 16:15:53

高速USB 480Mbps
最大 60MB/S
理论上说还是 50MB/S还是有可能的
但是 可能只是把数据丢过来 没有及时分析处理完吧?

dr2001 发表于 2013-1-10 16:51:03

恭喜,基本达到USB Bulk的理论最大值了。
理论最大值大约在52MBytes/s。

Codoox 发表于 2013-1-11 15:54:29

mark 这个可以有

kingkoyan 发表于 2013-1-14 20:52:43

怎么感觉CYAPI的访问方式好慢啊

labi40 发表于 2013-5-20 13:00:35

学习了!

gamalot 发表于 2013-5-20 13:15:21

不错!学习了!{:lol:}

suxilong 发表于 2013-5-20 21:46:03

wye11083 发表于 2012-10-26 19:02 static/image/common/back.gif
API不同,所以老的驱动不支持新的接口,换了CyAPI就必须使用CyAPI。

FPGA 做USB 一定要有USB device IC 吗? 如果用硬件语言 直接解析从PC 下来 经USB 的数据 ,可能吗?

wye11083 发表于 2013-5-21 20:57:39

suxilong 发表于 2013-5-20 21:46 static/image/common/back.gif
FPGA 做USB 一定要有USB device IC 吗? 如果用硬件语言 直接解析从PC 下来 经USB 的数据 ,可能吗? ...

理论可以,但是你需要一片专用USB收发器(串并转换器)。68013的工作就是串并转换器,同时提供USB协议支持以及简单的控制功能。如果不用专用串并转换芯片,那么你需要对480Mbps信号跟踪以及锁定频率。这个FPGA是搞不动的,必须得带有PLL和VCO的芯片才行。

minier 发表于 2013-5-24 08:15:38

这个真可以

wkman 发表于 2013-5-24 08:29:36

不错。在学习1{:victory:}

nvampire 发表于 2013-11-15 18:26:54

10.4.3.1 Transaction Counter
To use the Transaction Counter for FIFO “x”, load GPIFTCB3:0 with the desired number of transactions
(1 to 4,294,967,295; 0 = 4,294,967,296). When a FIFO-Read or -Write waveform is triggered
on that FIFO, the GPIF will transfer the specified number of bytes (or words, if WORDWIDE = 1)
automatically.

qingyin2009 发表于 2013-11-15 18:36:55

不明觉厉,曾经帮同学搞过FPGA与 CH341的论文

wzavr 发表于 2013-11-15 19:26:06

mark 学习CY68013-FX2速度

cyusb3014 发表于 2013-11-17 22:18:28

LZ可以用标准的上位机测试速度的软件测试一下,再帖一个图,如果能到50M,那非常快了。

jordonwu 发表于 2013-11-25 16:38:06

官方的也可以到45MB/s, 但是没做数据校验,同步与校验也是个问题

kneken 发表于 2013-11-25 16:52:56

mark!!!!!!!!!!!!!!!

cocoloong 发表于 2015-3-15 19:46:17

mark~~
老帖子翻出来好不好?
有关注功能就好了~
页: [1]
查看完整版本: CY68013-FX2速度真的达到了50MB/s(W64平台)