基于NIOS-II软核与verilog语言的流水灯实现

2023-05-16

基于NIOS-II软核与verilog语言的流水灯实现


文章目录

  • 基于NIOS-II软核与verilog语言的流水灯实现
    • 1.实验目的
    • 2.实验设备
    • 3.实验内容
    • 4.软核设计
      • 4.1 新建一个工程
      • 4.2 Qsys 系统设计
      • 4.3 进行逻辑连接
        • 4.3.1 在 Quartus-II 中新建一个原理图
        • 4.3.2 进行逻辑连接和生成管脚
        • 4.3.3 编译
        • 4.3.4 绑定引脚
    • 5. 软件设计
      • 5.1 创建工程
      • 5.2 代码
      • 5.3 编译
    • 6. 烧录
    • 7. verilog语言实现流水灯
    • 8.总结
    • 9.参考文章


1.实验目的

(1)学习 Quartus Prime 、Platform Designer、Nios II SBT 的基本操作;
(2)初步了解 SOPC 的开发流程,基本掌握 Nios II 软核的定制方法;
(3)掌握 Nios II 软件的开发流程,软件的基本调式方法。

2.实验设备

硬件:PC 机、DE2-115 FPGA 实验开发平台;
软件:Quartus Prime 18.1、Platform Designer、Nios II SBT

3.实验内容

使用 FPGA 资源搭建一个简单 Nios II 处理器系统,具体包括:
(1) 在 Quartus Prime 中建立一个工程;
(2) 使用 PD 建立并生成一个简单的基于 Nios II 的硬件系统;
(3) 在 Quartus Prime 工程中编译基于 Nios II 的硬件系统并生成配置文件.sof;
(4) 在 Nios II SBT 中建立对应硬件系统的用户 C/C++工程,编写一简单用户程序,在
Nios II SBT 中编译程序生成可执行文件.elf;
(5) 将配置文件.sof 和可执行文件.elf 都下载到 FPGA 进行调试运行。

4.软核设计

4.1 新建一个工程

选择目标芯片:cycloneIVE系列的EP4CE11529C7,这里根据自己板子的芯片型号选择即可

4.2 Qsys 系统设计

1.点击 Tools 下拉菜单下的 platform designer
在这里插入图片描述
2. 启动 Qsys 后,点击 File —> save,如图 1.7 所示,在文件名中填写为 kernel,后点击 OK
在这里插入图片描述
3.鼠标放在 clk_0 处点击右键 Edit 或是双击 clk_0 元件,对 Clock 进行时钟设置,设为为 50M
在这里插入图片描述
4.添加 CPU 和外围器件
添加 Nios II 32-bit CPU

  • 在 “component library” 标签栏中找到 “Nios II Processor” 后点击 Add
    -在这里插入图片描述

  • 在 Nios Core 栏中选择 Nios II/f 选项,其他保持默认选项
    -在这里插入图片描述

  • 在 ”Caches and Memory Interfaces” 标签栏中保持默认设置 (Instruction Cache 选择
    4Kbytes)

在这里插入图片描述

  • 点击 Finish 回到 Qsys 界面 将 nios2_qsys_0 重命名为 cpu,点击 ”Rename” 即可重新命名
  • 将 cpu 的 clk 和 reste_n 分别与系统时钟 clk_0 的 clk 和 clk_reset 相连

在这里插入图片描述
在这里插入图片描述
添加 jtag uart 接口
jtag uart 接口是 Nios II 嵌入式处理器新添加的接口元件,通过内嵌在 Intel FPGA 内部的 JTAG 电路,可以实现在 PC 主机与 Qsys 系统之间进行串行字符流通信。

  • 在 ”Component Library” 标签栏中的查找窗口输入 jtag 找到 ”JTAG UART ”,然后点击 Add
    在这里插入图片描述

  • 在 JTAG UART-jtag-uart_0 的设置向导中保持默认选项,点击 Finish
    在这里插入图片描述

  • 返回 ”System Contents” 标签栏可以看到新加入的 ”JTAG UART” 核。在 ”Name” 列中将
    jtag-uart_0 重命名为 jtag-uart。

  • 返回 ”System Contents” 标签栏可以看到新加入的 ”JTAG UART” 核。在 ”Name” 列中将
    jtag-uart_0 重命名为 jtag-uart。

在这里插入图片描述
添加片上存储器 On-Chip Memory(RAM)核

  • 在左侧 ”Component Library” 标签栏中的查找窗口输入 On Chip 找到 ”On-Chip
    Memory(RAM or ROM)” 后点击 Add
    在这里插入图片描述
  • 在 ”Size” 栏中的 ”Total memory size” 窗口中输入 40960(即片上内存的大小为 40KB),其余选项保持默认,点击 Finish。

在这里插入图片描述

  • 返回 ”System Contents” 标签栏可以看到新加入的 ”On-Chip Memory” 核。在 ”Name”
    列中将 onchip_memory2_0 改名为 onchip_ram

  • 进行时钟、数据端口、指令端口的连接
    在这里插入图片描述
    添加 PIO 接口

  • 在左侧 ”Component Library” 标签栏中的查找窗口输入 pio 找到 ”PIO” 后点击Add
    在这里插入图片描述

  • 确定以下选项:Width 为 8bits,Direction 选择 output,其余选项保持默认,点击
    Finish。
    在这里插入图片描述

  • 返回 ”System Contents” 标签栏可以看到新加入的 ”PIO” 核。在 ”Name” 列中将
    pio_0 改名为 pio_led。并在在 Export 栏处双击,把输出口引出来,并命名为 out_led。

  • 进行时钟、数据端口、指令端口的连接
    在这里插入图片描述
    添加片 System ID Peripheral 核

  • 在左侧 ”Component Library” 标签栏中的查找窗口输入 sys 找到 ” System ID
    Peripheral” 后点击 Add
    在这里插入图片描述

  • 保持默认选项,单击 Finish。

  • 返回 ”System Contents” 标签栏可以看到新加入的 ” System ID Peripheral” 核。在 ”Name” 列中将 sysid_qsys_0 改名为 sysid

  • 进行时钟、数据端口的连接
    在这里插入图片描述

  1. 完成 Qsys 设计的后续工作
  • **基地址分配:**点击 Qsys 主界面菜单栏中的 ”System” 下的 ”Assign Base Addresses”。
    在这里插入图片描述
  • 指定 NIos II 的复位和异常地址:选中CPU,单击右键,点击edit 进入 Nios II
    Processor 的配置界面,配置 Reset Vector 和 Exception Vector 为
    ”onchip_ram.s1”,点击 Finish。
    在这里插入图片描述
  • 点击 Qsys 主界面菜单栏中的 ”System” 下的 ”Create Global Reset Network”。完成后会自动连接所有复位端口

在这里插入图片描述

  • **生成 Qsys 系统:**点选 ”Generation HDL” 标签栏中 Generate 按钮生成 Qsys 系统,保存文件
    在这里插入图片描述

4.3 进行逻辑连接

4.3.1 在 Quartus-II 中新建一个原理图

在该原理图(BDF)文件中添加 Qsys 生成的系统符号
在这里插入图片描述
在这里插入图片描述
点击菜单 Project-add/remove files in project,来到如下界面,点击右侧浏览按钮找到如图所示的 qip 文件,选择并点击 add 添加。
在这里插入图片描述

4.3.2 进行逻辑连接和生成管脚

在 kernel 模块内点击鼠标右键选取 Generate Pin for Symbol Ports 生成管脚,然后将管脚命名如下
在这里插入图片描述
菜单里选择 Assignments-device,然后如下图所示点击 Device pin options
在这里插入图片描述
进行 unused pin 设置,可能会收到外部信号的干扰,将未用引脚设置为 As input tri-stated
在这里插入图片描述

4.3.3 编译

在这里插入图片描述

4.3.4 绑定引脚

分配物理针脚,重新编译
在这里插入图片描述

5. 软件设计

使用 Nios II Software Build Tools for Eclipse 来完成当前项目的软件开发
点击 Tools,然后点击 Nios II Software Build Tools for Eclipse 打开 Nios II SBT for Eclipse

在这里插入图片描述
启动 Workspace选择当前的项目目录,点 OK
在这里插入图片描述

5.1 创建工程

在这里插入图片描述
SOPC Information File name 窗口中选择 kernel.sopcinfo 文件,以便将生成硬件配置信息和软件应用关联,CPU 栏会自动选择”CPU”。在 Project name 输入 ”hello_world” ,Project template选择 Hello World

在这里插入图片描述

5.2 代码

hello_world.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++;
		printf("Hello world!\n");
	}
	return 0;
}

5.3 编译

选择hello_wold_bsp,右键后,选择Nios II中的Generate BSP
在这里插入图片描述
右键单击项目名称,在弹出的菜单中选择 Build Project
在这里插入图片描述
在这里插入图片描述

6. 烧录

把开发板接上电源,USB 接口接电脑。打开电源开关(注意不用下载时请一定关闭开关,以免烧坏板子)。点击软件工具栏上的按钮 ,则出现下载界面。第一次下载需安装硬件。即在下载界面中点击按钮“hardware setup…”,然后在弹出的对话框中选择“USBblaster”,再点击“ok”,则硬件被安装上。

安装好硬件后,在output_files中添加相应的下载文件

在这里插入图片描述
运行调试程序
用户将运行程序来观察编译代码的执行,在菜单栏中选择 Run →Run Configurations

在这里插入图片描述
配置 Run Configurations,转到 ”Target Connection” 标签栏,点击右侧的 Refresh
Connections 将 USB-Blaster 加入
在这里插入图片描述
效果:
请添加图片描述
请添加图片描述

7. verilog语言实现流水灯

新建项目

流水灯代码:

module v_lsd (
    input wire 	    clk		,
	input wire	    rst_n	,
	output [7:0]    led
);
    parameter       CNT_MAX = 26'd5000_0000;

    reg [25:0]	    cnt_1s;//1s 计数器,计数最大值 5000_0000 - 1
	wire 		    flag_1s;//计数器每计满1s,使能一个时钟周期
    reg [7:0]	    led_reg;//输出信号的寄存信号
    //1s计数器
	always@(posedge clk or negedge rst_n)begin
		if(!rst_n)
			cnt_1s <= 26'd0;
		else if(cnt_1s >= CNT_MAX - 26'd1) //归零条件
			cnt_1s <= 26'd0;
		else
			cnt_1s <= cnt_1s + 26'd1;
	end
	
	assign flag_1s = cnt_1s >= CNT_MAX - 26'd1;

     //移位实现流水灯
	always@(posedge clk or negedge rst_n)begin
		if(!rst_n)
			led_reg <= 8'b1111_1111;//全灭
		else if(flag_1s)
			if(led_reg == 8'b1111_1111)
				led_reg <= 8'b0000_0001;
			else
				led_reg <= {led_reg[6:0],led_reg[7]};//拼接实现循环移位
		else
			led_reg <= led_reg;
	end

	assign led = led_reg;
endmodule

烧录:
在这里插入图片描述

8.总结

这次试验内容较多,实验的时间比较紧,所以比较仓促,也没有来得及截图,离开实验室后才重新做了一遍,所以有些步骤可能不全,但是通过实验熟悉了NIOS-II软核的基本操作,也对FPGA开发板的外设以及变成有了更进一步的认识.

9.参考文章

https://blog.csdn.net/Mjing11/article/details/116101156

https://blog.csdn.net/xwmrqqq/article/details/115937457?spm=1001.2101.3001.6661.1&depth_1-utm_relevant_index=1

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于NIOS-II软核与verilog语言的流水灯实现 的相关文章

  • 打印存储在 reg 类型变量中的有符号整数值

    如何打印存储在 8 位寄存器中的有符号整数值 声明为 reg 7 0 acc Using display acc d acc 它打印无符号值 正确的语法是什么 display功能 如果您声明reg as signed display将显示减
  • 在verilog中使用for循环生成

    我试图理解为什么我们在verilog 中使用generate 和for 循环 一起使用生成和 for 循环 reg 3 0 temp genvar i generate for i 0 i lt 3 i i 1 begin always p
  • 为什么我的输出没有被赋值?

    我正在为一个更大项目的一部分开发解码器 我有两个计数器充当该模块的输入 其中一个计数器计数 0 15 另一个计数器在第一个计数器达到 15 时递增一次 根据计数器的值 解码器输出不同的值 通常它是 0 1 或 1 但有时它必须是 0 707
  • Quartus Prime 中的“多个常量驱动程序”Verilog 错误

    我正在致力于用 Verilog 设计一个有限状态机来表示堆栈 该模块如下 module state machine s Enable Clock Resetn c OF Err UF Err input 2 0 s input Enable
  • 64 位 ALU 输出在 TestBench 波上显示高阻抗

    我必须制作一个 64 位 ALU 它接受 A 和 B 64 位输入 进位输入输入并输出 64 位结果以及 1 位进位输出 还有一个 5 位功能选择 FS 其中 FS 0 控制 B 是否反转 使用 2to1 多路复用器 F 1 对 A 执行相
  • Verilog HDL 循环语句错误:具有非常量循环条件的循环必须终止

    我对 Verilog 完全陌生 对于我在大学学习的课程 我必须很快了解它的很多内容 我正在摆弄我的 Altera DE2 板和 quartis2 并了解其细节 我正在尝试制作一个通过开关打开和关闭的计数器 到目前为止 计数器根据按键进行计数
  • 如何使用触发器输出作为复位信号的输入

    我在柜台里放了 3D 触发器 一旦达到 5 101 我想将 FF 复位输入设置为高 使用或门 复位为低电平有效 这几乎可以工作 但是 当我最初运行程序时 触发器的 Q 输出都是未知的 因此 最初 或门的复位输入为低电平 但是 因为一开始 Q
  • 使用数据流模型的T触发器

    我正在尝试模拟 t flipflop 的工作 timescale 1ns 1ps module t flipflop input t input clk input clear output q output qbar wire sbar
  • Verilog 中总是后面跟着 #(...) pound 是什么意思?

    在一个简单的时钟生成器示例中 我看到以下代码 always cycle 2 clk clk 我以前总是见过 但没见过井号 我试图在文档中找到它 但我所能找到的只是一些对 实值端口 的引用 没有进一步的阐述 这是一个延迟操作 它本质上只是读取
  • 加载词和移动之间的区别?

    有什么区别 ldw r8 0 r4 and mov r8 r4 Load word 说 从内存复制 但是当 load word 从 r4 复制时 它是从寄存器复制而不是从内存复制 对吧 The lw instruction I assume
  • Verilog 最佳实践 - 递增变量

    我绝不是 Verilog 专家 我想知道是否有人知道这些增加值的方法中哪一种更好 抱歉 如果这个问题太简单了 Way A 在组合逻辑块中 可能在状态机中 some condition count next count 1 然后在一个连续块中
  • 从测试台访问 uvm_config_db 的最佳方式?

    我想在我的顶级测试平台中创建一个时钟 其周期可以通过测试进行控制 我所做的是将周期设置到 uvm config db 中并将其返回到测试台中 我必须输入 1 以确保构建阶段已完成 否则 get 返回错误值 module testbench
  • 我们可以在 C 或 SystemVerilog 中使用 ifdef MACROS 中的条件吗?

    我想要那样的东西 ifdef N O gt N I define GREATER 1 else define LESSER 1 endif 但做不到 有什么解决方案或阅读吗 我很努力地想要做到这一点 但是却做不到 Verilog 不提供这样
  • 在 Mac OS X 10.6.8 上用什么来编译和模拟 Verilog 程序?

    作为教学大纲的一部分 我需要模拟 Verilog 程序 但是 我的大学使用 Xilinx ISE 但它不适用于 Mac 因此 请帮助我提供最好的软件以及有关如何安装和使用它们的一些详细步骤 你可以尝试伊卡洛斯 Verilog http iv
  • 开始后跟冒号和变量是什么意思?

    什么是data mux意思是这里 它只是块的名称吗 if PORT CONFIG 32 P0 1 b1 begin data mux end 这些是块名称 它们特别适用于generate块 例如 您可以定义一个generate块如 genv
  • 我怎样才能让我的verilog移位器更通用?

    这里我有一个移位器 但现在它最多只能工作 3 位 我一直在寻找 但不知道如何让它工作最多 8 位 module shifter a b out input 7 0 a b output 7 0 out wire 7 0 out1 out2
  • 如何在 Verilog 中推断 Block RAM

    我在一个项目中遇到了一个非常具体的问题 这个问题已经困扰我好几天了 我有以下 RAM 模块的 Verilog 代码 module RAM param clk addr read write clear data in data out pa
  • 阿迪和苏比之间到底是什么“关系”?

    我应该回答这个问题 经过一番研究后发现 add 和 sub 具有相同的操作码 仅在功能领域有所不同 这是答案还是其他什么 Update Nios II CPU 手册中提供了它 subi subtract immediate Operatio
  • 使用正则表达式进行 Verilog 端口映射

    我有一个很长的端口映射 我想在其中替换一堆 SignalName i with SignalName SignalName i 我想我可以用正则表达式轻松地做到这一点 但我无法弄清楚如何做到这一点 有任何想法吗 假设 SignalData
  • Verilog 双向握手示例

    我正在完成一个项目 要求是处理器内部功能单元之间的双向握手 我知道它是什么 但是有没有任何 标准 或一个简单的例子 我唯一能想到的就是两个单元之间 当它们之间有一条数据线并且当 X 发送到 Y 时 会给出一个单独的 发送 信号 当 Y 接收

随机推荐

  • mysql-server 依赖 mysql-server-5.5 解决方案

    问题 ubuntu14 04 3安装mysql时报错 xff1a sudo apt get install mysql server mysql client 正在读取软件包列表 完成 正在分析软件包的依赖关系树 正在读取状态信息 完成 有
  • 生成aruco码方法

    有两种方法得到想要的aruco码 xff1a 1 直接通过网址得到 http chev me arucogen xff08 不过只有四个格式 xff09 网页截图为 xff1a 2 通过运行C 43 43 代码得到 利用C 43 43 生成
  • 超详细c语言简化tcp通信接口(多线程实现一个服务端处理多个客户端服务)

    超详细c语言tcp通信接口 1 可下载源码 xff08 客户端 服务端通信 xff09 2 说明3 接口代码4 客户端通信main client demo c5 服务端通信main server demo c 1 可下载源码 xff08 客
  • 怎么在视频上叠加字幕和Logo--技术实现1

    这篇文章我给大家讲解的这种字幕叠加和Logo叠加方法是在渲染视频的时候 画 上去的 xff0c 其实是通过某种API将OSD和Logo绘制到显卡缓存 xff0c 然后提交缓存到屏幕 我们知道渲染视频有几种常用的API xff1a GDI x
  • opencv源码编译及配置完整版教程(win10+vs2019+opencv-4.4.0+opencv_contrib-4.4.0)

    opencv源码编译及配置完整版教程 xff08 win10 43 vs2019 43 opencv 4 4 0 43 opencv contrib 4 4 0 xff09 一 下载vs2019 官网下载 xff1a https visua
  • c++使用多个库的头文件内容里有名字相同问题

    首先说下结构体 xff0c 如果两个头文件定义的结构体内容不一样 xff0c 但名字一样 xff0c 当一个文件同时包含着两个头文件的时候 xff0c 就会报如下错误 xff1a 此时 xff0c 在不修改头文件的情况下 最好不要改动 xf
  • 蓝牙模块 HC08_两个STM32开发板无线通信

    一 HC08重要参数 蓝牙4 0 xff0c BLE xff0c 主从一体 xff1b 模块上电后 xff0c 启动需要150ms xff1b UART波特率 xff1a 9600默认 xff1b 空中速率 xff1a 1Mbps 与HC0
  • STM32 --- 使用内部FLASH存储数据

    本文记录了对一些知识点的理解 操作方法 xff0c 如有错误 xff0c 请务必批评指正 xff01 xff01 最终的测试截图 xff1a 目录 一 内部FLASH要点 关于地址 xff1a 关于解锁 xff1a 关于擦除 xff1a 关
  • Keil 代码自动格式化对齐整理 AStyle设置图解

    代码对齐 xff0c 使用前后效果 xff1a 建议 设置成快捷键 xff1a CTRL 43 S xff0c 即可保存 43 对齐 一 下载插件 https sourceforge net projects astyle files as
  • keil5 烧录程序到单片机的方法

    Keil是一种常用的单片机开发工具 xff0c 支持多种单片机芯片 下面详细说明Keil5如何烧录程序到单片机的方法 编译程序 首先 xff0c 在Keil5中打开编写好的程序工程 xff0c 进行编译 编译生成的可执行文件是 hex或 b
  • 基于STM32 + SYN6288语音播报

    完整代码下载 https download csdn net download zhouml msn 85592868 一 接线示例 xff1a 二 模块重点 xff1a 1 xff1a 5V供电 xff0c 功耗约120mA 带图中小喇叭
  • STM32开发---ADC单通道电压采集

    代码zip下载 xff1a https download csdn net download zhouml msn 86666457 spm 61 1001 2014 3001 5501 STM32 ADC单通道电压数据采集 xff0c 直
  • Keil仿真调试Debug不能放断点_图解

    前提 xff1a 正常连接了调试器 43 开发板 xff0c 才能进入Debug模式 xff01 xff01 xff01 一 正常情况 当Keil进入Debug模式 xff0c 正常可以放置断点时的界面 xff0c 是下面这样的 xff1a
  • 无人机(2)_电机

    型号值 如2212 前两位 电机外径 后两位 转子高度KV值 电机空转 时 电压每提高1V 电机转速提高 800转 分钟无刷电机 电机分有刷和无刷 无人机都是无刷 电机 贵 力气大 耐用 电池节数 很重要 一节是4 2V电调大小 A越大越好
  • Linux下运用opencv的简单图像编程

    文章目录 Linux下运用opencv的简单图像编程一 编写一个打开图片进行特效显示的代码 一 用普通方式编译程序1 准备工作 xff1a 2 准备一张图片 xff0c 移到相同目录下3 编译程序4 运行程序 二 用make 43 make
  • 简单stm32程序编写以及调试

    简单stm32程序编写以及调试 一 环境配置 1 MDK的安装 MDK xff08 Microcontroller Development Kit xff09 是针对ARM处理器 xff0c 特别是Cortex M内核处理器的最佳开发工具
  • STM32以中断的方式点亮LED小灯(标准库)

    STM32以中断的方式点亮LED小灯 xff08 标准库 xff09 文章目录 STM32以中断的方式点亮LED小灯 xff08 标准库 xff09 一 认识中断1 中断优先级 xff1a 2 中断嵌套 xff1a 3 中断执行流程4 中断
  • STM32 I2C_OLED显示汉字及屏幕滚动

    STM32 I2C OLED显示汉字及屏幕滚动 文章目录 STM32 I2C OLED显示汉字及屏幕滚动一 I2C以及AHT20温湿度传感器介绍二 用0 96寸OLED屏幕显示数据1 OLED介绍2 样例测试 三 汉字编码原理编码排序A0A
  • # FPGA编程入门

    FPGA编程入门 文章目录 FPGA编程入门一 1位全加器1 原理图1 1原理图1 2 全加器 2 verilog实现1位全加器2 1 代码2 2 编译 xff0c 查看RTL2 3 仿真实现 二 烧录三 4位全加器1 原理图实现4位全加器
  • 基于NIOS-II软核与verilog语言的流水灯实现

    基于NIOS II软核与verilog语言的流水灯实现 文章目录 基于NIOS II软核与verilog语言的流水灯实现1 实验目的2 实验设备3 实验内容4 软核设计4 1 新建一个工程4 2 Qsys 系统设计4 3 进行逻辑连接4 3