完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
1.概述
DSP有相关的专业芯片,能够专门实现计算功能,相比于通用处理器,DSP芯片专门用于计算,可以在一个周期内执行多条计算。随着单片机对计算功能的需求越来越多,如果用传统的通用处理器去执行大数据的计算,将会消耗许多的机器周期,导致系统的实时性变低。于是,一些通用芯片上也开始集成DSP扩展,比如常见的ARM Cortex-R和ARM Cortex-M内核。 有了这些DSP扩展支持,其功能更加强大,使用上,许多的办法都可以进行。比如常用的CMSIS-DSP。就是arm提供的DSP的编程库。使用上可以只需要将lib库和头文件包含到项目中即可。这样就可以使用CMSIS里面的函数功能,比如求正余弦函数。 arm_cos_f32(radians); 如果用标准的数学库中的cos函数,同样也能够达到目的,标准库函数则需要消耗更多的机器周期,而使用了DSP库,则更加方便高效的进行计算。 上述是ARM对DSP支持的使用,RISC-V也支持DSP扩展,在RISC-V的架构手册上,就对DSP扩展有着一些描述。 目前的支持riscv dsp的riscv core已经有了,但是实际的硬件芯片,市面上还没有见到。目前riscv 的 p扩展还是处于没有稳定的阶段,通过文档的阅读,也能够大致的描述最终的模型。 首先其特点如下: RISC-V DSP扩展是采用的通用寄存器进行数据的存储,这意味着SIMD的寄存器的单位是以通用寄存器的宽度作为标准,如果是RV32,寄存器的长度是32,如果是RV64,则寄存器的长度为64。 相比于RISC-V 的RVV,DSP扩展其寄存器的长度有限,但是对于并不复杂的计算来说,已经足够,特别是简单的音频,图形编解码,电机控制等等,都是非常好用的。 下面来描述一下具体如何在RISC-V上进行DSP的编程。 2.RISC-V P扩展编程实践(内联汇编) riscv-p-spec规定了P扩展的一些常用的函数功能。 ADD16 (SIMD 16-bit Addition) Type: SIMD Format: [tr]31 2524 2019 1514 1211 76 0[/tr]
Syntax: ADD16 Rd, Rs1, Rs2 Purpose: Perform 16-bit integer element additions in parallel. Description: This instruction adds the 16-bit integer elements in Rs1 with the 16-bit integer elements in Rs2, and then writes the 16-bit element results to Rd. Operations: Rd.H[x] = Rs1.H[x] + Rs2.H[x];for RV32: x=1..0,for RV64: x=3..0 Exceptions: None Privilege level: All Note: This instruction can be used for either signed or unsigned addition. Intrinsic functions:
通过对编译出来的程序进行反汇编,可以得到对应的汇编代码。 当然,如果要实现dsp指令的扩展,目前官方的编译器还没有完全支持RISC-V的dsp扩展。如果要完成带有dsp指令的支持的gcc编译器,需要对编译器进行一定的定制。因为目前RISC-V的p扩展,并未完全定稿,如果完善后,应该会被合并到主线主线。 其中编程的方式采用gcc内部的内联函数的方式进行,在《P-ext-proposal.adoc》中,规定了Intrinsic functions的形式,比如add16。 uintXLEN_t __rv__add16(uintXLEN_t a, uintXLEN_t b);RV32: uint16x2_t __rv__v_uadd16(uint16x2_t a, uint16x2_t b); int16x2_t __rv__v_sadd16(int16x2_t a, int16x2_t b);RV64: uint16x4_t __rv__v_uadd16(uint16x4_t a, uint16x4_t b); int16x4_t __rv__v_sadd16(int16x4_t a, int16x4_t b); 那么有上述函数可以供调用,不需要任何的库文件的支持,因为在gcc编译器中,内部自己可以根据这些内联函数进行汇编实现。 使用时,只需要包含gcc自带的dsp相关的头文件即可。 #include 3.RISC-V P扩展编程实践(库函数) 在很多情况下,底层的DSP指令虽然可以完成很多功能,不同的组合方式将能够带来不同效果,但是这些基础库的使用,在很多方面也需要编程人员有很强的数学基础,并不能提供通用的math计算方法,这时使用库函数将能够在很大程度上解决这个问题。类似ARM的CMSIS-DSP。RISCV生态上也有一个NMSIS。 可以将riscv的标准的dsp指令通过组合,形成更加通用的数学库,比如sin或者cos,fft,matrix等等,一些常用的标准库函数,都可以在里面找到。对于做嵌入式AI来说,已经十分完善。 使用方法上,首先需要添加NMSIS的的lib文件,然后包含头文件。 #include "riscv_math.h" 直接调用NMSIS库中暴露出来的函数即可。 float32_t xx = riscv_cos_f32(float32_t cos); 这种方式更加直接,也能减少编程人员对DSP函数的使用不熟悉,带来的一些人为的错误,所以NMSIS可以说是DSP指令的上层软件。使用该库可以很容易的进行高效的数据运算。 4.总结 在RISC-V的芯片中,如果要使用DSP,首先需要该芯片的硬件设计实现了RISC-V的p扩展,硬件支持的情况下,再适配编译器,编译器也将DSP的支持添加进去,这样可以直接使用DSP扩展的指令了。然而直接使用DSP提供的指令进行计算,工作量还是很大,同时优化也不一定非常的好,此时使用NMSIS库提供的函数,直接利用优化好的数学函数进行数据计算,这样才是高效最简单的方式。 |
|||||
|
|||||
只有小组成员才能发言,加入小组>>
3294 浏览 9 评论
2970 浏览 16 评论
3473 浏览 1 评论
9023 浏览 16 评论
4061 浏览 18 评论
1140浏览 3评论
589浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
579浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2313浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1876浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-4 01:04 , Processed in 1.263585 second(s), Total 79, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号