Altera DE0板NiosII处理器GPIO延迟输出C程序编写求助
DE0开发板Nios II实现GPIO移位延迟时钟输出操作指南
前置校验(已完成Qsys设计需确认)
- Qsys中挂载的输入/输出PIO核已经配置为对应方向:输入PIO接外部时钟输入引脚,输出PIO接示波器观测引脚,所有引脚在Quartus顶层分配器中绑定到DE0板上的物理引脚,IO电平标准设置为3.3V LVTTL
- Qsys中Nios II处理器的复位向量、异常向量已经指向挂载的片上RAM/Flash,系统生成后完成Quartus全编译,已将SOF固件烧写到开发板
- Nios II软核主频建议设置为50MHz及以上,若输入时钟频率高于5MHz,优先选择硬件移位寄存器打拍实现延迟,软件轮询会存在采样丢沿、延迟抖动问题
Eclipse工程创建步骤
- 打开Quartus II自带的Nios II Software Build Tools for Eclipse,选择无中文、无空格的本地路径作为工作空间
- 新建工程选择
Nios II Application and BSP from Template,选中Qsys生成的.sopcinfo文件,工程模板选择Hello World Small,工具链会自动生成对应BSP包,完成所有外设寄存器地址映射 - 打开工程下的
hello_world_small.c文件,替换为后续给出的功能代码即可
核心功能C代码实现
代码实现逻辑:通过轮询读取输入PIO的时钟电平,存入软件移位寄存器做移位缓存,延迟指定级数后从输出PIO送出,延迟长度可通过宏定义调整
#include "system.h" #include "altera_avalon_pio_regs.h" // 延迟级数配置:数值越大输出时钟相对输入的延迟越长,最大不超过31 #define DELAY_TAPS 10 int main(void) { unsigned int shift_reg = 0; unsigned int clk_in_level = 0; while (1) { // 读取外部输入时钟引脚电平 clk_in_level = IORD_ALTERA_AVALON_PIO_DATA(EXT_CLK_IN_BASE) & 0x01; // 移位缓存左移,新采样值写入最低位 shift_reg = (shift_reg << 1) | clk_in_level; // 输出延迟指定级数后的电平 IOWR_ALTERA_AVALON_PIO_DATA(DELAY_CLK_OUT_BASE, (shift_reg >> DELAY_TAPS) & 0x01); } return 0; }
调试常见问题处理
- 编译提示外设基地址未定义:打开BSP工程下的
system.h文件,查找对应输入、输出PIO的基地址宏,宏名规则为Qsys中PIO组件名全大写加_BASE,替换代码中对应宏名即可 - 下载程序时扫描不到Nios核:确认USB Blaster驱动安装正常,开发板已上电,Quartus中的Programmer已识别到器件,SOF固件已烧写
- 示波器观测到输出抖动大、沿丢失:降低输入时钟频率,或改用Qsys中硬件移位寄存器IP实现固定打拍延迟,绕过Nios软件轮询
- 延迟长度不符合预期:直接调整
DELAY_TAPS的数值重新编译下载即可,每增加1个tap,延迟约增加1个Nios内核指令周期
参考设计截图
- 已完成的Qsys系统设计:

- Nios II Eclipse开发界面:

内容的提问来源于stack exchange,提问作者Elyouss
相关产品推荐
相关产品推荐

