提交 064ba2ef 编写于 作者: 饶先宏's avatar 饶先宏

202107290640

上级 ce0b0fe8
......@@ -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)
......
......@@ -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.
先完成此消息的编辑!
想要评论请 注册