title: “SOPC范例程序-跑马灯与LCD” source: “飞凌嵌入式FPGA培训资料” original_path: “/工作相关/FPGA培训资料/FPGA培训_2012_07/sopc实验/SOPC范例程序_DE2_70.pdf” file_size: “1.17 MB” total_pages: 20 author: “飞凌嵌入式技术有限公司” processed_date: “2026-09-20” method: “PDF文本提取(pdf-inspector)” status: “done” tags:

  • fpga
  • nios-ii
  • sopc
  • quartus-ii
  • embedded

SOPC范例程序 - 跑马灯与LCD液晶显示器

一、跑马灯实验

1.1 工程创建

步骤:

  1. 打开Quartus II软件
  2. 选择File → New Project Wizard
  3. 工程命名:runningled,选择工程目录
  4. Family选择:Cyclone II
  5. Available devices选择:EP2C35F672C6(DE2开发板FPGA芯片型号)
  6. 点击Finish完成工程创建

注意:不要使用SOPC Builder的系统名称与工程名相同。

1.2 SOPC系统构建

添加片上RAM

  1. 在SOPC Builder左侧列表选择:Memory and Memory Controllers → On-Chip → On-Chip Memory (RAM or ROM)
  2. 双击添加到系统
  3. 保持默认设置

添加CPU核

  1. 双击Altera SOPC Builder → Nios II Processor
  2. 选择:Nios II/s(standard,最小配置)
  3. Reset Vector和Exception Vector都选择:onchip_men(刚才添加的片上RAM名称)
  4. 保留其他默认设置,点击Finish

添加定时器

  1. 选择:Other → Microcontroller Peripherals → Interval Timer
  2. Period选择:500ms(灯的状态每500ms改变一次)
  3. Preset选择:Simple periodic interrupt

添加IO口控制器

  1. 双击:Other → Microcontroller Peripherals → PIO (Parallel I/O)
  2. 保持默认设置(8个输出IO口,控制8个绿色LED)
  3. 将PIO名称改为:LEDG

地址与IRQ分配

  • 自动分配地址:System → Auto-Assign Base Addresses
  • 自动分配IRQ:System → Auto-Assign IRQs
  • IRQ范围:0-31,数值越小优先级越高

点击Generate生成系统。

1.3 硬件电路设计

步骤:

  1. 回到Quartus II,选择File → New → Block Diagram/Schematic File
  2. 双击空白处,选择Project → smallest,添加SOPC系统元件
  3. 添加输入端口:
    • iCLK_50:50MHz晶振
    • iKEY[0]:KEY0按钮(低电平有效)
  4. 添加输出端口:oLEDG[7..0](8个绿色LED)
  5. 连接各信号

注意:SOPC系统复位信号为低电平有效,按键按下为低电平。

导入管脚定义文件:Assignments → Import Assignments,选择DE2开发板默认配置文件。

保存顶层图为runningled.bdf,编译并烧写。

1.4 软件设计

步骤:

  1. 打开Nios II IDE
  2. File → Switch Workspace,选择工程所在目录的\software
  3. File → New → Nios II C/C++ Application
  4. 选择Blank Project,Name使用默认blank_project_0
  5. SOPC Builder System PTF File使用默认设置
  6. 选择Create a new system library

配置工程属性:

  1. Window → Preferences → Run/Debug → Launching
  2. 取消”Build (if required) before launching”
  3. 右键blank_project_0 → Properties → C/C++ Make Project
  4. 选中Build(Incremental Build),取消Project References所有勾
  5. 同样配置blank_project_0_syslib
  6. System Library选项卡:
    • 取消Clean Exit和Support C++
    • 选中Program never exits
    • 选中Reduce device drivers和Small C library

编译系统库:右键blank_project_0_syslib → Build Project

编写main.c:

// For FPGA project: runningled
// SOPC System: smallest
#include "system.h"
#include <sys/alt_irq.h>
#include "alt_types.h"
#include <io.h>
 
// Internal Timer Overflow interrupt
static void timer_overflow(void* context, alt_u32 id)
{
    IOWR(TIMER_BASE,0,0);
    if (*(alt_u8 *)context & 0x80)
    {
        *(alt_u8 *)context = 0x01;
    }
    else
    {
        *(alt_u8 *)context = *(alt_u8 *)context << 1;
    }
    IOWR(LEDG_BASE,0,*(alt_u8 *)context);
    return;
}
 
int main()
{
    alt_u8 led = 0x01;
    // Register Interrupt Service Routine (ISR)
    alt_irq_register(TIMER_IRQ, (void*)&led, timer_overflow);
    while(1);
}

编译并运行:Run → Run → 选择Nios II Hardware → Run

结果:8个LED灯轮流点亮。

二、LCD液晶显示器实验

2.1 工程创建

工程命名:hello_lcd,其余步骤同上。

2.2 SOPC系统构建

系统名称:lcd_sys,语言选择Verilog

组件:

  1. 片上RAM:选择100k容量(比普通跑马灯实验更大)
  2. CPU核:Nios II/e(economy,最小配置)
    • Reset Vector和Exception Vector设为onchip_men
  3. LCD模块:Peripherals → Display → Character LCD

完成后生成系统。

2.3 硬件电路设计

  1. 新建Block Diagram/Schematic File
  2. 添加系统元件:lcd_sys
  3. 添加输入端口(2个)和输出端口
  4. 注意:LCD和SRAM数据线需要使用双向IO口(bidir)
  5. 添加输出IO口:LCD_ON(置高打开LCD显示屏)
  6. 导入DE2开发板管脚定义文件
  7. 保存为hello_lcd.bdf,编译烧写

2.4 软件设计

步骤:

  1. 打开Nios II IDE,切换Workspace
  2. File → New → Nios II C/C++ Application
  3. 选择Hello World模板
  4. 创建新系统库

配置工程属性:

  1. 取消”Build before launching”
  2. 配置C/C++ Make Project属性
  3. System Library选项卡:
    • 选中Clean exit (flush buffers)
    • stderr、stdout、stdin都选为lcd

编译并运行。

注意:开发板液晶显示器每行只能显示16个字符,因此”Hello from Nios II!”只能显示前16个字符”Hello from Nios “。

关键技术要点

Nios II中断服务

  • 使用alt_irq_register()注册中断服务程序
  • 中断服务程序原型:void func(void* context, alt_u32 id)
  • TIMER_BASE和LEDG_BASE由SOPC系统自动生成

IO操作

  • IOWR(BASE, OFFSET, VALUE):写操作
  • IORD(BASE, OFFSET):读操作

系统库配置优化

  • Reduce device drivers:减少驱动体积
  • Small C library:使用精简C库
  • Program never exits:程序永不退出

LCD配置

  • Character LCD模块用于显示文本
  • 需要配置标准I/O重定向到LCD
  • 注意显示字符限制(16字符/行)