1.建立Quartus工程
2.建立顶层文件
3.打开Qsys
-
双击clk_0
-
设置系统时钟(外部时钟为50M,这里利用PLL进行倍频)
-
搜索nios的ip
-
添加Nios_II的ip(双击)
-
设置版本(EP4CE10可以用Fast,资源够用)
-
点击完成即成功添加了Nios_II
-
添加内存(搜索SDRAM),双击添加
-
进入设置页面,设置SDRAM为16位位宽,列为9
-
.添加串口UART
-
配置串口
-
添加外设(PIO)并配置
-
连接总线,设置中断优先级
-
设置复位向量
-
配置地址基地址
-
处理错误和警告(导出端口)
-
复制模块
-
产生HDL文件
4. 列化模块
module CoreCourse_GHRD(
input wire clk50m, // clk.clk
input wire reset_n, // reset.reset_n
output wire [11:0] sdram_addr, // sdram.addr
output wire [1:0] sdram_ba, // .ba
output wire sdram_cas_n, // .cas_n
output wire sdram_cke, // .cke
output wire sdram_clk, // .clk
output wire sdram_cs_n, // .cs_n
inout wire [15:0] sdram_dq, // .dq
output wire [1:0] sdram_dqm, // .dqm
output wire sdram_ras_n, // .ras_n
output wire sdram_we_n, // .we_n
input wire uart_0_rxd, // uart_0.rxd
output wire uart_0_txd, // .txd
output wire [3:0] led, // led.export
input wire [1:0] key // key.export
);
wire nios_clk;
wire nios_reset;
pll pll(
.areset(~reset_n), //pll是高电平复位,低电平处于工作状态,所以要取反
.inclk0(clk50m), //系统输入时钟50M
.c0(nios_clk), //系统工作时钟100M
.c1(sdram_clk), //SDRAM偏移时钟
.locked(nios_reset) //PLL稳定输出指示信号 PLL稳定时为高电平,不稳定为低电平,可以用作系统的复位信号
);
mysystem u0 (
.clk_clk (nios_clk), // clk.clk
.reset_reset_n (nios_reset), // reset.reset_n
.sdram_addr (sdram_addr), // sdram.addr
.sdram_ba (sdram_ba), // .ba
.sdram_cas_n (sdram_cas_n), // .cas_n
.sdram_cke (sdram_cke), // .cke
.sdram_cs_n (sdram_cs_n), // .cs_n
.sdram_dq (sdram_dq), // .dq
.sdram_dqm (sdram_dqm), // .dqm
.sdram_ras_n (sdram_ras_n), // .ras_n
.sdram_we_n (sdram_we_n), // .we_n
.uart_0_rxd (uart_0_rxd), // uart_0.rxd
.uart_0_txd (uart_0_txd), // .txd
.led_export (led), // led.export
.key_export (key) // key.export
);
endmodule
5.配置引脚
6.打开Elips
7.创建Eclipse工程
File —> New —> Nios II Application and Bsp from Template
C代码编写——按键控制LED等
//简单延时函数
void delay_us(int i)
{
while(i--);
}
//主函数
int main()
{
int key = 0;
IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,0x0);//初始化LED
while(1)
{
key = IORD_ALTERA_AVALON_PIO_DATA(KEY_BASE);//读按键值
if(key == 0x1)
{
delay_us(200);
if(key == 0x1)
IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,0xf);//KEY1按下LED灭
}
else if(key == 0x2)
{
delay_us(200);
if(key == 0x2)
IOWR_ALTERA_AVALON_PIO_DATA(LED_BASE,0x0);//KEY2按下LED亮
}
}
return 0;
}
编译运行就OK,先下载sof文件到FPGA中,再下载Eclipse中C代码编译产生的elf文件