基于Nios-II实现流水灯
文章目录
1.新建项目,选择芯片
2.osys设计
2.1 进入Tools -> Platform Designer
进入后,首先点击File -> Save ,保存为Kernel.qsys。
2.2 设置时钟主频
这里设置为50MHz,与所选芯片的时钟保持一致。
2.3 添加Nios-II Processor并设置
左边的IP Catalog中,选择Nios-II Processor,并点击Add添加。
在 Nios Core 栏中选择 Nios II/f 选项,其他保持默认选项,如下图所示
在”Caches and Memory Interfaces”标签栏中保持默认设置(Instruction Cache 选择
4Kbytes)。
在”Advanced Features”标签栏中保持默认设置,
在”MMU and MPU Settings”标签栏中保持默认设置,
在”JTAG Debug Module”标签栏中保持默认设置(注意勾选 Include JTAG Debug),
点击 Finish 回到 PD 界面。
将 nios2_qsys_0 重命名为 cpu,点击”Rename”即可重新命名,操作完成后如下图所示。
将 cpu 的 clk 和 reset 分别与系统时钟 clk_0 的 clk 和 clk_reset 相连,如图所示。
2.4 添加JTAG并配置
左边选择JTAG_UART_Intel_FPGA_IP,点击Add。
右键重命名为uart,并按图进行时钟线,复位线,数据线的连接:
同时还要连接中断
2.5 添加RAM
选择On-Chip Memory (RAM or ROM) Intel FPGA,点击Add加入。
更改名字并连线
2.6 添加PIO
连接clk,reset,s1并导出输出端口:
这里将输出命名为out_led
2.7 添加System ID Peripheral
进行连接
2.8 其他设置
基地址分配:点击 PD 主界面菜单栏中的”System”下的”Assign Base Addresses”。
分配中断号:在”IRQ”标签栏下点选”Avalon_jtag_slave”和 IRQ 的连接点就会为”jtag_uart”核添加一个值为 0 的中断号。
指定 NIos II 的复位和异常地址:从”System Contents”标签栏
双击建立好的 cpu 进入 Nios II Processor 的配置界面,配置 Reset Vector 和 Exception Vector 为””onchip_ram.s1”,点击 Finish。
点击 Qsys 主界面菜单栏中的”System”下的”Create Global Reset Network”。完成后会自动连接所有复位端口。
生成HDL
原理图:
3.Quartus设计
3.1 添加原理图文件
返回到Quartus页面,新建原理图文件:
双击空白处,加入生成的bsf文件:
右键生成IO端口
将管脚”inclk0”改名为 clock,管脚”reset_reset_n”改名为 reset_n,管脚 out_led_export[7…0]改为 out_led[7…0]
3.2芯片引脚设置
(1)菜单里选择 Assignments-device,然后如下图所示点击 Device pin options。
(2)进行 unused pin 设置,可能会收到外部信号的干扰,将未用引脚设置为 As input tri-stated。
3.3编译
回到 Quartus II 主界面后编译项目。如下图所示,编译成功后,点击 OK 完成。
点击下图所指快捷键进入 Pin Planner 界面,按照开发板提供的管脚名称分配针脚,下图所示:
完成后再次编译
4.软件部分设计
4.1.启动 Nios II SBT
tool->Nios II Software Build Tools for Eclipse
出现 Nios II SBT for Eclipse 主界面
4.2创建工程
建立新工程
在”SOPC Information File name”窗口中选择 kernel.sopcinfo 文件,以便将生成硬件配置信息和软件应用关联,CPU 栏会自动选择”CPU,点击finish
出现问题
回到Platform Designer,将on-chip ram的指令线也连上
4.3修改程序
在 hell_word.c 里修改流水灯控制程序。
#include "system.h"
#include "altera_avalon_pio_regs.h"
#include "alt_types.h"
const alt_u8
led_data[8]={0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF};
int main (void)
{
int count=0;
alt_u8 led;
volatile int i;
while (1)
{ if (count==7)
{count=0;}
else
{count++;}
led=led_data[count];
IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led);
i = 0;
while (i<500000)
i++;
}
return 0;
}
编译工程
右键单击项目名称,在弹出的菜单中选择 Build Project
5.运行项目
启动 Quartus Prime Programmer并将sof文件烧录到板子
运行/调式程序
配置 Run Configurations,转到”Target Connection”标签栏,点击右侧的 Refresh Connections 将 USB-Blaster 加入
Apply 后,Run。下载完成后,可以看见 Console 里打印信息“hello from Nios
II!”(第一段代码实现)
流水灯实现:
video_20240508_164138
基于Verilog实现流水灯
1.Verilog代码撰写
module led #(parameter TIME_1_5s=75_000_000)(
input clk,
input rst_n,
output reg [3:0] led
);
//parameter TIME_1_5s=75_000_000;
reg [2:0] cnt;
reg [26:0] cnt_1;
wire add_cnt1;
wire end_cnt1;
wire add_cnt;
wire end_cnt;
always @(posedge clk or negedge rst_n)begin
if(!rst_n)begin
cnt_1<=27'b0;
end
else if(add_cnt1)begin
if(end_cnt1)begin
cnt_1<=1'b0;
end
else begin
cnt_1<=cnt_1+1'b1;
end
end
else begin
cnt_1<=cnt_1;
end
end
assign add_cnt1=1'b1;
assign end_cnt1=add_cnt1&&cnt_1 ==TIME_1_5s-1;
// always @(posedge clk or negedge rst_n)begin
// if(!rst_n)begin
// led<=4'b0001;
// end
// else if(end_cnt1)begin
// led<={led[2:0],led[3]};
// end
// else begin
// led<=led;
// end
// end
always @(posedge clk or negedge rst_n)begin
if(!rst_n)begin
cnt<=1'b0;
end
else if(add_cnt)begin
if(end_cnt)begin
cnt<=1'b0;
end
else begin
cnt<=cnt+1'b1;
end
end
else begin
cnt<=cnt;
end
end
assign add_cnt=end_cnt1;
assign end_cnt=add_cnt&&cnt==7;
always @(posedge clk or negedge rst_n)begin
if(!rst_n)begin
led<=4'b1111;
end
else begin
if(cnt==3'b000)begin
led<=4'b0001;
end
else if(cnt==3'b001)begin
led<=4'b0011;
end
else if(cnt==3'b010)begin
led<=4'b0111;
end
else if(cnt==3'b011)begin
led<=4'b1111;
end
else if(cnt==3'b100)begin
led<=4'b1110;
end
else if(cnt==3'b101)begin
led<=4'b1100;
end
else if(cnt==3'b110)begin
led<=4'b1000;
end
else if(cnt==3'b111)begin
led<=4'b0000;
end
else begin
led<=4'b1111;
end
end
end
endmodule
2.引脚绑定
3.烧录,运行
结果
video_20240508_170124
总结
本次实验通过实践收获了以下几个要点:
了解掌握了nios基本原理及作用
了解掌握了nios的简单使用方法及流程
掌握了eclips进行nios的编程
解决了编译NIOS2出现错误:make:[.mk] Error 1 或者 make: *** [*.elf] Error 1 解决方法见参考
学习 Quartus Prime 、Platform Designer、Nios II SBT 的基本操作;
初步了解 SOPC 的开发流程,基本掌握 Nios II 软核的定制方法;
掌握 Nios II 软件的开发流程,软件的基本调式方法
并了解到nios与verilog之间的区别