异步FIFO设计
1.设计目标设计一个参数可配置的异步FIFO,要求:
FIFO深度从4开始在2的幂次方连续可配(4、8、16、……)
读写时钟域相位差、频率差任意(同步器参数可配)
2.参数列表
名称
默认值
说明
DEPTH_LOG
4
FIFO容量为$2^{DEPTH_LOG}$
DATA_WIDTH
8
数据位宽
3.端口3.1.端口列表3.1.1.系统端口
名称
类型
位宽
说明
read_clk
input
1
读时钟域时钟
write_clk
input
1
写时钟域时钟
rst_n
input
1
系统复位端口,低有效
3.1.2.读端口
名称
类型
位宽
说明
read_req
input
1
读完成信号
read_valid
output
1
读数据有效信号
read_data
output
DEPTH_LOG
读数据
fifo_empty
output
1
FIFO空信号
3.1.3.写端口
名称
类型
位宽
说明
write_req
input
1
写请求信号
writ ...
Octave卷积学习笔记
Octave卷积Octave卷积的主题思想来自于图片的分频思想,首先认为图像可进行分频:
低频部分:图像低频部分保存图像的大体信息,信息数据量较少
高频部分:图像高频部分保留图像的细节信息,信息数据量较大
由此,认为卷积神经网络中的feature map也可以进行分频,可按channel分为高频部分和低频部分,如图所示:
对于一个feature map,将其按通道分为两个部分,分别为低频通道和高频通道。随后将低频通道的长宽各缩减一半,则将一个feature map分为了高频和低频两个部分,即为Octave卷积处理的基本feature map,使用X表示,该类型X可表示为$X = [X^H,X^L]$,其中$X^H$为高频部分,$X^L$为低频部分。
为了处理这种结构的feature map,其使用了如下所示的Octave卷积操作:
首先考虑低频部分输入$X^L$,该部分进行两个部分的操作:
$X^L \to X^H$:从低频到高频,首先使用指定卷积核$W^{L \to H}$进行卷积,随后进行Upample操作生成与高频部分长宽相同的Tensor,最终产生$Y^{L\to H ...
转置型FIR设计
1.设计目标设计基于单口SRAM的转置型FIR,半并行实现,要求满足:
并行程度与串行程度参数可配置
数据位宽可配置,支持负数,负数为补码类型
2.参数表
名称
默认值
说明
PALL_PAM
4
并行阶数
PALL_PAM_LOG
2
并行阶数LOG值
SERI_PAM
4
串行阶数
SERI_PAM_LOG
2
串行阶数LOG值
DATA_WIDTH
16
数据位宽
3.端口列表3.1.系统端口
名称
类型
位宽
说明
clk
input
1
系统时钟
rst_n
input
1
系统复位信号,低有效
3.2.配置端口
名称
类型
位宽
说明
cfg_valid
input
1
配置有效信号
cfg_addr
input
PALL_PAM_LOG*SERI_PAM_LOG
配置地址
cfg_data
input
DATA_WIDTH
配置数据
3.3.数据端口
名称
类型
位宽
说明
din_valid
input
1
输入有效信号
din_busy
output
1 ...
SystemC入门笔记
变量说明数据类型SystemC为C++的一个库,因此C++的特性在SystemC中均可以使用,数据类型同理,除了C++中的数据类型外,SystemC也有一些自己的数据类型,如下所示:
二值变量:sc_bit和sc_bv<n>(n为宽度)分别为二值(0、1)变量和任意位宽二值向量。
四值变量:sc_logic和sc_lv<n>(n为宽度)分别为四值(0、1、x、z)变量和任意位宽四值向量
int型变量:sc_int<n>和sc_uint<n>(n为宽度)分别为有符号和无符号的不超过64位宽的整型变量
bigint变量:sc_bigint<n>和sc_bituing(n为宽度)分别为有符号和无符号任意位宽的整型变量
信号信号使用sc_signal<type>声明,一般用于连接端口和进程通信(功能进程之间连接信号)
端口SystemC中端口类型主要有sc_in<type>、sc_out<type>和sc_inout<type>,type中为端口的类型,可以使用C++自带的一些类型, ...
DianNao运算单元与体系结构分析
运算单元基本信息
名称
参数
数据输入位宽
$T_n \times DW$bit
权值输入位宽
$T_n \times T_n \times DW$bit
数据输出位宽
$T_n \times DW$bit
功能
矩阵乘法、最大值池化、平均值池化
乘法器数量
$T_n \times T_n \times T_n$
加法器数量
$T_n \times (T_n - 1)$
结构
NFU的整体结构如上所示,该部分分为三个部分,分别是NFU-1、NFU-2和NFU-3三个部分,分别是乘法器阵列,加法或最大值树和非线性函数部分。NFU-1由一些乘法器阵列构成,如下图所示。一个单元具有一个输入数据$Ii$和$T_n$个输入权值,一个单元中共有$T_n$个乘法器,分别计算$I_i \times W{ji}$的值,具有$T_n$个输出。
$Tn$个输入数据和$T_n \times T_n$输入权值经过NFU-1处理后,变为$T_n \times T_n$个部分积,第i个乘法器单元的第j个输出为$P{ij} = Ii \times W{ji}$。所有部分积 ...
AXI学习笔记-1
1.AXI总线结构AXI总线由5个通道构成:
通道名称
通道功能
数据流向
read address
读地址通道
主机->从机
read data
读数据通道(包括数据通道和读响应通道)
从机->主机
write address
写地址通道
主机->从机
write data
写数据通道(包括数据通道和每8bit一个byte的写数据有效信号)
主机->从机
write response
写响应通道
从机->主机
1.1.AXI通道读操作的通道如下图所示
写操作的通道如下图所示
1.2.AXI系统常见的标准AXI系统如下图所示,通常包括:
AXI master:AXI通信主机
AXI slave:AXI通信从机
AXI interconnect:AXI通信通路
AXI接口协议可用于:
AXI master - AXI interconnect的连接
AXI slave - AXI interconnect的连接
AXI master - AXI slave的连接
1.3.AXI接口1.3.1.全局信号
...
booth乘法器
描述Booth乘法器是一种使用移位实现的乘法器,实现过程如下,对于乘法:
R = A \times B \\
A = a_na_{n-1}...a_2a_1a_0扩展A的位数为n+1位,添加$a_{-1}=0$,则A变为:
A = a_na_{n-1}...a_2a_1a_0a_{-1}从i=0开始,到i=n-1结束,依次考察$a{i}a{i-1}$的值,做如下操作:
若$a{i} = a{i-1}$,不进行操作
若$a{i}a{i-1} = 01$,$R = R + B << i$
若$aia{i-1}=10$,$R = R - B << i$
最后,舍弃R的最右端1位,即获得$R = A \times B$
原理其原理比较容易理解,对于以上乘法,可以分解为:
R = \sum\limits_{i=0}^n (a_i \times 2^i \times B)以上是位移乘法器的原理,那么对于booth乘法器,添加了一条:
即有:
2^k + 2^{k-1} + ... + 2 ^{j+1} + 2^j = 2^{k+1} - 2^j将移位乘法器原理 ...
SSD目标检测系统
系统结构
SSD识别系统也是一种单步物体识别系统,即将提取物体位置和判断物体类别融合在一起进行,其最主要的特点是识别器用于判断物体的特征不仅仅来自于神经网络的输出,还来自于神经网络的中间结果。该系统分为以下几个部分:
神经网络部分:用作特征提取器,提取图像特征
识别器:根据神经网络提取的特征,生成包含物品位置和类别信息的候选框(使用卷积实现)
后处理:对识别器提取出的候选框进行解码和筛选(NMS),输出最终的候选框
神经网络
该系统的网络结构如上图所示基本网络为VGG-16网络,VGG-16网络由一系列3x3卷积顺序连接构成,在conv5_3层卷积之前,共有4个stride=2的最大值池化,因此该层的输出的长和宽比原始输入缩小16倍,在SSD300网络中输入图像的尺寸被归一化到300x300,因此该层的输出长和宽为$[300/2^4] = [18.75] = 19$,channel为512,即基础网络VGG-16的输出尺寸为512x19x19。
在基础网络之后,还有如下的网络结构:
名称
输入
kernel尺寸
stride
padding
输出
是否输出
conv ...
YOLO的网络后处理
理论分析
YOLO从v2版本开始重新启用anchor box,YOLOv2网络的网络输出为尺寸为[b,125,13,13]的tensor,要将这个Tensor变为最终的输出结果,还需要以下的处理:
解码:从Tensor中解析出所有框的位置信息和类别信息
NMS:筛选最能表现物品的识别框
解码过程解码之前,需要明确的是每个候选框需要5+class_num个数据,分别是相对位置x,y,相对宽度w,h,置信度c和class_num个分类结果,YOLOv2-voc中class_num=20,即每个格点对应5个候选框,每个候选框有5+20=25个参数,这就是为什么输出Tensor的最后一维为5*(20+5)=125。
上图为一个框所需要的所有数据构成,假设这个框是位于格点X,Y的,对应的anchor box大小为W,H,位置相关参数的处理方法如下所示,其中,$T_x,T_y$分别是输出Tensor在长宽上的值,这里$T_x = 13,T_y = 13$;$P_x,P_y$分别为原图片的长和宽:
x_r = \cfrac{sigmoid(x) + X}{T_x} \times P_x ...
神经网络压缩实验-Deep-compression
实验准备基础网络搭建为了实现神经网络的deep compression,首先要训练一个深度神经网络,为了方便实现,这里实现一个两层卷积+两层MLP的神经网络
123456789101112131415class net(pt.nn.Module): def __init__(self): super(net,self).__init__() self.conv1 = pt.nn.Conv2d(in_channels=1,out_channels=64,kernel_size=3,padding=1) self.conv2 = pt.nn.Conv2d(in_channels=64,out_channels=256,kernel_size=3,padding=1) self.fc1 = pt.nn.Linear(in_features=7*7*256,out_features=512) self.fc2 = pt.nn.Linear(in_features=512,out_features=10) ...