C2H编译器与自定义指令实验说明

概述

本文档是关于Altera FPGA平台(DE2_70开发板,Cyclone II EP2C70芯片)上Nios II处理器的两个实验教程:

  1. C2H Compiler实验 - 使用硬件加速器加速C代码中的函数
  2. 自定义指令(Custom Instruction)实验 - 添加浮点运算自定义指令

实验一:C2H编译器加速

原理

C2H (C-to-Hardware) 编译器可以将C语言中的特定函数编译为硬件加速器,部署到FPGA中运行,从而大幅提高执行速度。

步骤概要

  1. 创建SOPC系统

    • 使用SOPC Builder添加:On-Chip Memory、Nios II/e处理器、PIO(宽度16,重命名为ledr)
    • 设置Reset Vector和Exception Vector为onchip_mem
    • Auto-Assign Base Addresses后Generate系统
  2. 创建Block Diagram

    • 添加SOPC系统、iCLK_50(input)、iKEY[0](input)、oLEDR[15..0](output)
    • 导入DE2_70引脚配置文件
  3. 编写C程序

    // LED流水灯 + delay()函数
    while(1) {
        if(led & 0x8001) dir = (dir ^ 0x1);
        if(dir) led = led >> 1; else led = led << 1;
        IOWR_ALTERA_AVALON_PIO_DATA(LEDR_BASE, led);
        delay();
    }
  4. 使用C2H加速

    • 右键delay()函数 → Accelerate with C2H Compiler
    • 勾选:
      • Use hardware accelerator in place of software implementation
      • Flush data cache before each call
    • 重新编译并下载运行,LED闪烁速度明显加快

实验二:自定义指令(浮点运算)

原理

Nios II支持自定义指令扩展,可以通过SOPC Builder添加Altera提供的浮点运算硬件模块(Floating Point Hardware),实现高效的浮点四则运算。

步骤概要

  1. SOPC配置

    • 在Nios II Processor的Custom Instruction选项卡中,添加Floating Point Hardware
    • 选中Using floating point division hardware
  2. 测试程序

    // 不使用自定义指令时(注释掉#pragma行)
    #pragma no_custom_fmuls
    #pragma no_custom_fadds
    #pragma no_custom_fsubs
    #pragma no_custom_fdivs
     
    void delay(void) {
        float a=2008.620, b=123.45678, z=0;
        for(i=0; i<5000; i++) {
            z += a*146.134761f/b;
            a++;
        }
    }
  3. 效果对比

    • 禁用自定义指令:LED闪烁慢(软件浮点运算)
    • 启用自定义指令(删除#pragma行):LED闪烁明显加快(硬件浮点运算)

关键知识点

概念说明
SOPC BuilderAltera片上系统构建工具,用于配置Nios II处理器和外设
C2H Compiler将C函数编译为FPGA硬件加速器
Custom InstructionNios II处理器扩展指令集,可自定义硬件功能
On-Chip MemoryFPGA内部的RAM/ROM,用作处理器内存
Altera_avalon_pio_regs.hPIO外设寄存器头文件

应用关联