C2H编译器与自定义指令实验说明
概述
本文档是关于Altera FPGA平台(DE2_70开发板,Cyclone II EP2C70芯片)上Nios II处理器的两个实验教程:
- C2H Compiler实验 - 使用硬件加速器加速C代码中的函数
- 自定义指令(Custom Instruction)实验 - 添加浮点运算自定义指令
实验一:C2H编译器加速
原理
C2H (C-to-Hardware) 编译器可以将C语言中的特定函数编译为硬件加速器,部署到FPGA中运行,从而大幅提高执行速度。
步骤概要
-
创建SOPC系统
- 使用SOPC Builder添加:On-Chip Memory、Nios II/e处理器、PIO(宽度16,重命名为ledr)
- 设置Reset Vector和Exception Vector为onchip_mem
- Auto-Assign Base Addresses后Generate系统
-
创建Block Diagram
- 添加SOPC系统、iCLK_50(input)、iKEY[0](input)、oLEDR[15..0](output)
- 导入DE2_70引脚配置文件
-
编写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(); } -
使用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),实现高效的浮点四则运算。
步骤概要
-
SOPC配置
- 在Nios II Processor的Custom Instruction选项卡中,添加Floating Point Hardware
- 选中Using floating point division hardware
-
测试程序
// 不使用自定义指令时(注释掉#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++; } } -
效果对比
- 禁用自定义指令:LED闪烁慢(软件浮点运算)
- 启用自定义指令(删除#pragma行):LED闪烁明显加快(硬件浮点运算)
关键知识点
| 概念 | 说明 |
|---|---|
| SOPC Builder | Altera片上系统构建工具,用于配置Nios II处理器和外设 |
| C2H Compiler | 将C函数编译为FPGA硬件加速器 |
| Custom Instruction | Nios II处理器扩展指令集,可自定义硬件功能 |
| On-Chip Memory | FPGA内部的RAM/ROM,用作处理器内存 |
| Altera_avalon_pio_regs.h | PIO外设寄存器头文件 |
应用关联
- FPGA培训课表 - FPGA培训系列课程的一部分
- i.MX Yocto Project用户指南 - 嵌入式开发手册
- LVDS屏幕移植应用笔记-飞凌OKMX6DLQ - 飞凌嵌入式开发板移植经验