Hyowinner的MBD技术论坛

 找回密码
 立即注册
搜索
楼主: RAIN

AI时代下的FPGA-MCU异构HIL技术链路讲解(长贴)

[复制链接]

1

主题

41

帖子

176

积分

MBD初级工程师

Rank: 2

积分
176
 楼主| 发表于 2026-5-26 10:20:32 | 显示全部楼层
RAIN 发表于 2026-5-26 10:09
跟着步骤走让AI生成个脚本就行,时间太紧了。
最近在研究FPGA量化交易和EMU原型验证这两个高附加值加速器 ...

AI的出现对工程师进行了二次分流,但早晚会遇到瓶颈,所以要做更深的思考,而不是把自己变成前端,变成AI的奴隶。

1.AI本身是为了取代底层执行的工作效率,只是顺路碰到了编程,就把写码的人干翻了。
2.AI目前解决不了杂七杂八的硬件问题,但是它可以通过重塑开发体系,做各个硬件开发环节的去耦,回避这类问题。
3.AI存在瓶颈,在越接近顶端越难以实现。

这三点的结论:
前端是错误的方向。
硬件不保值但是可以争取时间。
争取的时间可以拿来做更后端的东西

点评

深度思考!  发表于 2026-5-26 12:30
回复

使用道具 举报

1

主题

41

帖子

176

积分

MBD初级工程师

Rank: 2

积分
176
 楼主| 发表于 2026-5-26 11:47:42 | 显示全部楼层
param(
    # Vitis HLS batch launcher. Change this path if Vitis/Vivado is installed elsewhere.
    [string]$VitisHls = "C:\Users\Administrator\Desktop\vvd\Vivado2023\Vivado2023\Vitis_HLS\2023.2\bin\vitis_hls.bat",

    # Directory that stores the HLS Tcl flow and testbench files.
    [string]$ProjectDir = "Vitis_Proj",

    # Tcl script executed by Vitis HLS. This script creates the project, runs CSim,
    # runs synthesis, and exports the IP.
    [string]$FlowTcl = "full_hls_to_ip.tcl",

    # PMSM inverter/motor algorithm source file used as the HLS design source.
    [string]$SourceC = "Input\PMSM_Inv.c",

    # Header that declares the HLS top function MM_SELFDRIVE.
    [string]$SourceH = "Input\PMSM_Inv.h",

    # C stimulus data file. It must define signalData[80001][6] for S0-S5.
    [string]$StimulusC = "Input\signalData_tb.c",

    # Golden reference CSV used by PMSM_Inv_tb.c to compare CSim results.
    [string]$GoldenCsv = "Input\Goldendata\IaIbIc.csv",

    # C simulation testbench. It drives MM_SELFDRIVE, writes IaIbIc_HLS.txt,
    # and compares against GoldenCsv.
    [string]$TestbenchC = "Vitis_Proj\PMSM_Inv_tb.c",

    # Output directory for the exported Vivado IP archive export.zip.
    [string]$ExportDir = "export_IP"
)

$ErrorActionPreference = "Stop"

function Assert-PathExists {
    param(
        [string]$Path,
        [string]$Label
    )

    if (-not (Test-Path -LiteralPath $Path)) {
        throw "$Label not found: $Path"
    }
}

$workspace = Split-Path -Parent $MyInvocation.MyCommand.Path
if ([string]::IsNullOrEmpty($workspace)) {
    $workspace = (Get-Location).Path
}

Set-Location -LiteralPath $workspace

Assert-PathExists -Path $VitisHls -Label "Vitis HLS executable"
Assert-PathExists -Path $SourceC -Label "Algorithm C source"
Assert-PathExists -Path $SourceH -Label "Algorithm header"
Assert-PathExists -Path $StimulusC -Label "Stimulus data C source"
Assert-PathExists -Path $GoldenCsv -Label "Golden CSV"
Assert-PathExists -Path $TestbenchC -Label "C simulation testbench"
Assert-PathExists -Path $ProjectDir -Label "Vitis project script directory"
Assert-PathExists -Path (Join-Path $ProjectDir $FlowTcl) -Label "Full HLS flow Tcl"

New-Item -ItemType Directory -Force -Path $ExportDir | Out-Null

Write-Host "Workspace       : $workspace"
Write-Host "Algorithm source: $SourceC"
Write-Host "Stimulus data   : $StimulusC"
Write-Host "Golden CSV      : $GoldenCsv"
Write-Host "HLS project dir : $ProjectDir"
Write-Host "Export dir      : $ExportDir"
Write-Host "Running Vitis HLS full flow..."

Push-Location -LiteralPath $ProjectDir
try {
    & $VitisHls -f $FlowTcl
    if ($LASTEXITCODE -ne 0) {
        throw "Vitis HLS flow failed with exit code $LASTEXITCODE"
    }
}
finally {
    Pop-Location
}

$exportZip = Join-Path $ExportDir "export.zip"
Assert-PathExists -Path $exportZip -Label "Exported IP archive"

Write-Host "Flow completed successfully."
Write-Host "Exported IP: $exportZip"
回复

使用道具 举报

1

主题

41

帖子

176

积分

MBD初级工程师

Rank: 2

积分
176
 楼主| 发表于 2026-5-29 14:09:06 | 显示全部楼层
本帖最后由 RAIN 于 2026-6-15 09:52 编辑

#五、设计 FPGA 顶层结构、通信接口,并完成硬件落地

工程输入如下:
1.FPGA侧的HDL IP核,包括电机本体部分及逆变器部分算法,由同版本HLS生成。
2.基于MIL验证导出的golden data.txt, 即预期的输入核输出结果
3.一个预期的顶层结构,通信协议以及交互流程的状态机蓝图


工程流程如下:
输入指令:在工作目录下新建文件夹Vivado_Proj,在该目录下建立Vivado工程,工程初始化硬件信息与VitisHLS工程一致,将生成的Vitis IP核导入,打开对应的VivadoGUI界面。


对应GUI界面如下:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

1

主题

41

帖子

176

积分

MBD初级工程师

Rank: 2

积分
176
 楼主| 发表于 2026-5-29 14:23:25 | 显示全部楼层
本帖最后由 RAIN 于 2026-5-29 14:44 编辑

输入指令:在工作目录下基于Vitis HLS工程的Csim测试例,新建PMSM_IP_tb.sv,作为IP核的testbench,将测试的结果打印在PMSM_Vivado.txt中,并与Goldendata文件夹内的仿真结果做对比。通过指定AI基于上一轮的C仿真测试源文件生成RTL仿真测试源文件保证测试基准稳定,全流程测试逐步推进,利用AI的强大跨编译器生成能力,保证逐环节可追溯。



输入指令:完成3000步完整输出并与Goldendata内的IaIbIc.csv做对比,如果无异常,进行完整仿真,打印80000个全部数据。 由于完整仿真的本质是后台调用Vivado实现全面仿真,基于软件仿真硬件,时间较长,因此需要明确约束AI进行仿真行为,否则AI会偷懒。此处完成的是IP核裸核的行为级测试,存在软件->硬件之间的计算误差,该测试结果将作为后续硬件级测试的goldendata。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

1

主题

41

帖子

176

积分

MBD初级工程师

Rank: 2

积分
176
 楼主| 发表于 2026-5-29 15:02:29 | 显示全部楼层
本帖最后由 RAIN 于 2026-5-29 15:20 编辑

输入指令:编写顶层,对已经生成的FPGA IP核,由于Vivado输出结果是异步的,所以在每一轮IP核运算完成ap_done信号拉高的时候,我们构建6个缓存reg,用于保存当前周期计算的数据,后续进行SPI通信时,每次从该缓存reg读取信号以保证同步。在顶层需要一个SPI协议用来接受和传输对应的S1-S5信号。编写一个状态机,状态机包含2个状态:等待状态IDLE,工作状态WORK。在复位信号结束之后,顶层会不断地通过SPI协议发送AAAA信号,在接收到SPI协议MCU回传的BBBB信号后,FPGA进入持续运行状态WORK,在WORK状态下,MCU每10us会发送一次采样信号及对应的S1-S5信号。在FPGA接收到采样信号时,FPGA将当前缓存区的信号发送到MCU侧,同时将接受的S1-S5开关信号放在reg缓存区,在当前轮次IP核运行结束后,输出ap_done信号拉高时,将缓存区的信号作为电机输入载入进后续轮次的计算中。SPI协议的交互周期为10ms,且MCU发送信号时从缓存区做交互,MCU不发送信号时电机持续运行。



输入指令:对完整封装进行测试,状态机一次握手阶段编写输入,进入持续运行阶段时,测试数据输入基于IP核测试例的signaldata 开关信号测试数据。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

1

主题

41

帖子

176

积分

MBD初级工程师

Rank: 2

积分
176
 楼主| 发表于 2026-5-29 15:21:58 | 显示全部楼层
本帖最后由 RAIN 于 2026-5-29 15:25 编辑

输入指令:进行完整的80000步WORK状态测试,将结果打印到PMSM_FPGA_top_spi.csv。该阶段测试完整FPGA侧的含通信输出结果一致性,保证过程可追溯。



输入指令:基于<FPGA管脚图.csv>完成xdc文件的编写,将对应Tm信号,rst_n绑定在开关功能上。指定AI完成xdc文件编写,以及接口分配。



输入指令:输出顶层端口与FPGA硬件资源的映射关系,以便于物理接线。指定连接表,FPGA侧配置完成



至此,FPGA侧所有配置完成

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

108

主题

281

帖子

4508

积分

管理员

校长

Rank: 9Rank: 9Rank: 9

积分
4508
QQ
发表于 2026-5-31 11:14:47 | 显示全部楼层
RAIN 发表于 2026-5-29 15:21
输入指令:进行完整的80000步WORK状态测试,将结果打印到PMSM_FPGA_top_spi.csv。该阶段测试完整FPGA侧的含 ...

AI大模型对工程师的作用主要分两类:
1. 工程师原本就会做的事情,要降本增效;
2. 工程师原本不会做的事情,要助力变得可以做。

AI大模型对公司的作用:
1. 尽快把所有能干的工程师的肌肉记忆蒸馏为新的AI,降本增效。
2. 如果还不能实现1,那就朝着1的目标训练AI。
持续学习 未来有你
基于场景 解决问题
项目合作联系微信:Hyowinners
回复

使用道具 举报

79

主题

158

帖子

2554

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2554
发表于 2026-6-3 22:27:30 | 显示全部楼层
RAIN 发表于 2026-5-26 10:20
AI的出现对工程师进行了二次分流,但早晚会遇到瓶颈,所以要做更深的思考,而不是把自己变成前端,变成AI ...

二次分流:一种是存续,一种是灭亡,只是时间问题。
回复

使用道具 举报

1

主题

41

帖子

176

积分

MBD初级工程师

Rank: 2

积分
176
 楼主| 发表于 2026-6-10 15:20:43 | 显示全部楼层
这几天比较忙,到处跑,这周争取把MCU和闭环都搞完。
回复

使用道具 举报

1

主题

41

帖子

176

积分

MBD初级工程师

Rank: 2

积分
176
 楼主| 发表于 2026-6-15 10:45:43 | 显示全部楼层
本帖最后由 RAIN 于 2026-6-15 17:47 编辑

# 六、进行 MCU 侧控制算法优化和资源适配

在FPGA侧的电机模型本体完成部署后,在闭环的电机控制算法,即MCU侧进行电控算法的生成,二次开发及部署。
对于电控算法的C文件,可以由之前的模型静态编译工具路线生成,可以由AI生成,也可以手写,这并不重要,我们总有办法生成C文件。
与FPGA代码生成工具,板级调试IDE不同,MCU的生态以及对MIL的可移植性更好,在这一环节中,我们更多的讨论如何使用AI完成自动化C部署流程。
同时在C层级优化是直接优化,相比于在模型层级通过MCP进行优化,由于不需要检索库,检索模型属性,以及针对检索后的结果做间接数据类型优化,可以节约4倍左右的tokens损耗。


## MCU编译器级的优化
对于大部分应用层级的工程师,此处的描述可能会陌生,针对不同的硬件编译器,工程师需要了解内存,硬件级编译器,以及特定场景下的数据结构。
但是AI的存在将原本需要对计算的理解,和优化的方法转化为“我知道所以顺便提一嘴”的描述,大幅度提升了在部署过程中的二次优化效率。
由于静态代码生成工具的生成逻辑从模型上来看可能非常清晰,但是对于手写行为仍然存在绕弯的效率损失,因此该行为在让AI确认工作起点的行为后,提升代码效率。
下方提供了两类优化的指令实例。

## 数据优化
MCU集成和烧录过程中可能会出现精度损失,可以让AI解决。
如果我们涉及到代码的数据维度/类型等优化,可以通过该阶段对功能实现方法进行额外描述进行迭代,如:
“在该代码确认数据类型,对全算法中的定点数进行自适应位数处理,保证在运算过程中尽可能地保证精度”,
"对算法中的浮点数计算流程和数据范围进行确认,考虑到MCU的双精度浮点数为32位,在采用更好的计算顺序在相同资源损耗下,降低浮点数运算顺序对硬件输出结果的影响"。

#环境优化
MCU集成和烧录过程中中可能会出现适配问题,可以让AI解决。
如果我们涉及到对指定硬件编译器的适配,可以通过该阶段对功能实现方法进行额外描述进行迭代,如:
"针对XXX型号的Infineon MCU核心板进行额外优化,该编译板使用Tasking编译器"
"当前自动生成的代码符合C99规范,但是在真实场景下,部署编译器为C89,修正为C89规则"


工程输入:
1.与模型逻辑相一致的C代码
2.基于MIL验证导出的golden data,电机反馈到电控侧的电流信号/转矩/转速,电控侧输出到电机的控制信号, 即预期的输入核输出结果用于保证AI设计过程中的模型一致性


工程输出:
1。通过测试且保证输出数据一致性的Keil工程电控算法C源文件
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|MBD全栈技术学校|苏ICP备2025212294号-1|Hyowinner校长B站首页|手机版|小黑屋|Hyowinner的MBD技术论坛

GMT+8, 2026-6-25 06:38 , Processed in 0.113495 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表