Vivado远程开发探索
平时主要用轻薄本办公,但是有时候又需要用Vivado做一些开发的工作,就感觉生产力不够。如果能在远程的高性能服务器上跑Vivado综合实现就好了。前段时间用ubuntu下安装的Vivado发现有一个Remote Host的设置。所以就准备折腾一下这个。
WSL
WSL的安装看官网的文档就好了。最近摸索了一段时间后感觉,Linux系统的桌面并没有很大的作用。一般只需要应用程序有一个可视化的图形窗口就行。切换目录浏览文件,启动应用程序都可以通过命令行快速实现。因此安装完WSL之后并不太需要安装一个“桌面”,而只要能够显示某些应用软件的图形界面即可。
图形界面显示用Xserver实现,我在widows端采用xcvsrc作为服务端。在WSL中运行的应用程序都可以转发到widnows主机上显示,这一转发的功能需要设置转发显示的地址,由变量DSIPLAY控制显示的地址和端口。某些远程SSH登录的软件可以指定这一地址,如果不指定的话也需要在.profile或.bashrc中确定DISPLAY变量。
Vivado安装
Vivado的安装过程可以看ug973,在没有图形界面的情况下可以用 ...
基于国产器件的KCF跟踪算法实现与验证
在国产的FT-M6678 DSP上实现KCF算法是我研究生期间的主要工作,KCF算法的原理与实现已经在之前的文章以及我的Gitee仓库中有部分介绍。这里主要介绍DSP与上位机通信的方式,以及XDMA Linux驱动的使用。具体的设计细节可以看我的毕业设计补充材料。
SRIO与PCIe桥接器
如果只考虑实现DSP与上位机通信,设计硬件的时候就完全可以将DSP的PCIe接口与上位机连接。但我所用的硬件平台实际上是DSP与FPGA通过SRIO连接,FPGA与上位机通过PCIe连接,所以我就在FPGA里做了一个接口转换的功能。实现数据在SRIO接口与PCIe接口之间的传输,这一设计我称之为“SRIO与PCIe桥接器”。
图中的SRIO IP对外与DSP采用SRIO链路互连,XDMA对外提供PCIe接口与上位机互连。桥接器提供了AXI4-Lite slave接口,可以通过配置寄存器来控制它工作。XDMA在实例化的时候勾选上AXI4-Lite接口,上位机就可以直接通过Lite接口控制桥接器;DSP想要控制桥接器工作可以通过EMIF总线接口实现。
我另外设计了EMIF与AXI4- ...
如何写好学位论文
昨天刚提交了学位论文,今天准备来总结一下一些常用的Word写作技巧。
样式与多级列表
论文一般都会对章节条目的标题、参考文献、表格内容、题注的字体字号、行间距、段落间距等作出规定。为每一类文字设置一种样式,在写的时候直接应用样式可以方便地对全文的格式进行管理。
修改样式的界面可以对格式做一些简单的设置,但是一般具体的设置都需要点左下角的“格式”,然后选择要设置的内容,有更多的设置选项。最主要的是字体和段落的设置。要实现自动地对标题编号不是在这里的“编号”选项里设置的,这里的编号是局部的编号。章节标题的编号需要通过多级列表来实现。在多级列表栏目里选择“定义新的多级列表”
设置的时候需要点开左下角的“更多”,单击要修改的级别,然后看右边将这个级别链接到具体的标题样式。下面还可以对编号以及缩进进行具体的设置。
题注与交叉引用
在引用的菜单栏中有“插入题注”和“交叉引用”的选项。主要用来给图片和表格一个标签,它会在光标所在位置插入。编号选项里可以设置图片或表格编号的形式,比如下图中的就是为第二章中的第一张图插入题注。有时候插入了新的图片或者删掉了图片,题注需要更新 ...
EMIF转AXI4-Lite接口
最近想用DSP对FPGA里的IP进行配置,感觉没有什么特别好的办法。如果能像Zynq一样直接有能够配置外设的AXI-Lite接口就好了。EMIF是DSP的外部存储器访问接口,支持对存储器的同步或异步访问。在我现有的条件下,利用EMIF接口配置FPGA内部的寄存器是一个可行的选择。Gitee链接
整体方案
EMIF接口相比于AXI-Lite少了握手的过程。不能仅通过简单的同步/异步访问完成寄存器的读写。整体方案如下图:
写命令需要缓存地址和数据,因为不知道AW和W通道什么时候才会握手。
读命令需要有两步才能完成,首先缓存地址,将地址发送到AR通道,等R通道返回数据之后,DSP再次读数据才能得到真正的结果。
缓存读命令的地址可以采用与缓存写地址用的不同的FIFO,但我采用的方案是读写地址都用同一个FIFO缓存,并且读命令的第一步是向要读的地址写任意数据(这个数据被丢弃),用来缓存写地址。
读写地址的区分额外用了一根地址线,因此DSP在FPGA上实际的访存空间只有逻辑地址的一半。
EMIF地址映射
FT-M6678的EMIF每个片选有64MB的空间,而一般外设的控制寄存器可 ...
基于多核DSP的双目标KCF跟踪实现
KCF目标跟踪算法在DSP上实现的具体细节我已写了一篇文章,已被《红外技术》期刊录用,应该不久之后会见刊。文中主要介绍如何用单核DSP和硬件FFT加速器实现KCF算法,并满足实时性需求。
后来为了用KCF跟踪算法同时跟踪两个不同的目标,就有了这篇文章所介绍的工作,本文主要就是分享一下我的设计过程,同时也作为一个多核DSP工程的示例(Gitee链接)。多核工程在实现的过程中主要要解决的就是不同核之间的同步的问题和共享资源的互斥访问的问题。
软件整体结构
多核程序的设计首先可以确定软件的整体结构,可以是主从式,也可以是流水线的形式。最好能平衡每个核的工作量,合理地安排每个核的任务。我这次采用的是类似主从式的结构,软件整体框图如上图所示。主要实现以下功能:
Core0负责接收图像数据,采用乒乓缓存的方式接收,在处理当前帧的同时可以同时接收新的数据。Core0可以按照一定的帧频接收图像,也可以主动向PC发出接收图像的请求。
Core0通过消息队列(MsgQ)向Core1和Core2发送命令,执行KCF跟踪算法,Core1和Core2分别将两个目标框的左上角坐标和长宽(x,y,w ...
用于多核DSP开发的核间通信
TI的多核DSP以TMS320C6678为例,它是多核同构的处理器,内部是8个相同的C66x CorePac。对其中任意一个核的开发就和单核DSP开发的流程是类似的。
但是如果仅仅只是每个核独立开发,那么很难体现出多核的优势。要充分发挥多核处理器的性能,势必需要涉及核间通信,另外还有许多共享资源的分配的问题需要考虑。
IPC(Inter-Processor Communication)是RTSC体系下的一个Package,专门用来实现不同核之间的通信。IPC可以在这里下载。3.0版本以后的IPC会直接包含在对应的SDK里面,如果要用更早的版本,也可以再下载,只是要注意最好对上XDCTools和SYS/BIOS的版本。
IPC 版本
3.50.04
1.25.03
XDCTools
3.55.02
3.24.05
SYS/BIOS
6.76.03
6.34.04
3.50版本的IPC是包含在C667x的PDK里的,但我在安装的时候XDCTools安装失败了,可能是CCS版本比较老的原因,所以我就用的是1.25版本的IPC。虽然这两个版本号有很大差别 ...
卡尔曼滤波器
推荐资料
KalmanFilter.NET
Understanding Kalman Filters
卡尔曼滤波与组合导航原理
“If you can’t explain it simply, you don’t understand it well enough.” —— Albert Einstein
第一个网站是我认为的讲卡尔曼滤波讲得最好的资料!“如果你不能用简单的话把问题解释清楚,那就是理解得不够”。作者就是能用例子把问题讲得很清楚的那种人。上面举的例子和介绍的思路都非常适合初学者,即使是什么都不懂的人也能非常快速地理解。只是后面还有一些内容比如EKF、UKF等作者还没更新上去,目前只有基础的卡尔曼滤波。
第二个链接是MathWorks给出的关于卡尔曼滤波的教学视频,还有一个配套的关于单摆的实验,可以一边动手操作一边学习,感觉挺有意思的。
第三个链接是B站上的西北工业大学的严恭敏老师上课的录屏,严老师还有一本书《捷联惯导算法与组合导航原理》,相当于是课本,推荐想要系统学习的同学去看这个。
基础
在正式开始介绍之前,首先得有一些基础的概念。
随机变量的期 ...
最佳的最小二乘解
本文是关于最小二乘问题的一些总结。
问题引入
最小二乘法最常见于曲线拟合的问题。比如有一组样本点(x1,y1)(x_1, y_1)(x1,y1), (x2,y2)(x_2, y_2)(x2,y2), (x3,y3)(x_3, y_3)(x3,y3), …, (xm,ym)(x_m, y_m)(xm,ym)。每个样本点的xxx都是n-1维列向量。然后根据用户定义的模型可以列出m个方程组成的方程组来求解模型中的参数。
以x∈C3x \in { {\rm{C} }^3}x∈C3为例,每个样本是3维的数据,共5组样本数据,列出一次多项式方程组,求解n个参数a,b,c,da, b, c, da,b,c,d:
{ax11+bx12+cx13+d=y1ax21+bx22+cx23+d=y2ax31+bx32+cx33+d=y3ax41+bx42+cx43+d=y4ax51+bx52+cx53+d=y5\left\{ \begin{array}{l}
ax_{11} + bx_{12} + c{x_{13} } + d = {y_1}\\
ax_{21} + bx_{22} ...
C/C++读写BMP文件
BMP文件格式
读写BMP格式的图片需要首先了解BMP图片的存储格式。可以参考维基百科上的介绍。
BMP文件主要有文件头(File Header)、信息头(DIB Header)、调色板(Color Table)和像素阵列(Pixel Array)组成。大部分情况下我们需要用的就是每个像素的数据。
可以从图中观察到,文件头中的File Offset to PixelArray可以直接得知Pixel Array的位置。信息头中有图像的宽、高和位深度的信息。像素阵列中的数据是一行一行组织的,每行的长度都是4字节的整数倍,如果一行的像素大小不是4字节的整数倍,还会再后面加Padding。
BMP读写
了解了BMP文件的格式后,就可以据此编写相应的读写函数了。我准备写两个函数分别负责读和写。如下面的头文件所示:
12345678910111213141516171819202122232425262728293031323334353637383940414243/** * @file bmpRw.h * @author Jiandong Qiu (1335521934@qq ...
C6000 DSP优化技术入门
参考资料
SPRU198K-TMS320C6000 Programmer’s Guide
SPRUGH7-TMS320C66x DSP CPU and Instruction Set Reference Guide
主要是看了SPRU198K这个文档里的第三章,这一章里有5个Lesson,非常详细地介绍了一些很实用地优化方法。
在看这个之前最好对DSP数据路径和功能单元有了解,可以看SPRUGH7这个文档。只有充分发挥出8个功能单元的性能才能说是开发DSP,不然就只是单纯的C/C++开发。哦!还有我觉得起始看第三章之前可以先看一下第四章,第四章介绍了编译器反馈给用户的汇编文件中的一些短语的含义。
一些准备
DSP优化的过程并不是自己去写汇编而是尽可能多地告诉编译器一些信息,让编译器帮我们优化。
在工程选项中勾选上-mw和-k,那样可以在编译后生成汇编文件并且有软件流水线相关的信息,便于后续分析。
Lesson1 - 循环内部依赖
以两个向量的线性乘加运算为例:
sum=∑iω1xi+ω2yisum = \sum\limits_i { {\omega _1}{ ...