- 博客(89)
- 资源 (3)
- 收藏
- 关注
原创 FPGA上实现YOLOv5的一般过程
YOLO算法现在被工业界广泛的应用,虽说现在有很多的NPU供我们使用,但是我们为了自己去实现一个NPU所以在本文中去实现了一个可以在FPGA上运行的YOLOv5。之后为了将这个权重文件发送到FPGA上,所以我们再次使用python去解析这个权重文件,然后按照我们的FPGA加速器的架构对权重进行重组。为了在FPGA中实现YOLOv5,我们首先在VOC数据集上面进行算法的训练,得到训练后的文件,并对训练后的文件进行8bit量化操作。所以我们在FPGA实现的时候也是去实现这些基本的算子。
2025-04-24 21:35:50
1135
原创 [Synth 8-439] module ‘xpm_fifo_async‘ not found
另外如果是2016版本的IDE以及更早的IDE的话在使用的时候需要在TCL执行下面这句话。xilinx的xpm系列原语在我们的日常开发中经常被使用到,他分为以下三类。这个时候需要将bd从ooc编译改为global编译即可解决问题。就是明明有例化xpm_fifo,但是在综合的时候报错。但是在使用的时候突然出现了下面的错误。
2025-03-27 21:48:29
595
原创 FPGA实现HDMI输出
受限于FPGA本身时钟频率的限制,使用RTL完成TMDS编码的方式是很难完成高帧率的HDMI输出的,比如1080P@60Hz的像素时钟为148.5MHz,那么进行TMDS编码的5倍像素时钟就是742.5MHz,这么高的时钟频率对FPGA来说是一个很大的挑战。此外对于2K,4K这样的分辨率来说对时钟频率的要求就更高了,所以说使用RTL完成TMDS编码直接输出HDMI信号的方式比较适用于低分辨率的场景。FPGA实现HDMI输出有两种方式。在PL端首先例化了一个ZYNQ核。产生了一个彩条和纯色的切换的例子。
2024-12-29 22:30:21
1565
原创 异步FIFO的空和满是准确的吗
在我们关于两级同步器电路那篇推文里面提到了异步FIFO中格雷码进行同步的时候是允许漏采的,那么这个漏采会出问题吗,这篇推文我们就来讨论一下这个问题。首先来说明一下异步FIFO的空满信号是怎么产生的满信号是将读指针同步到写时钟域后进行判断产生的空信号是将写指针同步到读时钟域后进行判断产生的既然是异步FIFO,那么读写时钟域肯定是不一样的,最常见的一种情况就是读写时钟一个快一个慢的这种情况。另外一种情况是虽然读写时钟频率一样,但是不是由同一个时钟产生的,这样两个时钟也是异步时钟域。
2024-10-07 15:50:19
674
1
原创 计算机体系结构中的8个伟大思想
在某些情况下,假设从错误中恢复过来的代价并不高,并且预测机制也足够的准确,那么通过预测的方式来获取到的性能就远远比等待正确结果之后再执行下一步高的多。流水线这种方式在CPU的设计里面被应用的特别广,最小的一些低功耗的嵌入式CPU可能就两级流水,甚至就一级流水的方式,而对于高性能的CPU往往会有十几级流水,甚至更多。提高效率的一个很好的工具就是使用抽象化的设计,从一个复杂的模型中抽象出来一个简单的模型,使用抽象来表示不同的设计层次。通过增加多个并行计算的计算核是可以很明显的提高计算能力的。
2024-07-30 21:17:32
435
原创 Xilinx Vivado中的Axi Data Mover IP核的使用方法
负责将AXI Full协议和AXI Stream协议进行转换可以看到在这个IP核的接口可以分为以下两组其中S2MM是将AXI Stream协议的信号转换为AXI Full协议的信号MM2S 是将AXI Full协议的信号转换为AXI Stream协议的信号。
2024-07-15 21:56:10
1047
原创 FPGA图像处理--CLAHE算法(一)
在介绍CLAHE算法之前必须要先提一下直方图均衡化,直方图均衡化算法是一种常见的图像增强算法,可以让像素的亮度分配的更加均匀从而获得一个比较好的观察效果。左边是原图,右边是经过直方图均衡化后图,可以看到肋骨什么的可以更加清晰的显示了出来,能够更好的观察到肋骨等位置的细节。最左侧为原图,中间为直方图均衡化后的结果,最右侧为CLAHE算法的效果。但是美中不足的是总感觉有的地方太亮了,干扰到了我们的观察。从视觉效果上来看,CLAHE算法的效果最为明显。如下图就是经过直方图均衡化后的效果图。
2024-05-31 21:56:34
639
原创 CLAHE算法上新
在图像处理领域,对比度受限自适应直方图均衡化(CLAHE)算法是一种强大的技术,用于增强图像的局部对比度,尤其在医学成像和卫星图像分析中有着广泛的应用。我们的课程将深入探讨CLAHE算法的原理,并通过FPGA(现场可编程门阵列)实现,以提高算法的执行效率。算法FPGA实现:将CLAHE算法映射到FPGA,学习并应用关键的硬件优化技术。项目驱动学习:完成一个完整的FPGA实现CLAHE算法项目,将知识应用于实践。性能优化:探讨如何优化FPGA实现的CLAHE算法,以提高处理速度和效率。
2024-04-22 21:30:10
648
原创 JPEG LS算法简介
JPEG-LS算法提供了无损压缩和有损压缩两种方式,并且该算法对压缩性能和实现复杂性之间做了很好的平衡,它不像JPEG2000那样有复杂的DWT操作,在JPEG-LS算法中没有DCT,FFT等计算过程,只有对数据的减法,移位以及其他简单的操作组成,十分有利于FPGA等硬件设备实现。计算当前待编码像素的局部梯度值,并对编码模式进行选择。对当前待编码像素进入游程编码模式,得到编码码流,并进入步骤7进行码流拼接。对当前待编码像素进行正常编码,得到编码码流,并进入步骤7进行码流拼接。JPEG LS算法简介。
2024-04-17 21:24:21
1190
原创 FPGA压缩算法 (一)
量化器根据预定义的逼真度标准来减少映射变换器输出的精确性,以便试图去除心理视觉的冗余信息,这个过程是不可逆的,也是区分无损压缩和有损压缩的关键步骤,如果在量化的过程中有信息的丢失,那么就是有损压缩,若量化过程中没有信息的丢失那么就是无损压缩,最后的编码器用于减少编码冗余。在图像压缩算法中可以采用哈夫曼编码的方式对编码冗余的信息进行压缩,可以采用预测的方式来减少像素间冗余,可以采用量化的方式完成心理视觉冗余信息的去除。心理视觉冗余:也就是视觉上不重要的信息,因为人眼对色彩信息的敏感度是有限的。
2024-04-14 17:10:44
958
原创 怎么用Vivado做覆盖率分析
第三步:做如下设置,其中cover是我们想要设置的覆盖率的名字,这个可以自己设置,./是覆盖率信息放置的位置,这两项都可以根据自己的使用来设置。sbct是设置想要收集哪些覆盖率信息,s是行覆盖率,b是分支覆盖率,c的条件覆盖率,t是翻转覆盖率。这样在我们仿真的时候就会进行覆盖率的收集了。然后就可以看到在对应的仿真目录下生成一个xsim.codeCov的目录,因为我设置的./所以生成的信息放在了这个目录下。在做仿真的时候往往会去做代码覆盖率和功能覆盖率的分析,来保证仿真是做的比较充分完备的。
2024-04-13 10:52:38
1471
4
原创 FPGA实现Canny算法(Verilog)
在边缘检测算法里面Sobel是比较简单的一个算法,但是其检测出来的边缘往往是比较粗的,效果不是很好,因为我们最理想的边缘肯定就是一个宽度为1的细线。Canny算法在此基础上进行了改进,通过使用边缘的梯度信息进行非最大值抑制(NMS)和利用双阈值,这些措施消除了假性边缘,提高了边缘检测的效果。
2024-04-04 22:04:14
1042
5
原创 FPGA实现CLAHE算法(Verilog)
在介绍CLAHE算法之前必须要先提一下直方图均衡化,直方图均衡化算法是一种常见的图像增强算法,可以让像素的亮度分配的更加均匀从而获得一个比较好的观察效果。左边是原图,右边是经过直方图均衡化后图,可以看到肋骨什么的可以更加清晰的显示了出来,能够更好的观察到肋骨等位置的细节。直方图均衡化是针对全局进行处理的,所以当局部出现过亮或者过暗的时候就会影响效果。最左侧为原图,中间为直方图均衡化后的结果,最右侧为CLAHE算法的效果。但是美中不足的是总感觉有的地方太亮了,干扰到了我们的观察。直方图均衡化会增强噪声。
2024-04-04 21:22:56
1528
4
转载 当Spinal HDL遇到TCL
原文链接:当Spinal HDL遇到TCLSpinal HDL是一门基于Scala的硬件描述语言,它可以借助Scala语言的高级特性帮助我们更快的完成开发任务。不过需要注意的是Spinal HDL是HDL而不是HLS,我们在开发的时候仍然需要做到心中有电路这样才能写出更好的代码,因为Spinal HDL本质上还是在描述电路。在使用Spinal HDL的时候不可避免的会使用别人的IP核,这个时候可以采用BlackBox进行融合该IP核。但是比如在使用xilinx的IP的时候,我们只去在SpinalHDL
2022-02-03 16:07:10
712
转载 浅析OSERDESE3
原文链接:浅析OSERDESE3在高速接口的应用场景下,我们会经常听说SerDes(Serializer-Deserializer)这个词,也就是串行器和解串器,更为通俗的讲就是进行串并转换的。在Xilinx的FPGA中提供了ISERDES(提供串行数据到并行数据的转换)和OSERDES(提供并行数据到串行数据的转换)。在7系列的FPGA里面提供了ISERDESE2和OSERDESE2这两个原语供我们使用。而在UltraScale架构中提供了ISERDESE3和OSERDESE3这两个原语。OSERDES
2022-02-02 16:41:52
2388
原创 FPGA:PLL(锁相环)使用
打开添加IP的界面,即那个IP Catalog 输入clock查找PLL这个IP核,即那个Clocking Wizard。配置相应信息,在这个界面可以配置相应的要输出的时钟频率和相位等信息,这里配置为输出100MHZ。调用PLL模块`timescale 1ns / 1ns//////////////////////////////////////////////////////////////////////////////////// Company: // Engineer: /.
2020-09-23 21:36:35
2221
原创 解决ERROR: [Labtoolstcl 44-494] There is no active target available for server at localhost.
在ubuntu上使用vivado已经安装好了驱动但是下载到板子上程序时出现了ERROR: [Labtoolstcl 44-494] There is no active target available for server at localhost.这个错误可以通过gnome-system-monitor命令打开任务管理器找到hw_sever这个进程并杀死他,然后重启vivado。...
2020-09-19 11:40:04
5602
4
原创 java文本编辑器
这个文本编辑器的例子是为了练习IO和GUI编程,使用了icu4j进行编码格式推断,默认使用gbk编码打开,当icu4j推断到文档编码格式是UTF-8,UTF-16LE,UTF-16BE,GB2312,GB18030,GBK,ASCII其中之一时,使用推断的格式打开,可以很好的防止乱码。代码放到了GitHub上:https://github.com/Liu-Wei-Code/textEdit下载源码的时候,请点一下Star。...
2020-08-21 18:22:05
387
原创 用substring分割字符串
substring使用substring有两种重载形式:public String substring(int beginIndex)public String substring(int beginIndex, int endIndex)这两种形式都有一个开始索引beginIndex,在java中这个索引从0开始。第一种重载形式返回从beginIndex到结尾的字符串。第二种重载形式返回从beginIndex到endIndex-1的位置。这个范围是一个半开区间,即**[begi
2020-08-05 20:02:40
803
原创 FPGA:Zedboard开发板之点灯(PL)
开发环境为Vivado 2019.2。1新建工程打开Vivado,选择Create Project新建一个工程下面的界面直接next设置工程名及路径工程类型选为RTL工程,因为在新建工程时不指定源文件,所以勾选下面Do not 那个选项,源文件等到工程建立完毕后再指定。这里配置板卡的信息,可以在下面进行每一项的手动配置,由于我们采用的是zedboard开发板可在boards里面快速配置,不需要一个个参数手动指定,所以这里选boards。如果你的不是zedboard开发板,可以去board
2020-07-24 23:44:17
1737
原创 matplotlib输出中文显示问题
matplotlib如果直接去输出中文,那么会显示出来一个个的小方格。通过以下代码设置字体可以让其正常显示中文:from pylab import mplmpl.rcParams['font.sans-serif'] = ['FangSong']mpl.rcParams['axes.unicode_minus'] = False 代码如下:import numpy as npimport matplotlib.pyplot as plt#显示中文问题from pylab import
2020-05-26 22:40:41
217
原创 C++判断string里面的内容是不是double类型
今天有小伙伴问怎么去判读string里面的内容是不是double类型的,比如string a= "3.14"这个的内容就是double类型的,当然string的内容也应该可以是科学计数法表示double类型的数,比如string a = “1.3e2”这个也应该判定为内容为double类型。下面通过两种方法来进行判断:第一种先上代码,再解释原理。#include <iostream>#include <string>#include <cstdlib>us
2020-05-24 21:26:49
2913
1
原创 线程UI更新报错:Only the original thread that created a view hierarchy can touch its views.
当我们在线程里面更新UI的时候会报错:Only the original thread that created a view hierarchy can touch its views.如下面的代码:直接在UDP发送线程里面更新UI,就会报错,报错提示如下。这里的解决办法是把UI更新放到Handler里面。所有把上述代码的UI更新部分修改为如下图所示。...
2020-03-10 22:53:13
1453
原创 opencv读取视频实时传输到Android端
在传输视频音频的时候一般选用UDP协议,因为TCP会检查传输的数据包是否正确,当错误时要求重传,这样在观看实时视频时会造成卡顿。UDP并不会去要求重传,它会把错误的直接丢掉,而丢掉少许的数据包对我们观看视频来说并不会造成太大的影响,所以选用UDP协议。传输的Python代码如下:import cv2import socketsever = socket.socket()server=so...
2020-03-08 22:19:33
2205
5
原创 Android Studio加快gradle sync速度
在使用Android Studio时,新建项目之后下载gradle非常慢,有时候要40多分钟,通过修改为国内的源可以加快速度。是通过修改build.gradle文件来做到的。这个文件在你安装的Android Studio根目录下的,具体路径为:Android Studio\plugins\android\lib\templates\gradle-projects\NewAndroidProje...
2020-02-11 20:47:30
1306
原创 !_descriptors.empty() in function cv::BOWTrainer::add
出现这个错误,打印一下是第几个出现这个问题的,我的是130个出现问题的,那么就把第130个文件给删了,然后再找一张和它分辨率一样的补充在这里。比如:我的是这个文件出问题了那么把这个删了,最简单的方法是从他前面找一个文件来把他替换一下。...
2020-02-06 16:47:18
800
原创 快速排序
快速排序的分治法的一个典型应用,其时间复杂度是O(logN)。比如将6,12,1,4,7,15,3这7给元素进行排序。首先选出一个基准值,一般是选用第一个元素,这里也就是6。然后开始从最右边开始寻找比基准值小的元素放到基准值的左边,然后从左开始寻找比基准值大的元素放大基准值的右边。其执行过程:第一趟:基准值6 用一个变量来保存。设置两个哨兵,i=0,j=6。从右开始找比基准值小的元素,也...
2020-02-03 17:13:54
174
原创 python+opencv 静态图像人脸检测
这里使用的OpenCV人脸检测的XML文件可以从https://github.com/opencv/opencv/tree/master/data/haarcascades进行下载。需要将图片转为灰度图片。import cv2#要检测图片的路径filename = r"F:\Python\picture\003.jpg"def detect(file_name): #加载需要的XM...
2020-01-16 15:29:38
356
1
原创 python+opencv圆检测
霍夫圆检测对噪声比较敏感,所有进行霍夫圆检测的时候要先进行中值滤波。在OpenCV中是通过图像梯度来实现霍夫变换圆检测的,因此要选用cv2.HOUGH_GRADIENT这个参数。其实现分为两步:检测图像边缘,发现可能的圆心从候选圆心中计算最佳半径大小import cv2import numpy as npsmarties = cv2.imread(r"F:\Python\pict...
2020-01-07 15:16:03
5406
1
原创 python+opencv Canny边缘检测
OpenCV提供了一给非常方便的Canny函数(算法发明者:Jhon F.Canny)。Canny边缘检测算法非常复杂,其实现有5个步骤:使用高斯滤波器对图像进行降噪计算梯度在边缘上使用非最大抑制(NMS)在检测到的边缘上使用双阈值去除假阳性分析所有边缘及其之间的连接,保留真正的边缘,消除不明显的边缘import cv2#转为灰度图片img = cv2.imread(r"F:...
2020-01-06 14:24:27
413
原创 python+opencv读取视频文件
OpenCV提供了VideoCapture类和VideoWriter类来支持各种格式的视频文件的读写,在不同系统上可能支持的格式会有不同,但总的来说是都支持AVI格式的视频的。在视频没有结束之前,可以通过VideoCapture类里面的read()方法来读取每一帧图像,每帧都是一个BGR格式的图像。可以通过VideoWriter类里面的write()方法来把图像信息保存到VideoWriter...
2019-12-31 09:32:51
3368
3
原创 Qt中使用SQLite数据库
前言SQlite是一款轻量级的数据库,可以集成在其他软件中,十分适合在嵌入式系统中使用。在Qt5以上版本中可以直接使用,Qt5中带有SQlite的驱动。用法1.准备工作1.引入sql模块:在Qt的项目文件(.pro文件)中,加入sql模块 QT += sql2.添加相关头文件 #include <QSqlDatabase> #include <QSqlError...
2019-09-13 23:10:00
693
原创 python之飞机大战
最近使用python中的pygame模块写了一个飞机大战的游戏,这里记录一下编写过程。下面是实现的效果:主要需要实现的是英雄,敌机,子弹的绘制和碰撞检测。下面是部分代码:#gameSprite.pyimport pygameclass GameSprite(pygame.sprite.Sprite): ''' 初始化函数用于加载图片,默认设置图片移动速度为1 ...
2019-08-31 20:44:38
700
原创 python+opencv 获取图片中指定颜色的部分
获取图片中指定颜色的部分将图片的色彩空间转为HSV色彩空间通过比照HSV的参考表,进行获取要提取颜色的相应范围使用inRange函数进行提取使用imShow显示import cv2import numpy as npsrc = cv2.imread("D:\\myCode\\picture\\cards.png")cv2.namedWindow("input", cv2.WIN...
2019-06-22 23:00:36
32529
15
原创 python+opencv打开摄像头
打开摄像头import cv2capture = cv2.VideoCapture(0)while True: ret, frame = capture.read() frame = cv2.flip(frame,1) #镜像操作 cv2.imshow("video", frame) key = cv2.waitKey(50) #print(key...
2019-06-22 22:40:35
13931
1
planeGame.rar
2019-08-31
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人