前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >TI C6000系列 TMS320C6678+Kintex-7——FPGA案例开发资料(上)

TI C6000系列 TMS320C6678+Kintex-7——FPGA案例开发资料(上)

原创
作者头像
创龙科技Tronlong
发布于 2022-08-14 12:28:37
发布于 2022-08-14 12:28:37
1.2K0
举报

前 言

本文主要介绍基于Vivado的FPGA案例的使用说明,适用开发环境:Windows 7/10 64bit、Xilinx Vivado 2017.4。其中案例包括led_flash案例、key_test案例、ibert_eyescan案例、udp_10g_echo案例、fmc_ad9706_ad9613案例、bram_srio_target案例。

本次测试板卡为TMS320C6678+Kintex-7 的FPGA高端异核开发板,它采用TI KeyStone架构C6000系列TMS320C6678八核C66x定点/浮点DSP以及Xilinx Kintex-7 FPGA处理器设计。

TMS320C6678+Kintex-7开发板资源图解
TMS320C6678+Kintex-7开发板资源图解

核心板内部DSP与FPGA通过SRIO、EMIF16、I2C通信总线连接,并通过工业级高速B2B连接器引出千兆网口、PCIe、HyperLink、EMIF16、GTX等高速通信接口。核心板经过专业的PCB Layout和高低温测试验证,稳定可靠,可满足各种工业应用环境。

FPGA案例位于产品资料“4-软件资料\Demo\FPGA_Demo\”的FPGA-HDL-demos和FPGA-BlockDesign-demos目录中。案例包含project和bin两个目录,其中project目录下包含案例工程文件,bin目录下含有案例.bit和.bin格式可执行文件。.bit格式文件用于在线加载,.bin格式文件用于固化至SPI FLASH。

表 1

FPGA-HDL-demos目录下的案例使用Verilog语言进行开发,FPGA-BlockDesign-demos目录下的案例使用Block Design + Verilog语言方式进行开发。FPGA-HDL-demos目录下的i2c_slave、bram_emifa案例,以及FPGA-BlockDesign-demos目录下的fmc_ad9613_srio、fmc_cameralink_mono_srio案例,请查看DSP + FPGA通信案例开发手册。

可在Vivado界面点击"IP INTEGRATOR -> Open Block Design"打开BLOCK DESIGN开发界面。

图 1

在进行本文如下操作前,请先按照开发环境搭建文档安装Xilinx Vivado开发工具包。本文默认使用创龙科技的TL-DLC10下载器进行操作演示。

将BOOTSET拨码开关拨至XXXX0(1~5),ON为1,相反为0,X代表任意值,此档位为FPGA的SPI FLASH启动模式(此模式可进行程序在线加载、固化并离线启动),并将评估板通过下载器正确连接至PC机。

图 1

led_flash案例

案例功能

案例功能:控制评估底板LED3、LED4每隔0.5s将状态翻转一次。

图 2

操作说明

请运行程序,此时可看到评估底板的LED3、LED4进行闪烁。

关键代码

顶层文件为"project\led_flash.srcs\sources_1\imports\hdl\led_flash.v",关键代码说明如下。

  1. 使用STARTUPE2原语提供的CFGMCLK(65MHz)作为LED的参考时钟。
  2. 使用CFGMCLK进行计数,使LED以0.5s的周期进行状态转换。

图 3

RTL原理图如下所示:

图 4

key_test案例

案例功能

案例功能:通过按键SW3(FPGA USER1)控制评估底板的LED5状态。

图 5

图 6

操作说明

请运行程序,此时每按下SW3一次,LED5状态改变一次。

关键代码

顶层文件为"project\key_test.srcs\sources_1\imports\hdl\key_test.v",关键代码说明如下。

  1. 使用STARTUPE2原语提供的CFGMCLK(65MHz)作为系统时钟。
  2. 对按键进行消抖处理。
  3. 通过按下按键产生对应标志,对LED状态进行控制。

图 7

图 8

RTL原理图如下所示:

图 9

ibert_eyescan案例

案例功能

案例功能:基于SFP+光口测试高速串行总线GTX的通信速率与误码率,并通过眼图查看信号传输质量。

操作说明

将两个SFP+多模双纤光模块分别接入SFP1、SFP2光口,使用光纤线缆将两个光模块各自的RX与TX相连接,形成外部回环。

图 10

SFP1光口使用GTX Quad 116的MGTXRX_0、MGTXTX_0引脚,SFP2光口使用GTX Quad 116的MGTXRX_1、MGTXTX_1引脚。

核心板板载时钟芯片输出的100MHz时钟被用作GTX参考时钟,与GTX Quad 116的MGTX_REFCLK1引脚相连接。

图 11

图 12 GTX参考时钟

请运行程序,此时将会在Vivado的Hardware界面扫描到GTX设备。其中MGT_X0Y4、MGT_X0Y5为SFP+光口,速率均为10Gbps,请点击"Auto-detect links"。

图 13

可在Serial I/O Links窗口查看GTX通信速率与误码率。由下图可见在10Gbps速率下,SFP+光口的误码率为0。

图 14

图 15

点击Serial I/O Scans窗口,并点击"Create scan"创建眼图扫描。

图 16

在弹出的界面中设置眼图扫描参数。点击Link选择待扫描的GTX,分别设置Horizontal increment(水平增量)和Vertical increment(垂直增量),数值越小则眼图越精细,但扫描时间也越长,参数详细说明请查看下表。

图 17

将Horizontal increment和Vertical increment均设置为8时,测得MGT_X0Y4眼图如下图所示。眼图的两个关键指标为Open area(眼图张开区域点数)和Open UI %(眼图张开百分比),此两个数值越大,表示信号传输质量越好。

图 18

图 19

将Horizontal increment和Vertical increment均设置为2时,测得MGT_X0Y4眼图如下图所示。

图 20

图 21

关键代码

顶层文件为"project\ibert_eyescan.srcs\sources_1\imports\hdl\ibert_eyescan.v",关键代码说明如下。

定义GTX Quad 116端口。

图 22

例化2个GTX专用差分时钟Buffer,用于将差分时钟转换为单端时钟。

图 23

使能SFP+接口。

图 24

调用IBERT IP核。

图 25

RTL原理图如下所示:

图 26

IP核配置

本案例使用IBERT IP核测试GTX信号传输质量。

IBERT IP核开发文档为产品资料“6-开发参考资料\Xilinx官方参考文档\”目录下的《pg132-ibert-7series-gtx.pdf》和《ug908-vivado-programming-debugging.pdf》,具体配置说明如下。

设置协议数量为1,设置通信速率为10Gbps,选择参考时钟为100MHz(需与实际参考时钟一致)。

图 27

使用QUAD_116的GTX,参考时钟设置为MGTREFCLK1 116。

图 28

系统时钟设置为QUAD116 1,即MGTREFCLK1 116。

图 29

udp_10g_echo案例

案例功能

案例功能:评估板通过SFP+光口接收上位机数据后,将数据重新发送至上位机(PC),以验证基于SFP+光口的10G UDP网络通信功能。评估板作为UDP Server,上位机作为UDP Client。

图 30 程序功能框图

操作说明

请将ZBNET的万兆网卡MCX311插入PC机的PCIe插槽中,并将一个SFP+多模双纤光模块接入万兆网卡,将另一个SFP+多模双纤光模块接入评估板SFP1光口。使用两根光纤线缆分别将SFP1的RX与万兆网卡的TX相连接,SFP1的TX与万兆网卡的RX相连接。SFP1光口使用GTX Quad 116的MGTXRX_0、MGTXTX_0引脚。

图 31

图 32

评估板IP地址已通过udp_ip_10g模块配置为192.168.0.25。请设置PC机IP地址与评估板IP地址处于同一网段。此处将PC机IP地址设置为192.168.0.88,子网掩码设为255.255.254.0。

图 33

请运行程序,此时PC机将会识别网络连接状态为10Gbps。

图 34

由于udp_ip_10g模块不支持ARP(Address Resolution Protocol)地址解析协议,因此需通过添加评估板IP地址和MAC地址的静态映射关系。请以管理员身份打开Windows PowerShell,并执行如下命令。

Windows# arp -s 192.168.0.25 00-23-20-21-22-23 //添加评估板IP地址和MAC地址的静态映射关系

Windows# arp -a //查看添加状态

图 35

双击打开产品资料“4-软件资料\Tools\Windows\”目录下的网络调试工具SocketTool_NoAD.exe,在弹出的界面中点击“UDP Client -> 创建”,在“对方IP”中输入评估板IP地址,再点击确定。

图 36

在“数据发送窗口”中输入需发送至评估板的数据,再点击“发送数据”。“数据接收及提示窗口”中将打印由PC机发送至评估板,以及由评估板发送至PC机的数据。

图 37

模块/IP核配置

cdcm61002_cfg模块

本案例使用cdcm61002_cfg模块配置CDCM61002输出156.25MHz时钟,作为GTX Quad 116的参考时钟。

时钟芯片具体配置方式请查阅“6-开发参考资料\数据手册\核心板元器件\CLOCK\”目录下的《cdcm61002.pdf》。cdcm61002_cfg模块源码为"project\udp_10g_echo.srcs\sources_1\imports\hdl\cdcm61002_cfg.v",具体配置说明如下。

配置cdcm61002_cfg模块的OD为"011",PR为"10",即配置GTX参考时钟为156.25MHz。

图 38

图 39

图 40

图 41

10G Ethernet PCS/PMA IP核

本案例使用10G Ethernet PCS/PMA IP核实现物理层(PCS与PMA)功能。

10G Ethernet PCS/PMA IP核开发文档为产品资料“6-开发参考资料\Xilinx官方参考文档\”目录下的《pg068-ten-gig-eth-pcs-pma.pdf》,具体配置说明如下。

勾选Shared Logic的"Include Shared Logic in core",配置10G Ethernet PCS/PMA IP核包含共享逻辑。

图 42

udp_ip_10g模块

本案例使用udp_ip_10g模块实现10G UDP协议栈与MAC层。

udp_ip_10g模块开发文档为产品资料“6-开发参考资料\其他参考文档\”目录下的《udp_ip_10g.pdf》。udp_ip_10g模块源码为"project\udp_10g_echo.srcs\sources_1\imports\udp_ip_10g_stack\"。

图 43 udp_ip_10g模块主要特性

图 44 udp_ip_10g模块逻辑框架

udp_ip_10g模块具体配置说明如下。

图 45

设置链路速率为10Gbps。

图 46

图 47

设置评估板MAC地址为00-23-20-21-22-23,IP地址为192.168.0.25,子网掩码为255.255.254.0。

图 48

图 49

图 50

由于篇幅问题,文章分为上下两篇,感兴趣的可以查阅观看,本文为上。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
ConcurrentHashMap1.8 – 扩容详解「建议收藏」
ConcurrenHashMap 在扩容过程中主要使用 sizeCtl 和 transferIndex 这两个属性来协调多线程之间的并发操作,并且在扩容过程中大部分数据依旧可以做到访问不阻塞,具体是如何实现的,请继续 。
全栈程序员站长
2022/09/12
8390
ConcurrentHashMap1.8 – 扩容详解「建议收藏」
【原创】Java并发编程系列27 | ConcurrentHashMap(下)
上一篇详细分析了HashMap源码,介绍了HashMap的数据结构以及并发编程中HashMap的问题,这篇就来看下ConcurrentHashMap。因为ConcurrentHashMap与HashMap结构是一样的,本文将重点介绍ConcurrentHashMap在并发编程中如何保证线程安全:
java进阶架构师
2020/07/02
5260
【原创】Java并发编程系列27 | ConcurrentHashMap(下)
【死磕Java并发】-----J.U.C之Java并发容器:ConcurrentHashMap
此篇博客所有源码均来自JDK 1.8 HashMap是我们用得非常频繁的一个集合,但是由于它是非线程安全的,在多线程环境下,put操作是有可能产生死循环的,导致CPU利用率接近100%。为了解决该问题,提供了Hashtable和Collections.synchronizedMap(hashMap)两种解决方案,但是这两种方案都是对读写加锁,独占式,一个线程在读时其他线程必须等待,吞吐量较低,性能较为低下。故而Doug Lea大神给我们提供了高性能的线程安全HashMap:ConcurrentHashMap
用户1655470
2018/04/26
1.1K0
【死磕Java并发】-----J.U.C之Java并发容器:ConcurrentHashMap
Java并发容器--ConcurrentHashMap
  1、不安全:大家都知道HashMap不是线程安全的,在多线程环境下,对HashMap进行put操作会导致死循环。是因为多线程会导致Entry链表形成环形数据结构,这样Entry的next节点将永远不为空,就会产生死循环获取Entry。具体内容见HashMap随笔。
在周末
2019/09/11
4730
ConcurrentHashMap源码(一)
整体流程跟HashMap比较类似,大致是以下几步: (1)如果桶数组未初始化,则初始化; (2)如果待插入元素所在的桶为空,则尝试把此元素直接插入到桶的第一个位置; (3)如果正在扩容,则当前线程一起加入到扩容的过程中; (4)如果待插入的元素所在的桶不为空且不在迁移元素,则锁住这个桶(分段锁); (5)如果当前桶中元素以链表方式存储,则在链表中寻找该元素或者插入元素; (6)如果当前桶中元素以红黑树方式存储,则在红黑树中寻找该元素或者插入元素; (7)如果元素存在,则返回旧值; (8)如果元素不存在,整个Map的元素个数加1,并检查是否需要扩容; 添加元素操作中使用的锁主要有(自旋锁 + CAS + synchronized + 分段锁)。 为什么使用synchronized而不是ReentrantLock? 因为synchronized已经得到了极大地优化,在特定情况下并不比ReentrantLock差。
Java阿呆
2020/11/04
4050
为并发而生的 ConcurrentHashMap(Java 8)
HashMap 是我们日常最常见的一种容器,它以键值对的形式完成对数据的存储,但众所周知,它在高并发的情境下是不安全的。尤其是在 jdk 1.8 之前,rehash 的过程中采用头插法转移结点,高并发
Single
2018/01/04
2.5K0
为并发而生的 ConcurrentHashMap(Java 8)
并发容器和框架之ConcurrentHashMap
了解HashMap的人都知道HashMap是线程不安全的(多线程下的put方法达到一定大小,引发rehash,导致闭链,最终占满CPU),同时线程安全的HashTable效率又令人望而却步(每个方法都进行同步,效率低下),所以在这种情境下为并发而生的ConcurrentHashMap就应运而生! 接下来我们按照以下顺序揭开ConcurrentHashMap的面纱: JDK1.6,1.7的ConcurrentHashMap JDK1.8的ConcurrentHashMap 1.1 ConcurrentHas
MindMrWang
2018/04/16
1.1K0
并发容器和框架之ConcurrentHashMap
爆肝ConcurrentHashMap
特别说明:除第一小节以外,其他均都是以JDK 1.8的ConcurrentHashMap进行分析,本文信息量略大,每一份坚持都是值得被尊重的,希望你可以坚持读完这篇文章,也希望这篇文章对各位读者朋友有所帮助。
shysh95
2021/05/11
1.2K0
ConcurrentHashMap源码学习
既然有了HashMap为什么还会出现ConcurrentHashMap?同时ConcurrentHashMap具有什么优势?ConcurrentHashMap与HashMap、HashTable有什么区别?ConcurrentHashMap中的sizeCtl有几种值,这些值代表的是什么状态?ConcurrentHashMap使用了哪些锁?DEFAULT_CONCURRENCY_LEVEL表示什么,有什么用?
路行的亚洲
2020/07/17
5470
深度解析ConcurrentHashMap1.8源码分析
想必大家对HashMap数据结构并不陌生,JDK1.7采用的是数组+链表的方式,JDK1.8采用的是数组+链表+红黑树的方式。虽然JDK1.8对于HashMap有了很大的改进,提高了存取效率,但是线程安全的问题不可忽视,所以就有了线程安全的解决方案,比如在方法上加synchronized同步锁的HashTable,或者并发包中的ConcurrentHashMap线程安全类,本文就来和大家一起探讨一下关于ConcurrentHashMap的源码,版本是JDK1.8,下面让我们正式开始吧。
烂猪皮
2019/12/16
7360
深度解析ConcurrentHashMap1.8源码分析
JDK1.8的ConcurrentHashMap源码解析
在思考这个问题之前,我们可以思考:如果不用ConcurrentHashMap的话,有哪些其他的容器供我们选择呢?并且它们的缺陷是什么?
烂猪皮
2023/09/04
1870
JDK1.8的ConcurrentHashMap源码解析
jdk1.8中ConcurrentHashMap的实现原理
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fjse51/article/details/55260493
提莫队长
2019/06/11
3K0
Java8 ConcurrentHashMap源码解析
JDK1.8的实现已经摒弃了Segment的概念,而是直接用Node数组+链表+红黑树的数据结构来实现,并发控制使用synchronized和CAS来操作,整个看起来就像是优化过且线程安全的HashMap,虽然在JDK1.8中还能看到Segment的数据结构,但是已经简化了属性,只是为了兼容旧版本。
黑洞代码
2021/02/09
3760
ConcurrentHashMap源码分析
本文基于jdk1.8对concurrentHashMap的源码进行分析,以put()方法为入口对concurrentHashMap的扩容机制,size计算方式等代码进行分析
Java进阶之路
2022/08/03
4140
ConcurrentHashMap源码分析
JUC学习笔记(二)—ConcurentHashMap
Unsafe:是CAS的核心类,由于Java方法无法直接访问底层系统,需要通过本地(native)方法来访问,Unsafe相当于一个后门,基于该类可以直接操作特定内存的数据。 常见方法:
Monica2333
2020/06/19
5670
Java的ConcurrentHashMap
ConcurrentHashMap是Java中的一个线程安全且高效的HashMap实现。
用户3467126
2019/07/25
5800
Java的ConcurrentHashMap
Java集合源码解析-ConcurrentHashMap(JDK8)
Java 7为实现并发访问,引入了Segment这一结构,实现了分段锁,理论上最大并发度与Segment个数相等。
JavaEdge
2021/10/18
2550
详解ConCurrentHashMap源码(jdk1.8)
ConCurrentHashMap是一个支持高并发集合,常用的集合之一,在jdk1.8中ConCurrentHashMap的结构和操作和HashMap都很类似:
用户10384376
2023/02/26
2820
详解ConCurrentHashMap源码(jdk1.8)
一文吃透ConcurrentHashMap的前世与今生
hello,everyone。上篇博客中介绍了HashMap,本文给大家带来ConcurrentHashMap。
柏炎
2022/08/23
2820
一文吃透ConcurrentHashMap的前世与今生
ConcurrentHashMap 1.7和1.8区别
ConcurrentHashMap 与HashMap和Hashtable 最大的不同在于:put和 get 两次Hash到达指定的HashEntry,第一次hash到达Segment,第二次到达Segment里面的Entry,然后在遍历entry链表
全栈程序员站长
2022/09/12
6660
ConcurrentHashMap 1.7和1.8区别
推荐阅读
相关推荐
ConcurrentHashMap1.8 – 扩容详解「建议收藏」
更多 >
LV.1
新浪网技术(中国)有限公司PHP开发工程师
目录
  • 前 言
  • led_flash案例
  • 案例功能
  • 操作说明
  • 关键代码
  • key_test案例
  • 案例功能
  • 操作说明
  • 关键代码
  • ibert_eyescan案例
  • 案例功能
  • 操作说明
  • 关键代码
  • IP核配置
  • udp_10g_echo案例
  • 案例功能
  • 操作说明
  • 模块/IP核配置
  • cdcm61002_cfg模块
  • 10G Ethernet PCS/PMA IP核
  • udp_ip_10g模块
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档