半年来工作内容归纳

总结一下近半年来所做的工作吧,可怜的还需要去实验室网站,拉自己发的周报,才有可能回想起来做了些什么事。游戏伤身还伤心。

从去年国庆节回家后,就没有回庆科实习了,老师也同意在实验室完成一部分公司的实习工作,继续给我发一部分实习工资,以补贴学习期间的囊中羞涩。

实习期间主要做唤醒词的研发,目前来看效果还好,虽然达不到业界水平,有些产品也用上了。

FPGA相关

FPGA是十月份开始正式接触的一直到现在。

起先开始跑了一些官方的简单例程,比如亮个灯,从clk手动计数分频转接到LED,控制频闪。

学习简单的verlog语法和VHDL语法。同样也找了一些所谓的学习视频,但都比较老旧,圈子也比较小。很多涉及到的基础知识多也点到为止,不能透彻的了解其中细节原理。

断断续续折腾了一个月左右,发现入门有很大的困难,国内知识体系太过封闭,接触不到最新的处理器设计相关知识,仍然停留在一些简单的电路设计的层面。

RiscV芯片相关

RiscV开始接触的时候,是通过Diligent 社区提供的RiscV手把手教程,网上找到一个已经编译好bitstream的mcs文件烧到FPGA上。

但由于其中缺少一个支持RiscV的JTag,为了给实验室节省经费,先后将实验室所有的正版的盗版的支持JTag的调试器挨个试了一遍。直到将libUSB库安装上,连上Jlink,官方驱动提示不支持调试RiscV才死心。到手Olimex的ARM-JTag-h后,

新的OpenOCD在Windows下使用LibUSB库做为USB驱动,而非使用官方的JTag驱动,这一个问题在官方文档中少有提到。

在这个问题上,沈老师的想法是对的,接触新东西的时候,尽量先使用与教程相符合的开发环境,以减少不必要的出现的问题,也防止新问题与旧问题混淆。

蜂鸟处理器

沈老师给买了本蜂鸟处理器的配套书籍,一开始感觉各方面讲的比较全,其实现的语言是Verlog,外设寄存器使用Sifive公司相同的memory map,完全兼容Sifive公司的SDK开发工具链。

但后来仔细看到RiscV的关键部分,协处理器(co-processor)相关章节时,其内容主次不分,含糊不清。涉及到co-processor的接口RoCC时,还改名成了EAI接口,还详细介绍了EAI接口的时序相关内容。看相关实现的部分发现,原来是网上找了伯克利加州大学电子 实验室的一份assignment,翻译了一下,重新排了版。没有也没有给出Answer和源码,说有兴趣联系作者邮箱,但最后发现其github上有一个浙大的同学发issue专门问到这个问题,作者也没有给出回复。

所以蜂鸟虽然也开源了其所谓的RiscV处理器核,但实际上只有蜂鸟E203有源代码,而且使用了自己的EAI接口,也没有提供协处理器的参考代码,考虑到国内开源风气和圈子,只能做罢。

Sifive开源RiscV处理器

从三月份开学起,开始研究Sifive公司开源的处理器,该处理器使用是Rocket Chip Generator处理器核,加上自己实现的处理器外设(包括PWM,Timer,UART,I2C,SPI等),使用适合科学研究用的scala语言chisel3编写。

Chisel 是一门伯克利加州大学开源的硬件构造语言,可以将scala语法转换成verlog,再进行综合。代码的可复用性高,写起来非常灵活。

Rocket Chip提供了三个使用Rocc接口工作的Co-processor例程(AccumulatorExample 、TranslatorExample 、CharacterCountExample ),三个例程分别使用不同的方式进行访存,虽然没有注释,代码逻辑比较清楚。其中AccumulatorExample 的load指令没有考虑目的寄存器的宽度,导致出错。字符串计数例程访问第二个CacheBlock时,beatoffset没有重置,以及zero_found计算不严谨的bug也已经修复。测算下来的运算量也是很优秀的。

以CharacterCountExample 来说,该Co-Processor用于计算一个字符串中指定字符出现的次数,以最典型的c语言例子:

int CharacterCount(char *str, char ch)
{
    int c=0;
    while(*str) if(*str++ == ch) c++;
    return c;
}

这样一小串代码在计算一个长度为50的字符串时,花费大约1万多个cycles,而使用co-processor,得益于内存的访问次数大幅度的减少,只需要100来个时钟周期就可以处理完。

###语音处理芯片相关评估

11月到年底,开始评估新一代的智能语音的方案,这里介绍几个我看到的芯片。

MAX9814

一款低成本、高性能麦克风放大器,具有自动增益控制(AGC)和低噪声麦克风偏置。在前端MIC上加一块AGC芯片,可以用于远距离拾音。实际测试下来,效果没有本质上的改变,但在应用上只要几块钱,聊胜于无吧。

BR262

安森美的一款远距离拾音加降噪的处理芯片,采用非常小的BGA封装,使用两个mic,一个用于远距采样,一个用于近路采样,效果相当不错。在非常吵杂的地铁环境中可以把背景噪声非人声分离出去。在前端的语音降噪效果比起WebRTC强上不止一个等级。价格也在1个美金多一点。

Ameba-D

瑞晟的一款双核语音处理器。非常适合做语音相关应用。文档较少,目前处于保密测试阶段,暂不细述。

###机床刀片分析方面

属于语音和数据处理结合的方面,通过大数据分析出金属加工机床噪声的改变来推测刀片磨损的程度。

一直没时间做,鸽了。

WebRTC的移植

WebRTC是google开源的用于Web浏览器进行实时通话功能。通过JavaScript API调用。将其用到的AECM,Noise Suppression,VAD功能移植到AZ3166(STM32f412 主频125Mhz)。

WebRTC代码结构相关内容有空的时候再补上。

特定人语音词语识别

在az3166上完成DTW算法,并结合MFCC,实现静态的孤立词比较。

一帧40ms的MFCC语音花费大约17ms,加上一次DTW花费7~19ms左右。

进行简单的样本测试,十个样本交叉对比,错误率为2/55,可以达到简单应用。

本科生毕设

学生还算努力,也比较聪明,但是开发经验比较少,还没有跳出自己造轮子的思想,项目估计要鸽。

Comments