3. 软核处理器选型与IP获取

在Lattice FPGA上构建软核处理器系统,第一步不是写代码,而是做选型决策。Lattice官方提供过LatticeMico8、LatticeMico32两类经典软核,近年又通过RISC-V生态引入开源软核;同时,社区还有VexRiscv、PicoRV32、SERV等可直接综合到Lattice器件上的开源核。选型的核心不是“哪个核最强”,而是“哪个核与目标器件资源、外设需求、工具链和授权方式最匹配”。

一、四类候选软核的定位差异

LatticeMico8是8位RISC软核,指令宽度和寄存器宽度均为8位,逻辑规模极小,典型占用约200~400个LUT,适合替代状态机做简单控制、按键扫描、低速协议调度。它不支持完整操作系统,外设总线简单,通常配合Wishbone或自定义寄存器接口使用。

LatticeMico32是32位RISC软核,采用三态流水线,支持Wishbone总线,可挂载UART、SPI、I2C、GPIO、定时器等标准外设。其典型资源占用在1000~2000个LUT、1~2个EBR左右,视是否启用乘法器、指令/数据缓存而浮动。它适合中等复杂度的嵌入式控制,能运行轻量RTOS。

RISC-V软核是当前Lattice生态中增长最快的一类。官方及生态伙伴提供的RISC-V核通常支持RV32I或RV32IMC,具备标准中断、调试接口和较完整的工具链(GCC、GDB、OpenOCD)。其资源占用跨度大:极简RV32I约600~900 LUT,带乘法器和调试模块的RV32IMC约1200~2500 LUT。优势在于指令集开放、编译器成熟、可移植性强。

开源软核如VexRiscv、PicoRV32、SERV则提供更灵活的配置。PicoRV32以极小面积著称,约750~1200 LUT;VexRiscv可配置流水线级数、缓存和乘法器,性能与面积可调;SERV是位串行RISC-V核,面积可低至约200 LUT,但吞吐率极低,适合极低成本控制。

软核处理器选型四维对比 资源占用 · 性能 · 外设接口 · 授权方式 LatticeMico8 8位 RISC LUT:约200~400 EBR:0~1 性能:低,MHz级 外设:GPIO/UART 总线:Wishbone简化 授权:Lattice专有 免费用于Lattice器件 适用:状态机替代 低速控制、按键扫描 LatticeMico32 32位 RISC LUT:约1000~2000 EBR:1~2 性能:中,50~100MHz 外设:UART/SPI/I2C 总线:Wishbone标准 授权:Lattice专有 免费用于Lattice器件 适用:中等嵌入式控制 可运行轻量RTOS RISC-V软核 RV32I / RV32IMC LUT:约600~2500 EBR:1~4 性能:中高,100MHz+ 外设:标准中断/调试 总线:AXI/Wishbone 授权:开源/生态 工具链成熟 适用:可移植嵌入式 Linux/RTOS场景 开源软核 PicoRV32 / VexRiscv / SERV LUT:约200~2500 EBR:0~4 性能:可配置,跨度大 外设:需自行集成 总线:Wishbone/AXI 授权:MIT/BSD等 可商用、可修改 适用:定制化、低成本 面积敏感型设计 选型原则:先定外设与工具链,再定性能,最后用资源占用做收敛

二、资源、性能与外设的权衡方法

资源占用不能只看LUT数量。软核系统还包括指令存储器、数据存储器、总线互连和外设控制器。以LatticeMico32为例,若使用片上EBR做指令和数据存储,每1KB存储约消耗0.5~1个EBR(具体取决于器件系列和位宽配置)。若外设较多,Wishbone互连本身也会消耗数百个LUT。因此,评估时应把“核+存储+总线+外设”作为一个整体估算。

性能方面,软核的时钟频率受限于FPGA逻辑延迟和布线。LatticeMico8通常可跑到50MHz以下;LatticeMico32在无缓存时约50~80MHz,加指令缓存后可接近100MHz;RISC-V核在Lattice Nexus或ECP5上,RV32I约80~120MHz,RV32IMC约60~100MHz。需要注意的是,MHz不等于有效算力,还要看CPI(每指令周期数)。三态流水线的Mico32在分支跳转时会有流水线停顿,而VexRiscv可配置五级流水线,分支预测开启后CPI更接近1。

外设接口决定了软件开发的便利性。LatticeMico32和官方RISC-V核通常自带UART、SPI、I2C、GPIO、定时器、中断控制器等IP,可直接在IP Express或Clarity Designer中勾选生成。开源核往往只提供CPU核和总线接口,外设需要从开源社区移植或自行编写。如果项目需要快速搭建原型,优先选择外设生态完整的官方核;如果项目对面积和授权有严格要求,开源核更合适。

三、授权方式的实际影响

LatticeMico8和LatticeMico32采用Lattice专有授权,免费用于Lattice FPGA,但不可移植到其他厂商器件,源码开放程度有限。RISC-V软核和开源核通常采用MIT、BSD或Apache等宽松许可证,允许修改、商用和闭源分发,但需要自行承担验证和维护责任。对于产品化项目,授权方式直接影响法律风险和长期维护成本,必须在选型阶段确认。

选型建议:若系统只需简单控制且资源极度紧张,选LatticeMico8或SERV;若需要标准外设和RTOS支持,选LatticeMico32或官方RISC-V核;若需要可移植性和定制化,选PicoRV32或VexRiscv。

四、在Radiant/Diamond中获取并例化软核IP

以LatticeMico32在Diamond中的获取为例,操作路径如下。首先打开Diamond,新建工程并选择目标器件(例如LFE5U-25F)。在Tools菜单中打开Clarity Designer,选择“Create a new Clarity Designer project”。在IP目录中展开“Processors”分类,找到“LatticeMico32”并双击。此时会启动Mico System Builder(MSB),进入图形化配置界面。

在MSB中,首先配置CPU核心参数:选择是否启用乘法器、是否启用指令缓存、缓存大小(例如2KB)、数据缓存大小(例如2KB)。然后从外设库中拖入UART、GPIO、定时器、SPI等外设,并设置基地址和中断号。总线会自动生成Wishbone互连。配置完成后,点击“Generate”生成Verilog源码和约束文件。生成的目录中通常包含:

mico32_system/
├── rtl/
│   ├── mico32_cpu.v
│   ├── mico32_uart.v
│   ├── mico32_gpio.v
│   ├── mico32_timer.v
│   └── mico32_system.v
├── testbench/
│   └── tb_mico32_system.v
└── mico32_system.ld

生成后,在Diamond的File List中右键选择“Add Existing File”,将rtl目录下的所有.v文件加入工程。接着需要编写顶层文件,例化mico32_system模块,并将UART的TX/RX、GPIO端口映射到FPGA引脚。例化代码框架如下:

module top (
    input  wire clk_50m,
    input  wire rst_n,
    output wire uart_tx,
    input  wire uart_rx,
    output wire [7:0] led
);

    mico32_system u_system (
        .clk_i      (clk_50m),
        .rst_i      (~rst_n),
        .uart_tx_o  (uart_tx),
        .uart_rx_i  (uart_rx),
        .gpio_o     (led)
    );

endmodule

若使用Radiant,流程类似但工具入口不同。在Radiant中打开“IP Catalog”,搜索“RISC-V”或“Mico32”,选择对应IP后进入配置向导。Radiant的IP Catalog通常提供更现代的RISC-V核,配置项包括指令集扩展(I/M/C)、调试模块、中断数量、存储器映射等。生成后,Radiant会自动将IP加入工程,并生成对应的约束模板。

例化完成后,需要分配引脚。在Diamond中打开Spreadsheet View,将uart_tx、uart_rx、led等端口分配到实际引脚,并设置IO标准(如LVCMOS33)。时钟引脚需要分配到专用时钟输入引脚,并添加时序约束,例如:

create_clock -name clk_50m -period 20 [get_ports clk_50m]

最后执行综合、映射、布局布线,生成比特流并下载。验证时,可通过UART连接PC,使用串口终端发送字符,观察GPIO输出或回显是否正常。若UART无输出,优先检查时钟频率与波特率分频是否匹配、复位极性是否正确、引脚分配是否与开发板一致。

注意:不同Lattice器件系列支持的软核IP版本不同。ECP5、Nexus系列对RISC-V核支持较好,老款MachXO2可能仅支持Mico8或Mico32。生成IP前务必确认器件系列与IP版本的兼容性。

五、选型检查清单

检查项 确认内容 示例
目标器件 系列、LUT/EBR资源 LFE5U-25F,24K LUT,56 EBR
软核类型 位宽、指令集、流水线 RV32IMC,五级流水线
资源预算 核+存储+总线+外设 约2500 LUT,4 EBR
外设需求 UART/SPI/I2C/GPIO/定时器 UART×1,GPIO×16,Timer×1
工具链 编译器、调试器、IDE GCC + OpenOCD + GDB
授权方式 是否可商用、是否可移植 MIT许可证,可商用
验证方式 仿真、上板、串口回显 UART回显测试

完成上述步骤后,软核IP已经成功例化到工程中,下一步是编写启动代码、链接脚本和中断服务程序,使软核真正运行起来。选型阶段多花时间确认资源、外设和授权,能显著减少后期返工。