KPU寄存器配置说明

芯片厂家没有给出寄存器手册,我们从kpu.c, kpu.h, Model Compiler中分析各寄存器定义。KPU的寄存器配置写在 kpu_layer_argument_t 结构体中,我们取standalone demo中的kpu demo中的gencode.c来分析.(https://github.com/kendryte/kend ... pu/gencode_output.c)

[mw_shl_code=arduino,true]//层参数列表,共16层kpu_layer_argument_t la[] __attribute__((aligned(128))) = {

// 第0层{

.kernel_offset.data = {

.coef_row_offset = 0,                //固定为0

.coef_column_offset = 0        //固定为0

},

.image_addr.data = {                //图像输入输出地址,一个在前,一个在后,下一层运算的时候翻过来,可以避免拷贝工作。

.image_dst_addr = (uint64_t)0x6980,        //图像输出地址,int((0 if idx & 1 else (img_ram_size - img_output_size)) / 64)

.image_src_addr = (uint64_t)0x0                //图像加载地址

},

.kernel_calc_type_cfg.data = {

.load_act = 1,                        //使能激活函数,必须使能(硬件设计如此),不使能则输出全为0

.active_addr = 0,                        //激活参数加载首地址,在kpu_task_init里初始化为激活折线表

.row_switch_addr = 0x5,        //图像宽占用的单元数,一个单元64Byte.  ceil(width/64)=ceil(320/64)=5

.channel_switch_addr = 0x4b0,                        //单通道占用的单元数.  row_switch_addr*height=5*240=1200=0x4b0

.coef_size = 0,                        //固定为0

.coef_group = 1                        //一次可以计算的组数,因为一个单元64字节,

//所以宽度>32,设置为1;宽度17~32,设置为2;宽度<=16,设置为4

},

.interrupt_enabe.data = {

.depth_wise_layer = 0,        //常规卷积层,设置为0

.ram_flag = 0,                        //固定为0

.int_en = 0,                                //失能中断

.full_add = 0                                //固定为0

},

.dma_parameter.data = {        //DMA传输参数

.dma_total_byte = 307199,                //该层输出16通道,即 19200*16=308200

.send_data_out = 0,                        //使能输出数据

.channel_byte_num = 19199                //输出单通道的字节数,因为后面是2x2 pooling, 所以大小为160*120=19200

},

.conv_value.data = {                //卷积参数,y = (x*arg_x)>>shr_x

.arg_x = 0x809179,                //24bit        乘法参数

.arg_w = 0x0,

.shr_x = 8,                                //4bit        移位参数

.shr_w = 0

},

.conv_value2.data = {                //arg_add = kernel_size * kernel_size * bw_div_sw * bx_div_sx =3x3x?x?

.arg_add = 0

},

.write_back_cfg.data = {        //写回配置

.wb_row_switch_addr = 0x3,                //ceil(160/64)=3

.wb_channel_switch_addr = 0x168,        //120*3=360=0x168

.wb_group = 1                                                //输入行宽>32,设置为1

},

.image_size.data = {        //输入320*240,输出160*120

.o_col_high = 0x77,

.i_col_high = 0xef,

.i_row_wid = 0x13f,

.o_row_wid = 0x9f

},

.kernel_pool_type_cfg.data = {

.bypass_conv = 0,                //硬件不能跳过卷积,固定为0

.pad_value = 0x0,                //边界填充0

.load_para = 1,                //硬件不能跳过归一化,固定为1

.pad_type = 0,                //使用填充值

.kernel_type = 1,                //3x3设置为1, 1x1设置为0

.pool_type = 1,                //池化类型,步长为2的2x2 max pooling

.dma_burst_size = 15,        //dma突发传送大小,16字节;脚本中固定为16

.bwsx_base_addr = 0,        //批归一化首地址,在kpu_task_init中初始化

.first_stride = 0                //图像高度不超过255;图像高度最大为512。

},

.image_channel_num.data = {

.o_ch_num_coef = 0xf,        //一次性参数加载可计算的通道数,16通道。4K/单通道卷积核数

//o_ch_num_coef = math.floor(weight_buffer_size / o_ch_weights_size_pad)

.i_ch_num = 0x2,                //输入通道,3通道 RGB

.o_ch_num = 0xf                //输出通道,16通道

},

.kernel_load_cfg.data = {

.load_time = 0,                //卷积加载次数,不超过72KB,只加载一次

.para_size = 864,                //卷积参数大小864字节,864=3(RGB)*9(3x3)*2*16

.para_start_addr = 0,        //起始地址

.load_coor = 1                //允许加载卷积参数

}

},

//第0层参数结束……

};

上表中还有些结构体内容没有填充,是在KPU初始化函数中填充:```kpu_task_t* kpu_task_init(kpu_task_t* task){

la[0].kernel_pool_type_cfg.data.bwsx_base_addr = (uint64_t)&bwsx_base_addr_0;        //初始化批归一化表

la[0].kernel_calc_type_cfg.data.active_addr = (uint64_t)&active_addr_0;                //初始化激活表

la[0].kernel_load_cfg.data.para_start_addr = (uint64_t)¶_start_addr_0;         //初始化参数加载

……        //共16层参数,逐层计算

task->layers = la;

task->layers_length = sizeof(la)/sizeof(la[0]);        //16层

task->eight_bit_mode = 0;                                        //16bit模式

task->output_scale = 0.12349300010531557;        //输出的缩放,偏置

task->output_bias = -13.528212547302246;

return task;

}```[/mw_shl_code]

python制作神经网络_MicroPython动手做(10)——零基础学MaixPy之神经网络KPU相关推荐

  1. 【雕爷学编程】MicroPython动手做(10)——零基础学MaixPy之神经网络KPU

    早上百度搜"神经网络KPU",查到与非网的一篇文章<一文读懂APU/BPU/CPU/DPU/EPU/FPU/GPU等处理器>,介绍各种处理器非常详细,关于"K ...

  2. python识别魔方色块_【雕爷学编程】MicroPython动手做(08)——零基础学MaixPy之识别颜色...

    早上用百度搜了一下"颜色识别",多少有了一点大致的概念,还是老办法,动手做,多实验,往前走,还请各位老师多多指点. OpenCV(百度百科) 是一个基于BSD许可(开源)发行的跨平 ...

  3. proteus仿真micropython_【雕爷学编程】MicroPython动手做(04)——零基础学MaixPy之尝试运行...

    1.hello micropython #MicroPython动手做(04)--零基础学MaixPy之基本示例 #程序之一:hellomicropython #MicroPython动手做(04)- ...

  4. proteus仿真micropython_【雕爷学编程】MicroPython动手做(07)——零基础学MaixPy之机器视觉...

    机器视觉 machine vision 机器视觉是人工智能正在快速发展的一个分支.机器视觉作为生产过程中关键技术之一,在机器或者生产线上,机器视觉可以检测产品质量以便将不合格的产品剔除,或者指导机器人 ...

  5. Python和C语言哪个难?零基础学哪个好?

    Python和C语言哪个难?零基础学哪个好?Python上手简单有交互性强的开发环境,还有众多的第三方库,学习起来会比C/C++容易的多.C过于底层强在内存操作,功能实现起来却十分复杂并不适合新手作为 ...

  6. python一个月能挣多少钱-零基础学python,我可以让你一个月上手做项目!

    今天达内python培训想要跟所有零基础学习python的同学分享一些神操作,这些操作可以让你在一个月上手做项目,我准备好了,你呢? 为什么你的Python学习效率如此之低?学了3个月还不会做项目做爬 ...

  7. python从入门到精通需要多久--零基础学Python,从入门到精通需要多长时间

    求一份小甲鱼的<零基础入门学习Python>视频教程 评论 本系列教程面向础的同学,是一个深入浅通俗易懂的Python3视频教程. 适群 完全零基础入门,不需要任何前置知识. 教程概述 前 ...

  8. python入门到熟练要多久_零基础学python要多久

    零基础进行Python学习的话,如果选择自学,一般学习周期在一年半左右.选择进行培训的话,学习Python周期一般在五到六个月左右,不过学习的种类不同,班级不同,培训周期也是存在一定差异的. 零基础学 ...

  9. python 循环语句结果存储_【零基础学Python】循环语句

    while循环语句 可以使用while语句一遍又一遍的执行代码块.只要while语句的条件为True,子句的代码就会执行下去.在代码中,一条while语句始终包含以下内容: while关键字 条件(即 ...

最新文章

  1. MySQL 学习笔记(7)—— 游标
  2. 第 30 章 lvs-rrd
  3. Python 基本数据类型 (一) - 整数
  4. 使用MATLAB快速完成对ADC信号质量的分析
  5. UIScrollView实现不全屏分页的小技巧
  6. oracle导入导出版本规则,oracle expdp impdp 导出导入(支持高版本到低版本)
  7. 微擎模块安装文件manifest.xml
  8. 华为手机_text是什么文件_华为学习文档资料
  9. URL different URI
  10. 吴恩达神经网络和深度学习-学习笔记-4-深度网络
  11. java中加载窗口的函数_Java函数调用 - playgame的个人页面 - OSCHINA - 中文开源技术交流社区...
  12. 快速(动易)模板制作
  13. aardio部署_用aardio给python写个图形界面
  14. 解密weblogic控制台账号密码
  15. Vue+PHP实现个人博客系统
  16. 最简单的验证码(利用JSP生成验证码)
  17. LR参数化,参数化类型:Fille类型--参数分配与取值规律
  18. TC275——04Blinky-LED
  19. MVC中的自定义过滤器
  20. 单片机应用编程技巧---MCU专家答网友问

热门文章

  1. 2016.05.04,英语,《Vocabulary Builder》Unit 22
  2. 使用gcc编译STM32遇到的问题
  3. 【STM32Cube_23】使用USART接收GPS数据并解析(L80-R)
  4. ubnutu下载网易云音乐
  5. keyshot分辨率多少合适_keyshot电脑配置浅谈
  6. Go 每日一库之 email
  7. Python实现网站自动登录---傻瓜教程
  8. 基于WEB的数据挖掘综述
  9. EasyPark共享停车位的设计与实现
  10. 快速提示:安装Laravel 5