You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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工程创建步骤

  1. 打开Quartus II自带的Nios II Software Build Tools for Eclipse,选择无中文、无空格的本地路径作为工作空间
  2. 新建工程选择Nios II Application and BSP from Template,选中Qsys生成的.sopcinfo文件,工程模板选择Hello World Small,工具链会自动生成对应BSP包,完成所有外设寄存器地址映射
  3. 打开工程下的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系统设计:
    Qsys Design
  • Nios II Eclipse开发界面:
    Eclipse IDE

内容的提问来源于stack exchange,提问作者Elyouss

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 15:06:21