纯FPGA做采集直写DDR3,核心是“采集流→入口FIFO→AXI写主控/AXI DMA→MIG DDR3→环形缓冲”,不用CPU参与。处理器只在上电配一次基地址和长度,之后由硬件状态机按帧自增、回绕、出完成标志。
板间10G不能只把TX/RX差分线连上就跑,核心是“低抖动参考钟+GT收发器配置+8B/10B/64B成帧+PRBS自检+IBERT扫眼+PCB阻抗闭环”。Xilinx 7系用GTX/GTH,UltraScale用GTY;10.3125G光口常配合64B/66B,背板/直连可用8B/10B降低调试难度。
FPGA验证最费人的是手写testbench:功能点一多,定向用例、边界用例、随机回归全靠手工,既慢又容易漏。用Python做“向量生成—testbench渲染—仿真调用—结果比对—报告汇总”闭环,可把几百个组合用例一键跑完,适合加法器、FIFO、SPI、滤波器、AXI片段等中小规模数字逻辑。
音频降噪别用CPU轮询整帧FFT,FPGA走“I2S/PDM采集→定点FIR→饱和输出→I2S回放”流式通路,单样本几拍出结果,群延迟按采样周期算,48kHz下低阶FIR可做到亚微秒到几微秒级,远比软件批处理低。
工业闭环别把所有控制都扔给CPU。合理切法是:FPGA跑采样、误差、PID、PWM、过流联锁,做到采样即算、逐拍输出;嵌入式C只做参数整定、模式切换、故障诊断、HMI和日志。关键回路不进中断批处理,整体延迟从“毫秒级软件环”降到“微秒/亚微秒级硬件环”。
做产品别把裸机和Linux对立。低成本传感、电机微环、开机自检用裸机C;多协议、联网、日志、可视化放Linux;中间用设备树和统一数据模型衔接,既保实时又保可维护。
Vivado看静态时序先盯WNS/WHS:WNS负是建立不够、数据没在捕获沿前稳;WHS负是保持不够、数据变太快。先别急着降频,按“时钟定义准—IO边界准—CDC隔离—关键路径改造”四步收。约束顺序建议主时钟、生成时钟、时钟不确定性、输入输出延迟、时钟组、再写false/multicycle。
Artix-7不跑Zynq硬核也能做嵌入式系统:用MicroBlaze当CPU,AXI挂GPIO/UART/Timer/自定义加速IP,软件做协议、文件、调度,硬件做并口采集、PWM、滤波、定制算法。小逻辑用片上BRAM,重任务再挂DDR MIG,整体是“软核管控制、FPGA管并行”的协同架构。
STM32跑Java不是把桌面JVM塞进MCU,而是取解释器+裁剪类库+自定义类加载器:业务class放SD/SPI Flash,运行时下发、校验、加载,底层GPIO/CAN/串口仍用C驱动,通过native桥接。F4/F7/H7较合适,F0/F1资源太紧不推荐;开源可选JamVM、uJVM,商用有MicroEJ/STM32Java,目标只留核心运行时。
受限嵌入式Java做单测,核心不是把JUnit全套搬进板子,而是“业务算法离板跑、硬件访问靠抽象、板端只跑冒烟”。GPIO、ADC、串口、Modbus驱动不直连测试类,统一成HardwarePort接口,主机用Fake/Mock造数据,ARM小内存设备只跑精简用例。
设备树本质是一份“硬件简历”,用树形节点告诉内核外设有哪些、寄存器在哪、中断几号、GPIO怎么连;驱动只按compatible去匹配,不把硬件地址写死在代码里。 芯片级通用描述放.dtsi,板级差异放.dts,板文件用&标签引用并覆盖属性即可。
8KB RAM的MCU常见于Cortex-M0/M0+、部分低成本STM32C0/G0以及8位器件。RAM预算要先按“.data+.bss+栈+堆”四块算账:全局/静态进.bss或.data,局部进栈,动态进堆,外设缓冲单独列。优化目标不是“能编过”,而是留出安全余量,避免运行期静默溢出。
裸机里高优先级中断往环形缓冲写、主循环读,常见丢数据不是缓冲太小一种原因:指针非原子被拆、满时静默覆盖、单字节中断太频繁被更高优先级任务堵住,都会丢。下面给三套可直接落地的方案。
没有硬件SPI外设、或者SPI总线被LCD/Flash占满时,用普通GPIO模拟SPI是兜底方案。只要按CPOL/CPHA把时钟沿和采样点写对,SAR ADC在几十kHz~几百kHz SCK下能稳定出数;再配合寄存器直写和批量读,可进一步逼近芯片上限。
无FPU的Cortex-M0/M0+/M3上写float,编译器会引入软浮点库,乘法可能几十到上百周期、额外占数KB Flash,实时回路很容易抖。替代思路是用Q格式把“小数点位置定死”:一个整数乘2^n当小数用,运算全走整数加减、乘法和移位。