下面是2022年集创赛安谋科技杯简析公开课文字版,建议结合PPT和视频一起学习。文字整理来自2022年集创赛安谋科技杯杯赛助理甘云汉。
大家好,我是第五届集创赛Arm杯企业奖一等奖得主,很荣幸能收到技术社区的邀请,在这里给大家分享我们小组去年的参赛经验,同时也将对今年的赛题做出一些简单的分析和我自己的想法。
第五届集创赛Arm杯参赛经验
首先我想向大家介绍一下去年的参赛经历。去年是我们学校第一次参加集创赛,由于对智能算法加速器十分感兴趣,并且Arm的作品在社区里资源最为丰富,因此选择了参加Arm杯。题目以后我们就遇到了一些问题。
刚开始我们不太清楚参赛流程,这个问题通过仔细阅读集创赛官网的大赛章程和观看大赛的宣讲视频就可以顺利解决,对赛程不太了解的时候问一下主办方的谢老师,他每次都可以耐心地解答。
除此之外,由于是第一次参加和SoC设计相关的比赛,如何设计集成系统也是当时面临的问题之一。在这之前参加过的类似的比赛都是利用FPGA设计简单的处理系统的,例如双目图像融合之类,没有整合成一个片上系统的经验。这个问题我们通过在极术社区上观看讲解视频和查阅例如AHB-Lite的参考文档解决了。极术社区上有非常多精彩的内容,不仅仅是有集创赛的精品分享,在比赛后想进一步学习AMBA总线的时候也是在极术社区上看其他人的分享来学习的。因此学会使用社区和论坛也是扫清困难的一种方法。
最后,我们当时在调试Cortex-M3软核的过程中,也遇到过各种各样的问题,我们的解决方法是在GitHub上参考往届开源过的设计,并向往届参赛者留言,向他们请教遇到的问题,后来通过邮件的往来,我也认识了一些同行,也为我之后的学习和研究生方向提供了建议和参考。
在去年的比赛准备过程中,时间分配也是我认为很重要的一点。我们去年完成的作品是一个具有语音识别和声源定位功能的智能车,SoC包括软核、总线系统和两大加速器这三个主要组成部分。Cortex-M3的总线结构和今年赛题要求使用的Cortex-M0基本一致,并且将会更为简单,因为Cortex-M0的软核上只有一个AMBA总线Master端口,不像去年的Cortex-M3有I-Code、D-Code和System三个端口,需要的bus matrix更为简单一些。我们对于时间的分配在一开始就计划好了。
去年一月中旬接到参赛的消息之后就开始着手准备软核的搭建,然后另外两个队友开始构思加速器的设计。
到了四月份,我们的第一个加速器基本设计完毕,并且和软核一起联合调试,发现了bug及时调整并及时做了优化处理。
在五月份的时候,我们的第二个加速器已经开始在制作了,但还是拿不出手的程度,所以我们在初赛的时候就只有一个声源定位的简单的功能。五月中旬提交了阶段性报告也就是初赛,不过今年的初赛是在6月1日,但现在也已经是三月份了,所以时间还是比较紧张的。
之后是五月底到七月这一个多月的时间,在不确定是否能进入分赛区决赛的情况下,我们继续调试和优化整个系统,让第二个加速器基本可以运行起来了,于是在分赛区决赛的时候,我们的作品实际上比初赛提交的文档里多了许多功能但在答辩过程中,语音识别还是出现了识别准确度不高的情况,当时评委们也发现了这个问题,我们很诚实地描述了由于我们调试时间还不够的情况,评委也给了我们鼓励和建议,这样就有了接下来准备总决赛的部分。
七月到八月这短暂的一个多月的时间,我们在学校实验室里依旧是紧锣密鼓地对语音识别做着改进,到了总决赛答辩前,语音识别准确率终于到了期望的范围内了,最后答辩的时候发挥也是比较满意,所以才有幸拿了一等奖。
从上面这段时间安排可以看出来从赛题发布之后到总决赛答辩前,基本上一直都是在调试过程中的。有一些时间点可能其他的队伍都忽略掉的,例如提交阶段性报告到初赛名单公布、分赛区决赛到总决赛这两段时间,部分队伍可能会因为纠结自己是否能够进入下一阶段而停下脚步,其实我们当时也有这样的顾虑,但一想到如果到这里就停下的话是不是有些可惜,所以就一直在做,最后的结果确实也给了我们答案。
2022年第六届安谋科技杯赛题的变化
说了这么久去年的情况,我们现在再来看看今年的安谋科技杯。今年的安谋科技杯题目和往年的都不太一样。往年属于自由命题的作文,而今年的是一个半命题的作文,今年需要参赛队伍利用Cortex-M0和射频硬件制作无线通信片上系统。这实际上是降低了难度,因为FPGA在实际生活中运用最广泛的领域就是通信领域,通信信号处理不同于往届大家都喜欢做的机器学习和神经网络,通信信号的调制和解调都是可以在课本里找到答案的。所以这届赛题在难度上不会很高,那么出彩的地方就在于细节的处理和拓展功能的实用价值了。
举个例子,今年题目中有这样一句话,“在此基础上增加适当的功能以满足特定的物联网应用,要求系统具有实用性、可演示性和创新性。”,如果我们已经做完了基础部分,能够实现FM电台了,并且失真度能做到很低了,那我们怎么才能将这样一个类似收音机的系统和物联网关联起来呢?我可以给大家提供一个思路,因为这正好与我去年做的作品有相似点。在ADC采样完正交信号并且成功解调还原出基带信号之后,得到的信号恰巧就是一段连续的语音信号,那么我们是不是可以对这段信号利用梅尔滤波器进行处理,提取梅尔频率倒谱系数,之后进行语音识别的处理,来控制其他系统,例如led灯的亮灭,或者像我们去年一样控制小车的前进和后退。这样做的话整个系统的实用价值就更进一步,初步可以实现一个自动应答系统的雏形,就像10086那种自动回复的客服一样,而且相对于其他提高部分只做了对讲机的小组,显然复杂度就提高了很多。
除了语音识别,我们是不是还可以把以太网模块加入进来,利用以太网传输原始基带信号,和解调后得到的基带信号利用某些算法进行对比,来计算无线通信的失真度、信噪比、灵敏度等等参数,让整个片上系统成为一个FM广播信噪比测试平台。
当然,这只是我的一些想法,因为去年我们是利用赛灵思的平台做的语音识别功能,开发流程稍微简单一些,并且FPGA的逻辑资源也足够多,安路的平台我也没有尝试过是否能完全实现提取梅尔频率倒谱系数进而用来实现语音识别的整个流程,所以这仅仅是我抛出来的砖,想表达的想法就是,如果能够完美实现题目要求的功能之后,还有很多剩余时间,那么就可以跳出题目的框架试一试和其他领域结合会有什么奇妙的化学反应。
谈完了我对本届赛题粗浅的理解,再和大家聊一聊这次赛题涉及到的具体的知识。上面提到了,这次赛题规定要求的软核是Cortex-M0,它和M3一样也是支持实时操作系统的,这里同样也可以是一个创新点。这里我们以硬木课堂提供的Cortex-M0例程为例子来简单讲述一下它各个信号的功能和构建过程。
先打开顶层文件,可以看到官方给的例程只引出了四个引脚,分别是时钟、复位和一个二线调试端口,其中这个二线调试端口的输入输出口是一个三态门的结构,应该是需要过一个IOBUF,但安路可能会自动把它约束到IOBUF上,所以跟我原来之前写M3的时候要用原语不太一样。之后就是一个预留给用户的32bit中断信号,可以把自己写的外设的中断信号连接到上面,注意好各个中断信号所在的位,这和后面软件运行有关。
之后就是Cortex-M0预留的一个AHB Master端口,它的总线架构相对于M3会更简单一些,如果不使用DMA这种模块的话,设计总线矩阵的时候只需要留出一个Master端口即可。
Cortex-M0和AHB-lite总线系统
之后就是Cortex-M0连接的总线互联器以及外设了,整个设计基本上都是用AHB-lite实现的,所以我就简单介绍一下AHB-lite的握手流程和时序。
学过微机原理的同学应该都知道,计算机总线系统一般分为三条总线,分别是数据总线、地址总线和控制总线。AHB是一种总线协议,它将上面说的三条总线的功能拆分合并了一下,变成了写数据总线、读数据总线和地址控制总线。并且为了适配多主多从的特性,还具有Arbiter仲裁器、Decoder解码器和multiplexer多路复用器这三种控制性质的模块。因为这次使用的AHB-Lite总线桥是一个单主多从的模块,因此仲裁器就被省略掉了。
可以看一下例程的文件,Interconnect就是这个AHB-Lite的总线互联桥,它例化了两个模块,一个是Decoder,另一个是multiplexer,interconnect只起到一个连线的作用,真正发挥作用的还是这两个子模块。
Decoder对从Master端口发来的地址数据进行解析,比如,例程里例化了一个AHB接口的blockram,它充当M0的ITCM,也就是紧耦合指令存储器,用来存放指令代码,根据ARM的官方手册,允许存放指令代码的地址只有三块区域,一般从零开始,所以这个例程里也选择了从0到0xffff这一片地址区域作为ITCM,Decoder中的代码也印证了这一点。根据它给出的例子,我们可以编写自己需要的外设,例如GPIO、UART等等,并在Decoder中分配它的地址空间,设置好选择信号即可。
Multiplexer则起到了数据选择的作用,它根据刚刚Decoder传来的选择信号,选择一个需要传输信息的Slave端口进行数据传输,传输的数据包括握手信号ready、响应信号resp以及数据data。
了解了这些,就可以继续了解时序了。首先是单一读写数据的时序,读和写的地址线是共用的,只不过数据线不同,读和写都分别在ready信号为高的时候进行,同时,在write信号拉高的时候表示的是写数据,write信号拉低的时候表示的是读数据。读写都包括两个时间相位,一个是地址时间相位,另一个是数据时间相位,这两个时间分别传输地址和数据。
接下来再看带等待的读和写操作,等待与否是通过ready信号决定的,如果主设备向从设备传输了一个数据,但从设备还没有处理完,主设备即将传输下一个数据的时候,就需要进行等待操作了。这时候从设备可以把ready信号拉低,向主设备表示没有准备好,主设备收到信号之后就会暂停直到ready信号拉高为止才能继续传输。
之后我们可以看一下cmsdk给出的AHB-lite的一个通用模板。
然后我们就可以根据AHB-lite接口的时序来实现一些简单的外设,例如串行通信口。
再来看看它的软件驱动应该如何写。
FM信号数字调制解调简介
简单介绍完了Cortex-M0和它的AHB-lite总线系统之后,我们可以进一步对题目中的重点—通信部分进行解释说明。
首先我们来了解一下接收信号到解调的过程,我们从接收信号,到生成数字正交信号这中间的步骤都是利用射频前端板卡的MSi001芯片完成的。首先我们需要确认的是,我们需要接收的FM信号频率是在VHF范围内的,因此接收天线应该连着芯片的VHF输入管脚,这一点是硬木课堂提供的板卡已经完成了的部分。
除此之外,需要正确地接收到FM信号,并选出你想要的频点,还需要配置一系列的寄存器来完成。MSi001的寄存器是通过SPI协议配置的,这就需要我们在之前讲到的总线系统中具有一个AHB-Lite接口的SPI从设备。具体的寄存器的描述以及期望频点对应寄存器值的计算可以参考硬木课堂的文档来操作,这一部分的功能是需要通过软核上运行的软件实现的,这是软硬协同的一部分内容,如果能用软核上运行的软件改变寄存器的值的话,就可以实现选台和搜台的功能了。
通过接收芯片接收到已调信号之后,就可以利用FPGA内部自带的ADC来对输出的数字正交信号进行采样和解调,这也是这个赛题的关键部分之一。
我们使用的ADC具有8个通道,选择我们这次IQ采样需要的那两个对应通道使能即可,当然,如果你还需要麦克风来输入的话就需要开启对应的第三个通道,之后利用锁相环生成ADC的参考时钟,然后编写一个检测转换结束标志位的检测器、一个通道转换器和一个数据转换器。由于data值和adc引脚上实际的模拟电压值是成线性变化的,所以我们可以不对data值进行任何转换,直接用它来表示I和Q信号,这样节省了资源和处理时间。
因为后面解调的时候会讲到,我们解调一次需要四个数据,所以我建议这里使用一个伪双端口ram来存储采集到的正交信号,相较于利用fifo, ram可以轻松地通过地址来控制输出的数据到底是哪一个时刻的I或者Q信号,同时,因为输入和输出的地址来源不是同一个模块,所以需要有双端口的功能,ADC控制模块输入数据,参考的结构框图如下(见PPT)。
如果后续还要加上存储电台录音的功能,那就需要一个真双口RAM,让另一个数据输出口连接着存储介质的缓存器。
之后可以开始解调的工作了,在这之前我们先来看一下正交解调的数学原理。
解调的原理就是这样,由于解调的过程除了输入数据以外,不需要改变其他参数,所以如果使用这种方式解调的话是不需要将它打包成一个AHB外设的,只需要设置使能引脚即可,但如果想在这个基础上实现其他功能的话,可能就需要考虑封装一个AHB接口了。
FM调制的过程在比赛题目中就不需要我们考虑了,使用的芯片QN8027的寄存器表和计算方式在硬木课堂文档中写得很清楚,仔细读一遍就能完成了,同样也需要封装一个AHB的i2c接口,来利用cortex-M0控制射频芯片,将麦克风采集到的ADC数据进行数字滤波,然后再利用片上DAC输出即可。
End
附获奖作品说明及视频。
【2021集创赛】Arm杯一等奖作品:Cortex-M3语音识别声源定位系统
完整培训视频链接:https://aijishu.com/l/1110000000304973
PPT请在附件中下载。
更多培训请关注集创赛安谋科技杯培训专栏。
文件名 | 大小 | 下载次数 | 操作 |
---|---|---|---|
【极术公开课】甘云汉-2022集创赛安谋科技杯赛题简析.pdf | 1.57MB | 343 | 下载 |