- 博客(114)
- 资源 (14)
- 收藏
- 关注
原创 一文带你深入理解电路中的亚稳态现象与跨时钟域信号处理
前言亚稳态是一种现象,可以导致数字设备(包括FPGA)出现系统故障。当一个信号在不相关或异步时钟域的电路之间传输时,亚稳态现象较容易出现。本文描述了亚稳性,解释了为什么会出现这种现象,并讨论了它是如何导致设计失败的。由亚稳态引起的平均无故障时间(MTBF)的计算表明设计者是否应该减少此类失败机会的步骤。亚稳态数字设备(如FPGA)中的所有寄存器都定义了信号时序要求,允许每个寄存器在其输入端正确捕获数据并产生输出信号。为确保可靠运行,寄存器的输入必须在时钟边沿之前的最短时间(寄存器的建立时间tSUt_{
2021-06-26 21:19:40
2126
1
原创 同步FIFO和异步FIFO的实现
同步FIFO的实现首先是同步的实现,只需要一个时钟用来控制读写。同步 FIFO 实现较为直接,如下图所示,一个 FIFO 内部实现了 RAM 和一个控制读写的控制端,和普通的随机存储器不一样的是,FIFO 内部需要自动产生读写地址。控制端产生空、满信号。因此如何实现控制端去产生空满信号是主要需要考虑的地方。通常空满的判断是通过读、写地址进行的。第一种思路,利用读写地址的大小来判断空、满方法很简单,设置一个信号量 factor 来表识空满,每次读一个数据则令 factor - 1,写一个数据则令其
2021-06-10 17:32:55
1422
原创 c++和Java数组内存空间申请
c++中由于数组导致的内存溢出处理之前实现图论算法的时候碰到过超大的整型数组,用c++去实现着实会碰到一些莫名其妙的内存溢出问题。例如:我们想定义一个 2000*2000 的 2d 数组,甚至是这样大小的 2d 的 vector,如果是直接定义成局部变量,那么将会直接报内存溢出错(大家可以计算一下这样大小的数组会占据多少内存空间)。那么为什么定义成局部变量会导致内存溢出呢?笔者认为是因为程序中函数的调用或者说是运行其实是在栈中执行的,而栈的空间是很有限的,所以说定义过大的局部变量必然导致栈溢出(Sta
2020-11-19 00:05:12
1623
1
原创 zynq sdk 开发之通过 BRAM 进行 PL 与 PS 的数据交互
如何在 zynq 中进行 PL 端与 PS 端的数据交互?在zynq的使用中,高效的进行 BRAM 与 zynq 硬核的数据交换至关重要,当我们需要进行小批量的数据交换时,可以考虑采用 BRAM 作为数据交换的媒介,在 PS 端,将数据通过 AXI 总线写入 PL端的 BRAM 里面去,并且再读出来。整体的设计图如下所示:PL 端硬件的设计在 vivado 2017.4 下,可以通过 block design 快速进行模块的添加与设计。设计出来的架构如图所示:注意事项:BRAM 使用真实双端
2020-10-06 15:54:19
6369
44
原创 FPGA 可编程性与布局布线原理探究
学习 FPGA 也有了一段时间,在不断 coding 的过程中,对综合、布局布线等操作感到一丝丝的困惑,特将一些个人感悟总结如下:为什么说 FPGA 是可编程的?以基于 SRAM 的 FPGA 举例,由于 FPGA 是极其细粒度的架构,无论是怎样的电路,综合到片上之后都将以 LUT 、触发器和 MUX 的结构组成,而一个 k 输入的 LUT 又是由 2k2^k2k 个 SRAM bit 位作为选择输出,从而一个 k 输入的查找表可以配置实现任意 k 输入1输出的组合逻辑,如下图所示。之所以说 FPGA
2020-10-04 22:34:18
7251
原创 《计算机体系结构:量化研究方法》读书笔记
Lecture 1: Quantitative Approach1.计算机体系结构与计算机组成原理有什么区别?计算机的实现包括两个方面:组成和硬件。组成一词包含了计算机设计的高阶内容,例如存储器系统,存储器互连,设计内部处理器 CPU (中央处理器——算术、逻辑、分支和数据传送功能都在内部实现)。有时也用微体系结构一词来代替“组成”。例如AMD Operon和Intel Core I7是两个指令集体系结构相同但组成不同的处理器。这两种处理器都实现X86指令集,但它们的流水线和缓存组成有很大的不同。硬件指
2020-10-04 21:50:16
4427
原创 verilog实现简单的三级加法流水线
pipeline流水线设计是一种典型的面积换性能的设计。一方面通过对长功能路径的合理划分,在同一时间内同时并行多个该功能请求,大大提高了某个功能的吞吐率;另一方面由于长功能路径被切割成短路径,可以达到更高的工作频率,如果不需要提高工作频率,多出来的提频空间可以用于降压降功耗,进可攻退可守。今天这篇文章将小小总结一下流水线设计的一些关键点。
2020-07-08 20:24:02
8466
4
原创 基于 PYNQ 的 AXI 总线主从控制编写(ddr3的读写)
菜鸟一枚,最近也学习了关于 AXI 总线的相关知识。基于 PYNQ 编写了一个简单的 AXI 主从控制(牵涉到 DDR3 的读写)。设计目的设计出以下一个通过 AXI 总线连接的简单片上系统。包含以下部分:PL 端逻辑PL 端实现四个模块包括:寄存器堆寄存器堆主要是对指令等控制信息进行片上存储。具体的指令将由 PS 端写入。对于寄存器堆来说,其相当于 slave,而 PS 端的 jupyter 服务器相当于 master。使用的总线是 AXI Lite 总线(棕色的大箭头)。控制端控
2020-05-12 21:34:23
4470
3
原创 如何实现一个带双边沿检测的触发器
这是一道 HDLBits 上面的题目(Probelm 97 Dual-edge triggered flip-flop)。目的是实现一个带双边沿检测的触发器。我们知道,FPGA上是没有带双边沿检测的触发器的,即不存在这样的写法:always @(posedge clk or negedge clk)哪怕写了,没有这样的资源也实现不了,无法综合。那么我们怎么通过硬件电路设计去实现下面的时序...
2020-04-27 22:51:11
3870
1
原创 hdlbits 练习汇总
最近发现一个很有意思的网站,可以在线提交 verilog 代码以完成一些任务,并且还能得到仿真结果对比。可以利用零碎时间提交一些代码,练习verilog基础知识。网址如下:https://hdlbits.01xz.net/wiki/从 basics 开始对提交的答案进行汇总。(本博客会不断更新)//03_Wire.vmodule top_module( input in, output...
2020-04-22 11:25:31
8487
1
原创 单时钟同步 FIFO 和二时钟异步 FIFO 的基本原理和实现
学习目的:1.给大家介绍FIFO的基本原理和组成。2.学习同步单时钟FIFO、二时钟异步FIFO的分析以及编写。3.以实例体验如何将实际需求分析转换成代码。FIFO(First In First Out)队列通常在数字系统中实现两个模块间数据的暂存,达到减少两模块之间的速度依赖,使得两个模块能够相互相对独立的运行。FIFO是FPGA设计的一个非常基本的单元。FIFO一般用一个双口RAM和分别指示...
2020-04-20 11:05:46
2467
原创 基于FPGA的卷积加速
基于FPGA的卷积并行加速其实有很多方法,例如脉动阵列、加法树等操作。本篇博客将介绍一下基于加法树的并行化设计。其实总体原理也是很简单的。如下图所示,九个叶子节点是乘法器节点,分别代表九次乘法运算(卷积核是3*3的)。在得到乘法运算结果之后,将结果传送给加法节点。为了进一步增加并行性,加法树结构采用三叉树。即,对每三个子节点进行求和。最终得到一个部分和。实现方式是写一个加法器模块,再写一个...
2020-04-18 23:32:46
5324
8
原创 CUDA 并行加速基础之 Reduce 和 Scan 的实现
前言我们知道硬件拥有其独特的并行性,为了发挥这一特色。我们要将平时串行执行的程序用并行性算法重新改写才能充分发挥 GPU 的优势。实例:做求和:1+2+3+4+···为了做这样一个累加和的加速,有两种简单的实现方法,分别是 Redece 进行归约(二分),或者是用 Scan 通过控制步长进行扫描求和。Reduce如上图所示为了并行执行累加,我们要构造出一些线程,每个线程并行工作,从...
2020-04-14 21:28:19
3021
原创 CUDA之三种访存模式与代码测试
GPU 硬件架构具有三层的存储结构,分别是:**线程私有存储、线程块共享存储、全局存储**。访问速度自然是由快到慢。CUDA 程序编写的一个重要理念也是尽可能少的访问全局缓存。本博客将编写代码分别对三种访存模式进行相应的简单测试。
2020-04-14 17:26:38
1004
原创 CUDA 编程之对原子操作与并行性的理解
相关概念CUDA 的原子操作可以理解为对一个变量进行“读取-修改-写入”这三个操作的一个最小单位的执行过程,这个执行过程不能够再分解为更小的部分,在它执行过程中,不允许其他并行线程对该变量进行读取和写入的操作。基于这个机制,原子操作实现了对在多个线程间共享的变量的互斥保护,确保任何一次对变量的操作的结果的正确性。原子操作确保了在多个并行线程间共享的内存的读写保护,每次只能有一个线程对该变量进行...
2020-04-14 16:44:24
1267
原创 第一行 CUDA 代码之GPU架构理解与代码编写
CUDA 编程之软硬件结构的相关概念首先是对 CUDA 编程中可能会遇到的各种概念进行简单总结。如对 Kernel、Grid、Device、Host、Thread、Thread Block、SM 等部件进行梳理并且阐明相互之间的关系,并且牵涉到CUDA编程的基本理念与基本方法。最后写下CUDA的并行计算的简单入门代码。
2020-04-14 16:25:34
1167
原创 字符串高级操作——利用链表进行文本单词频率统计
现有一片英语短文,要求用c语言实现对该文章的词频统计,即利用文件读写方法,提取文本中的每一个单词之后通过算法统计其出现频率,并输出到另外的文件中。短文如下:Of all the changes that have taken place in English-language newspapers during the past quarter-century, perhaps the mo...
2020-04-13 13:32:54
771
原创 I2C 总线操纵 EEPROM
现如今对 FPGA 的基础已经有了一定的了解,并且进入到了总线操纵的学习中来。近一段时间打算更几篇关于总线操作的博文,首先从简单的 I2C 接口对 EEPROM 的操作开始。何为总线?总线(Bus)是计算机各种功能部件之间传送信息的公共通信干线,它是由导线组成的传输线束,按照计算机所传输的信息种类,计算机的总线可以划分为数据总线、地址总线和控制总线,分别用来传输数据、数据地址和控制信号。总线...
2020-03-17 15:27:27
1508
原创 如何去设计一个深度学习加速器?
How to make your own deep learning accelerator chip!Currently, there are more than 100 companies all over the world building ASICs (Application Specific Integrated Circuit) or SOC’s (System on Chip) ...
2020-03-01 15:02:22
3713
原创 用 django 构建翻译网站——软件工程课程设计
构架一个名为Bonnie的翻译网站,要求网站具备翻译网站的基本功能,即前台用户注册登录功能,智能翻译功能和后台的用户管理,系统管理。同时本网站具备用户与翻译者直接沟通无中介干涉的特点。
2020-02-04 18:07:55
2285
3
原创 图的embedding问题
图的embedding问题[摘要]:随着word2vec模型的提出,embedding问题开始逐渐引起大家的注意。在如今大数据背景的驱动下,商品、行为、用户等实体之间的关系越来越复杂化、网络化,而word2vec是sequence embedding的,故其表示能力较弱,已不适合表示当下的复杂数据,因此人们又提出了graph embedding,即通过某种方法,将大型的图进行embedding,...
2020-01-04 19:00:12
3319
原创 linux下python3调用c++的方法并传递参数
近日需要用python写一个接口来调用c++项目。在网上找了一些方法感觉较为紊乱,其实python调用c本身就是较为简单的,因为python就是用c写的呀!主要方法就是在python中调用ctypes包,使用相关api调用项目编译生成的.so文件(类似于动态链接库)。唯一需要注意的就是在c++文件里需要将调用的函数用extern "C"{ void c_change(int ii, ...
2019-12-09 19:09:36
1604
原创 isl使用方法
1.isl_ctx对象的创建:All manipulations of integer sets and relations occur within the context of an isl_ctx. A given isl_ctx can only be used within a single thread. All arguments of a function are require...
2019-10-04 10:43:51
5095
2
原创 循环优化与多面体模型
循环通常是数据并行应用的最密集计算段,因此循环优化直接影响性能。当面对嵌套循环时,分配给线程的计算粒度将直接影响性能。循环转换如Fission(循环裂变)与Fusion(循环融合)的嵌套式循环可促使并行化,并提高工作效率。本文就几种循环优化的方法与多面体模型的调度进行简要阐述(因为LZ已经被这些循环优化搞得痛不欲生了)。Loop fusion顾名思义,该变换令循环进行了融合。如图所示,原始...
2019-09-22 22:01:26
3811
1
原创 TVM(端到端的优化栈)概述
陈天奇团队宣布推出 TVM,在微博上表示,「我们今天发布了 TVM,和 NNVM 一起组成深度学习到各种硬件的完整优化工具链,支持手机,cuda, opencl, metal, javascript 以及其它各种后端。欢迎对于深度学习,编译原理,高性能计算,硬件加速有兴趣的同学一起加入 dmlc 推动领导开源项目社区 。」大多数现有系统针对窄范围的服务器级 GPU 进行优化,且需要在包括手机、I...
2019-07-30 23:32:11
6079
原创 用tensorflow实现带批标准化(BN)的MNIST数据集识别训练程序
引入这也是笔者第一次接触面向对象版的神经网络程序——其实也不难发现,我们每一次定义的层级结构中有很多重复的定义或操作,一旦引入面向对象编程方法将大大提高程序的可复用性。并且我们本次要做的是带有BN结构的CNN程序。我们可以把BN操作看成一个放在激活函数操作之后的一个功能单元或层级结构,这样我们可以避免每次都定义一些重复的变量。BN的操作大体如下:对于每一个输入实例xkx_kxk,我们...
2019-07-23 13:23:01
1021
原创 关于Batch Normalization(批标准化)的理解与代码实现
今天看了《深度学习》中关于批标准化的小节,一开始感觉有些困惑,后来搜集了资料后也有了自己的理解,总结如下。概念问题我认为要理解批标准化首先要理解标准化概念。那么,什么是标准化?通过中心化或标准化处理,得到均值为0,标准差为1的服从标准正态分布的数据。事实证明,一个神经网络接收一张白化(令像素点标准化)过后的图片作为输入数据,那么其收敛速度较快。那么将此实例延申,放入神经网络所有结构...
2019-07-23 00:26:06
2794
1
原创 深度学习中学习率的更新策略(MNIST实践)
引入随机梯度下降(SGD)算法是现如今使用较为广泛的优化算法(此处的SGD指的是小批量梯度下降)。具体执行方法是不断迭代直到满足停止准则,在每次的迭代中取小批量训练集,计算损失函数对于权重参数的梯度,并以一定学习率执行权重更新。《深度学习》一书中指出学习率(ε\varepsilonε)是SGD算法中的关键参数。并且在我之前所编写的深度学习程序中,学习率一直是一个固定的变量,但通过阅读才发现自己...
2019-07-20 23:09:57
3319
原创 numpy与tensorflow中的随机函数总结
笔者感觉numpy、tensorflow中的随机函数有些杂,用的时候总是不知道用哪一个,所以在本篇博客中对其进行一个简单的总结。numpy的随机函数我们可以利用numpy随机(random)模块生成我们想要的随机序列或进行一系列随机操作。常用api如下:np.random.randint(a, b)该函数用于生成一个指定范围 [a,b] 的整数。np.random.randn(d0,d...
2019-07-19 21:45:52
2687
原创 Tensor Comprehensions(TC)语言语法简述
背景Tensor Comprehensions 是一种可以构建 just in time(JIT)系统的语言,程序员可通过该语言用高级编程语言去高效的实现 GPU 等底层代码。该项目由face book开源发布。我的理解是我们通过该语言可以更加有效的理解张量、运算图等。虽然tensorflow已经有了tensorboard这样的可视化工具,但是在运算图的理解方面还是有些困难。语法示例下面给...
2019-07-17 15:45:41
1501
原创 CNN(卷积神经网络)实现手写数字识别并与django集成
任务设计一个卷积神经网络来实现对MNIST手写数字集的识别任务。为了增加模型复杂度并进一步练习tensorflow的使用方法,所以模型设计的稍微复杂一些。网路结构总共包括五个层级,包括四个隐藏单元、一个输出单元。 层级结构如下图所示包、数据集载入import tensorflow as tfimport numpy as npfrom tensorflow.examples.tuto...
2019-07-16 16:13:01
6325
2
原创 深度学习之手写数字识别——用bp神经网络实现
任务设计一个bp神经网络是实现对MNIST手写数字集的识别任务。网路结构包含一个输入层、一个隐层和一个输出层。 其实总共只有两个层级结构。包、数据集载入我们使用tensorflow来简化我们的操作。import tensorflow as tfimport numpy as npfrom tensorflow.examples.tutorials.mnist import input...
2019-07-16 00:17:21
8702
原创 机器学习算法之主成分分析——代码实现与相关理论分析
引入主成分分析(PCA)是一种常见的数据分析方法,通过该方法我们可以对数据进行降维操作,并且保留方差较大(信息量大)的维度。为了引入相关概念,我们先看一组数据:import pandas as pdimport numpy as npimport matplotlib.pyplot as plt%matplotlib inline# 总共十个样本 每个样本有两个特征值data = ...
2019-07-13 15:17:00
709
原创 一文讲懂普通线性回归与贝叶斯线性回归的区别
将均方误差应用到线性回归问题中首先我们先回顾频率派的解决方法,即常规解法——利用最小二乘法解决问题。损失函数采用均方误差函数。关于模型容量问题:在《深度学习》中专门指出,模型的容量也是一个需要用户指定的超参数,即拟合的多项式次数。此处为了简化操作,暂定为一次多项式。解决代码如下:import numpy as npx = np.random.randn(10) + 5# 初始参数k...
2019-07-12 01:22:19
3629
原创 tensorflow2.0GPU版本的环境配置与安装教程
现在tensorflow2.0也已经问世了,自然忍不住会想要安装一下,将安装过程记录如下:一、创建虚拟环境虚拟环境自然是在Anaconda下创建。因为tf2.0对应的是python3.7版本,所以我们在Anaconda Prompt或cmd下输入命令:conda create -n your_env_name python=3.7二、CUDA的安装:切记tensorflow2.0对应的...
2019-04-18 16:20:10
58428
32
原创 12行实现一个简易神经网络
准备工作现实现一个具有三层的最简单的神经网络,激活函数采用sigmod函数。整体结构如下所示:x是输入的样本值。设定为5*3的矩阵,即代表5个样本值,每个样本有3个特征值。y是标签,为5*1的矩阵代表每一个样本的标签。且取值范围为0或1。即完成一个简单的分类问题。w0、w1为中间的权重参数。L0、L1、L2表示每一层的计算结果。L2即是最终与标签比对的结果首先是数据的初始化:x...
2019-03-27 17:28:00
856
1
原创 线性回归的讨论
线性回归的概念给定一个数据集D={(x1,y1),(x2,y2),(x3,y3)…},所谓线性回归就是模拟出一个线性模型f(X)=k∗X+bf(X) = k * X + bf(X)=k∗X+b,使得对所有的x∈\in∈D得到 f(X) ≈\approx≈ y ∈\in∈ D,即尽可能准确的预测真实的y值。问题主要集中在我们该如何得到k、b的值呢?关键在于如何度量f(X)与真实的y之间的...
2019-01-03 15:45:39
389
原创 利用opencv实现随机线条的绘制
刚发现一个比较好玩的方法,利用opencv创建一幅图片,之后在上面一直不停的绘制线条(实现一万次),线条的起始点、终止点、颜色都是随即设定。就结果图片而言,有些凌乱,不过实现过程看起来很有意思!代码如下:#include <opencv2\opencv.hpp>#include <iostream>// 绘制图形using namespace cv;using...
2019-01-02 17:08:24
1556
原创 初探opencv——提高图片对比度与亮度(像素操作)
亮度与对比度的操作我们用较原始的方法实现对亮度与对比度的调节,运算实质如下:提升对比度主要调节 α\alphaα ,即使得每一个像素点之间数值的差距更大,对比度就提高了(对比更强烈了)。提升亮度主要调节β\betaβ,令每一个像素点值大一些。代码如下:#include <opencv2\opencv.hpp>#include <iostream>using...
2019-01-02 15:28:09
4189
ZYNQ-AX7020原理图、PCB图和引脚
2020-03-23
基于ZYNQ的FPGA基础入门.pdf
2020-03-22
I2C总线操纵EEPROM
2020-03-17
Genymotion-ARM-Translation_v2.0
2019-01-13
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人