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 工程创建
步骤:
- 打开Quartus II软件
- 选择File → New Project Wizard
- 工程命名:
runningled,选择工程目录 - Family选择:Cyclone II
- Available devices选择:EP2C35F672C6(DE2开发板FPGA芯片型号)
- 点击Finish完成工程创建
注意:不要使用SOPC Builder的系统名称与工程名相同。
1.2 SOPC系统构建
添加片上RAM
- 在SOPC Builder左侧列表选择:Memory and Memory Controllers → On-Chip → On-Chip Memory (RAM or ROM)
- 双击添加到系统
- 保持默认设置
添加CPU核
- 双击Altera SOPC Builder → Nios II Processor
- 选择:Nios II/s(standard,最小配置)
- Reset Vector和Exception Vector都选择:
onchip_men(刚才添加的片上RAM名称) - 保留其他默认设置,点击Finish
添加定时器
- 选择:Other → Microcontroller Peripherals → Interval Timer
- Period选择:500ms(灯的状态每500ms改变一次)
- Preset选择:Simple periodic interrupt
添加IO口控制器
- 双击:Other → Microcontroller Peripherals → PIO (Parallel I/O)
- 保持默认设置(8个输出IO口,控制8个绿色LED)
- 将PIO名称改为:LEDG
地址与IRQ分配
- 自动分配地址:System → Auto-Assign Base Addresses
- 自动分配IRQ:System → Auto-Assign IRQs
- IRQ范围:0-31,数值越小优先级越高
点击Generate生成系统。
1.3 硬件电路设计
步骤:
- 回到Quartus II,选择File → New → Block Diagram/Schematic File
- 双击空白处,选择Project → smallest,添加SOPC系统元件
- 添加输入端口:
iCLK_50:50MHz晶振iKEY[0]:KEY0按钮(低电平有效)
- 添加输出端口:
oLEDG[7..0](8个绿色LED) - 连接各信号
注意:SOPC系统复位信号为低电平有效,按键按下为低电平。
导入管脚定义文件:Assignments → Import Assignments,选择DE2开发板默认配置文件。
保存顶层图为runningled.bdf,编译并烧写。
1.4 软件设计
步骤:
- 打开Nios II IDE
- File → Switch Workspace,选择工程所在目录的\software
- File → New → Nios II C/C++ Application
- 选择Blank Project,Name使用默认blank_project_0
- SOPC Builder System PTF File使用默认设置
- 选择Create a new system library
配置工程属性:
- Window → Preferences → Run/Debug → Launching
- 取消”Build (if required) before launching”
- 右键blank_project_0 → Properties → C/C++ Make Project
- 选中Build(Incremental Build),取消Project References所有勾
- 同样配置blank_project_0_syslib
- 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
组件:
- 片上RAM:选择100k容量(比普通跑马灯实验更大)
- CPU核:Nios II/e(economy,最小配置)
- Reset Vector和Exception Vector设为
onchip_men
- Reset Vector和Exception Vector设为
- LCD模块:Peripherals → Display → Character LCD
完成后生成系统。
2.3 硬件电路设计
- 新建Block Diagram/Schematic File
- 添加系统元件:lcd_sys
- 添加输入端口(2个)和输出端口
- 注意:LCD和SRAM数据线需要使用双向IO口(bidir)
- 添加输出IO口:
LCD_ON(置高打开LCD显示屏) - 导入DE2开发板管脚定义文件
- 保存为
hello_lcd.bdf,编译烧写
2.4 软件设计
步骤:
- 打开Nios II IDE,切换Workspace
- File → New → Nios II C/C++ Application
- 选择Hello World模板
- 创建新系统库
配置工程属性:
- 取消”Build before launching”
- 配置C/C++ Make Project属性
- 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字符/行)