本身经过学习NIOS,主要学习NIOS中PIO控制,主要实现一个按键控制LED灯亮和灭,按键控制部分采用中断方式,由于只是简单学习PIO控制,因此按键部分没有作相关消抖处理,实际中按键控制没那么完美,还需完善。 编程
下面先讲述步骤,先在Quartus中新建一个Qsys文件,在文件中添加以下对应模块(图中注意要将NIOS processor的jtag_debug_module_reset这个复位信号链接到RAM和epcs的reset信号上,不然会在烧写epcs时候出问题):学习
其中,要注意的选项是对应将epcs的基地址设置为0x00,而且锁定。在链接好后,Generate,等success后,进入到NIOS编程了,至于如何创建NIOS工程,这里就不说了,下面是个人NIOS程序:debug
#include <system.h>
#include <altera_avalon_pio_regs.h>
#include <alt_types.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/alt_irq.h>
#include <io.h>3d
void delay(void);调试
alt_u8 SW_value;blog
static void handle_sw_interrupts(void)
{
SW_value = IORD_ALTERA_AVALON_PIO_DATA(SW_PIO_BASE);
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(SW_PIO_BASE,0x00);
}avalon
//初始化 SW_PIO
void init_SW(void)
{
SW_value = 0xff;
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(SW_PIO_BASE,0xff); //使能PIO中断
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(SW_PIO_BASE,0x00); //对EDGE_REGISTER清零
alt_irq_register(SW_PIO_IRQ,SW_PIO_BASE,handle_sw_interrupts);
}it
int main()
{
alt_u8 timer = 0x00;
init_SW();io
while(1)
{
if((SW_value&0x0F) == 0x0E)
{
printf("hello,LED0! %d\n",timer);
IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,0xfE);
delay();
timer++;
}
else if((SW_value&0x0F) == 0x0D)
{
printf("hello,LED1! %d\n",timer);
IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,0xfd);
delay();
timer++;
}
else if((SW_value&0x0F) == 0x0B)
{
printf("hello,LED2! %d\n",timer);
IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,0xfB);
delay();
timer++;
}
else if((SW_value&0x0f) == 0x07)
{
printf("hello,LED3! %d\n",timer);
IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,0xf7);
delay();
timer++;
}
else if(SW_value==0xff)
{
IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,0xfF);
}
}
return 0;
}module
void delay(void)
{
alt_u32 i=0;
while(i<400000)
i++;
}
在练习NIOS中(采用Quartus II 13.0版本),碰到一个问题:在用NIOS中,若是采用调试模式,烧写sof和elf文件分开烧写发现是能够的,可是采用NIOS Flash Programmer烧写就发现问题,(在烧写前先要下载sof文件进去,而后点开NIOS Flash Programmer,在界面下点击new file界面烧写,添加sof和elf文件进去)没法烧写成功。错误以下:
后来将sys_id去除,问题解决,因此这里就奇怪,Altera官方是推荐用sys_id的,但是sys_id又影响NIOS下载,这里不了解,还望有人帮我解释下。