该项目主要被我用来参加集创赛[国二](后续也参加了研电赛[国一])(最后还参加了嵌入式大赛[国三]),可以先看项目介绍文档,那里面是我们分区赛以及国赛提交的材料。比赛过程中架构一共改了三个版本,核心加速部分(HLS生成的加速模块)一点没动,第一版把加速模块挂载到axi总线上,由于比赛要求必须用到NICE接口因此第二版写了个NICE转axi,但是答辩时被批脱裤子放屁,因此第三版改成了使用向量扩展进行套壳,进一步增强了加速模块的复用性,但是第三版实际定位效果不好(存在串口通讯问题),因此不建议使用,看下代码就行了。

这个页面主要针对第一版进行介绍。

<aside> 💡 note:这个项目使用HLS将行人定位算法打包成IP,主要是面向比赛而进行的工程实现,如果想要进一步研究RISCV架构或者扩展指令集,可以看行人定位的后续版本,行人定位Soc实现

</aside>

项目介绍文档

代码在👇

行人定位工程文件


结构总图

蓝色标识为外设模块,绿色为CPU核,灰色是总线。PS端(MCU部分)指的是RISCV软核E203,PL在这里指的是sirv_expl_axi_slv.v里面的AXI外设部分。PS和PL都是FPGA上的一部分,在芯来科技MCU200T这个板子的芯片上,其余部分通过接口与该开发板连接。后续版本基本上只有接口进行了改变,改变不是很大,如果只是想跑这个工程,建议用第一版,因为第一版的架构是最合理的,后续架构只是为了更符合赛题。

第一版:加速模块挂载在AXI总线上

第一版:加速模块挂载在AXI总线上

第二版:做了个nice转axi,将加速模块挂载到NICE接口

第二版:做了个nice转axi,将加速模块挂载到NICE接口

最终版:加速模块通过向量扩展进行套壳,并且加入云服务器,注意这一版HLS工程也改了,interface改成了ap_vld而非之前的axi_lite

最终版:加速模块通过向量扩展进行套壳,并且加入云服务器,注意这一版HLS工程也改了,interface改成了ap_vld而非之前的axi_lite

执行过程

惯导的数据通过wifi发送给esp8266(图中的wifi-uart),经过解包处理后通过串口发送给MCU200T的FPGA开发板,开发板上的RISCV软核接收(UART0)到串口数据后,使用相关驱动,通过AXI总线将惯导数据下发至定位模块,定位模块计算完结果后将位置数据写入BRAM中,RISCV软核通过axi总线将定位数据从bram中读出来,通过串口(UART2)发送给树莓派,树莓派上接收到串口的数据后通过HDMI进行显示

AXI总线图

Untitled

AXI总线图,也就是上面的BD图,接在E203的AXI接口处(sirv_expl_axi_slv.v)

使用bd图最大的好处就是设计总线很方便。但是要注意BD图在不同工程中的移植会很麻烦,有时候甚至导致vivado无法正常工作。

重点关注locate模块,以及帮助它判定零速的cnn模块(也是HLS模块,在cnn_control.v中直接被例化了)

<aside> 👉 s_axi_AXILiteS_0是E203下发指令以及传感器数据的接口,通过AXI interconnect(总线IP模块)将数据发送给Locate模块以及Bram—-输入

</aside>

<aside> 👉 s_axi_AXILiteS_0发送的有gyr以及acc的数据,这6个数据同时也会通过Locate模块原封不动的输出给cnn模块(不在BD图里),然后cnn模块将判定此时是否为零速,将判定结果通过zupt_valid返回给locate模块

</aside>

<aside> 👉 输出的pos_out会被pos_save模块(不在BD图里)通过BRAM_PORTB_0写入barm中,由e203通过总线再读回去并通过串口输出—-输出

</aside>