Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
饶先宏
hdl4se
提交
064ba2ef
H
hdl4se
项目概览
饶先宏
/
hdl4se
通知
12
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
H
hdl4se
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
064ba2ef
编写于
7月 29, 2021
作者:
饶先宏
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
202107290640
上级
ce0b0fe8
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
96 addition
and
46 deletion
+96
-46
examples/hdl4secnn/cnn/cnncell/cnncell_convolution.c
examples/hdl4secnn/cnn/cnncell/cnncell_convolution.c
+94
-46
hdl4secell/include/hdl4secell.h
hdl4secell/include/hdl4secell.h
+2
-0
未找到文件。
examples/hdl4secnn/cnn/cnncell/cnncell_convolution.c
浏览文件 @
064ba2ef
...
...
@@ -79,8 +79,7 @@ IDLIST
VID
(
bDataWriteData
),
VID
(
state
),
VID
(
index
),
VID
(
readindex
),
VID
(
writeindex
),
VID
(
line
),
END_IDLIST
MODULE_DECLARE
(
cnncell_convolution
)
...
...
@@ -102,39 +101,12 @@ END_MODULE_DECLARE(cnncell_convolution)
enum
convstate
{
READ_COEFF
,
READ_BIAS
,
DO_CONV
CONV_START
,
CONV_WRITELINE
,
CONV_STRIPLINE
,
CONV_END
};
DEFINE_FUNC
(
cnncell_convolution_clktick
)
{
if
(
vget
(
nwReset
)
!=
0
)
{
int
state
=
vget
(
state
);
if
(
state
==
READ_COEFF
)
{
int
index
;
int
coeffvalid
;
coeffvalid
=
vget
(
wCoeffReadValid
);
if
(
coeffvalid
)
{
unsigned
int
v
;
index
=
vget
(
index
);
v
=
vget
(
bCoeffReadData
);
pobj
->
coeff
[
index
*
2
+
0
]
=
(
v
&
0xffff
);
pobj
->
coeff
[
index
*
2
+
1
]
=
(
v
>>
16
);
}
}
else
if
(
state
==
READ_BIAS
)
{
int
index
;
int
coeffvalid
;
coeffvalid
=
vget
(
wCoeffReadValid
);
if
(
coeffvalid
)
{
unsigned
int
v
;
index
=
vget
(
index
);
v
=
vget
(
bCoeffReadData
);
pobj
->
bias
[
index
*
2
+
0
]
=
(
v
&
0xffff
);
pobj
->
bias
[
index
*
2
+
1
]
=
(
v
>>
16
);
}
}
}
}
END_DEFINE_FUNC
DEFINE_FUNC
(
cnncell_convolution_gen_output_coeff
)
{
if
(
vget
(
nwReset
)
==
0
)
{
vput
(
wCoeffRead
,
0
);
...
...
@@ -169,15 +141,17 @@ DEFINE_FUNC(cnncell_convolution_gen_output_coeff) {
}
END_DEFINE_FUNC
DEFINE_FUNC
(
cnncell_convolution_gen_output_read
)
{
if
(
vget
(
nwReset
)
==
0
)
{
vput
(
wDataRead
,
0
);
}
else
{
vput
(
wDataRead
,
0
);
if
(
vget
(
nwReset
)
!=
0
)
{
int
state
=
vget
(
state
);
if
(
vget
(
wDataReadValid
))
vput
(
wDataRead
,
1
);
else
vput
(
wDataRead
,
0
);
if
(
state
==
CONV_INIT
)
{
int
index
=
vget
(
index
);
if
(
index
<
pobj
->
input_c
*
pobj
->
input_w
-
1
)
{
if
(
vget
(
wDataReadValid
))
{
vput
(
wDataRead
,
1
);
}
}
}
}
}
END_DEFINE_FUNC
...
...
@@ -191,10 +165,49 @@ DEFINE_FUNC(cnncell_convolution_gen_output_write) {
}
}
END_DEFINE_FUNC
DEFINE_FUNC
(
cnncell_convolution_gen_output_reg
)
{
DEFINE_FUNC
(
cnncell_convolution_gen_line
)
{
int
ww
,
cc
;
for
(
ww
=
0
;
ww
<
pobj
->
output_w
;
ww
++
)
{
for
(
cc
=
0
;
cc
<
pobj
->
output_c
;
cc
++
)
{
float
data_acc
;
int
kw
,
kh
,
kc
;
short
*
filter
;
short
*
bias
;
bias
=
(
short
*
)
pobj
->
bias
;
filter
=
(
short
*
)
pobj
->
coeff
;
filter
+=
cc
*
pobj
->
kh
*
pobj
->
kw
*
pobj
->
input_c
;
data_acc
=
0
;
/* filter */
for
(
kh
=
0
;
kh
<
pobj
->
kh
;
kh
++
)
{
for
(
kw
=
0
;
kw
<
pobj
->
kw
;
kw
++
)
{
for
(
kc
=
0
;
kc
<
pobj
->
input_c
;
kc
++
)
{
data_acc
+=
pobj
->
line_in
[((
kh
+
pobj
->
lineindex
)
%
pobj
->
kh
)
*
pobj
->
linesize
+
(
ww
*
pobj
->
sw
+
kw
)
*
pobj
->
input_c
+
kc
]
*
filter
[(
kh
*
pobj
->
kw
+
kw
)
*
pobj
->
input_c
+
kc
];
}
}
}
data_acc
*=
pobj
->
coeff_scale
;
/* bias */
//if (layer_info->bias_term)
data_acc
+=
pobj
->
bias
[
cc
]
*
pobj
->
bias_scale
;
/* active function */
if
(
pobj
->
actfunc
==
1
)
{
if
(
data_acc
<
0
)
data_acc
=
0
;
}
/* store it to output buffer */
pobj
->
line_out
[
ww
*
pobj
->
output_c
+
cc
]
=
data_acc
;
}
}
}
END_DEFINE_FUNC
DEFINE_FUNC
(
cnncell_convolution_clktick
)
{
//wDataRead = 0;
if
(
vget
(
nwReset
)
==
0
)
{
vput
(
state
,
READ_COEFF
);
vput
(
index
,
0
);
vput
(
line
,
0
);
}
else
{
int
state
=
vget
(
state
);
...
...
@@ -203,7 +216,11 @@ DEFINE_FUNC(cnncell_convolution_gen_output_reg) {
coeffvalid
=
vget
(
wCoeffReadValid
);
if
(
coeffvalid
)
{
int
index
;
unsigned
int
v
;
index
=
vget
(
index
);
v
=
vget
(
bCoeffReadData
);
pobj
->
coeff
[
index
*
2
+
0
]
=
(
v
&
0xffff
);
pobj
->
coeff
[
index
*
2
+
1
]
=
(
v
>>
16
);
if
((
index
*
2
+
1
)
==
(
pobj
->
coeffcount
-
1
))
{
vput
(
index
,
0
);
vput
(
state
,
READ_BIAS
);
...
...
@@ -220,10 +237,16 @@ DEFINE_FUNC(cnncell_convolution_gen_output_reg) {
coeffvalid
=
vget
(
wCoeffReadValid
);
if
(
coeffvalid
)
{
int
index
;
unsigned
int
v
;
index
=
vget
(
index
);
v
=
vget
(
bCoeffReadData
);
pobj
->
coeff
[
index
*
2
+
0
]
=
(
v
&
0xffff
);
pobj
->
coeff
[
index
*
2
+
1
]
=
(
v
>>
16
);
if
((
index
*
2
+
1
)
==
(
pobj
->
output_c
-
1
))
{
vput
(
index
,
0
);
vput
(
state
,
DO_CONV
);
vput
(
line
,
0
);
vput
(
state
,
CONV_START
);
memset
(
pobj
->
line_in
,
0
,
pobj
->
kh
*
pobj
->
linesize
*
sizeof
(
float
));
*
(
unsigned
int
*
)
&
pobj
->
bias_scale
=
vget
(
bCoeffBiasScale
);
printf
(
"%s read bias complete
\n
"
,
pobj
->
data
.
name
);
}
...
...
@@ -232,6 +255,29 @@ DEFINE_FUNC(cnncell_convolution_gen_output_reg) {
}
}
}
else
if
(
state
==
CONV_START
)
{
/* 读kh-ph行数据进来,构成做一行卷积所需要的数据 */
int
index
=
vget
(
index
);
int
line
=
vget
(
line
);
if
(
index
==
pobj
->
input_c
*
pobj
->
input_w
-
1
)
{
index
=
0
;
line
=
line
+
1
;
if
(
line
==
pobj
->
kh
-
pobj
->
ph
)
{
line
=
0
;
/* 计算一行卷积 */
CALL_FUNC
(
cnncell_convolution_gen_line
);
vput
(
state
,
CONV_WRITELINE
);
}
}
else
{
if
(
vget
(
wDataReadValid
))
{
//wDataRead=1
*
(
unsigned
int
*
)(
&
pobj
->
line_in
[(
line
-
pobj
->
ph
)
*
pobj
->
linesize
+
index
+
pobj
->
pw
])
=
vget
(
bDataReadData
);
index
=
index
+
1
;
}
}
vput
(
index
,
index
);
vput
(
line
,
line
);
}
}
}
END_DEFINE_FUNC
...
...
@@ -263,7 +309,8 @@ MODULE_INIT(cnncell_convolution)
pobj
->
coeffcount
=
pobj
->
output_c
*
pobj
->
kw
*
pobj
->
kh
*
pobj
->
input_c
;
pobj
->
coeff
=
(
short
*
)
malloc
(
pobj
->
coeffcount
*
sizeof
(
short
));
pobj
->
bias
=
(
short
*
)
malloc
(
pobj
->
output_c
*
sizeof
(
short
));
pobj
->
line_in
=
(
float
*
)
malloc
(
pobj
->
kh
*
(
pobj
->
kw
+
2
*
pobj
->
pw
)
*
pobj
->
input_c
*
sizeof
(
float
));
pobj
->
linesize
=
(
pobj
->
input_w
+
2
*
pobj
->
pw
)
*
pobj
->
input_c
;
pobj
->
line_in
=
(
float
*
)
malloc
(
pobj
->
kh
*
pobj
->
linesize
*
sizeof
(
float
));
pobj
->
line_out
=
(
float
*
)
malloc
(
pobj
->
output_w
*
pobj
->
output_c
*
sizeof
(
float
));
PORT_IN
(
wClk
,
1
);
PORT_IN
(
nwReset
,
1
);
...
...
@@ -293,8 +340,9 @@ MODULE_INIT(cnncell_convolution)
GPORT_OUT
(
wDataWrite
,
1
,
cnncell_convolution_gen_output_write
);
GPORT_OUT
(
bDataWriteData
,
32
,
cnncell_convolution_gen_output_write
);
GREG
(
state
,
2
,
cnncell_convolution_gen_output_reg
);
GREG
(
index
,
32
,
cnncell_convolution_gen_output_reg
);
REG
(
state
,
4
);
REG
(
index
,
16
);
REG
(
line
,
16
);
CLKTICK_FUNC
(
cnncell_convolution_clktick
);
DEINIT_FUNC
(
cnncell_convolution_deinit
);
END_MODULE_INIT
(
cnncell_convolution
)
...
...
hdl4secell/include/hdl4secell.h
浏览文件 @
064ba2ef
...
...
@@ -270,6 +270,8 @@ IHDL4SEModuleVar* hdl4seCreateModule3(HOBJECT parent, const char* clsid, const c
#define DEFINE_FUNC(funcname) \
static int funcname(MODULE_DATA_TYPE* pobj) {
#define CALL_FUNC(funcname) funcname(pobj)
#define END_DEFINE_FUNC return 0; }
#define MODULE_DECLARE(module_name) \
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录