材料_基于FPGA的SOPC流水灯演示实验

合集下载

SOPC流水灯实验

SOPC流水灯实验

第1章SOPC流水灯实验实验步骤如下:1.1 实验目的熟悉使用QuartusII软件;熟悉使用SOPC Builder建立自己的Nios2系统;熟悉使用Nios II IDE软件进行编程、调试和下载程序。

1.2 实验设备硬件:PC机一台MagicSOPC教学实验开发平台一套软件:Quartus II7.0、Nios II IDE 7.01.3 实验内容本实验的内容是使用QuartusII中的SOPC Builder建立一个NiosII系统,并使用NiosII IDE编写C程序,在NiosII IDE中下载程序、调试程序。

1.4 实验预习要求预习《SOPC嵌入式系统实验教程二》第3章3.3节,熟悉建立带DDR SDRAM的NiosII 系统;熟悉PIO外设的使用。

1.5 实验步骤1.5.1使用Quartus II建立工程仿照Quartus II7.0软件使用的实验,建立一个Nios2_system的工程,并使工程名与实体名相同。

1.5.2建立Nios II 系统硬件(1)在Quartus II主界面中选择File→New打开新建文件对话框,如图1.1所示,在对话框中选择Block Diagram/Schematic File,单击OK建立一个空的顶层原理图设计文件。

图1.1 新建文件对话框(2)在Quartus II主界面中选择Tools→SOPC Builder打开如图1.2所示的对话框,在System Name一栏中填入Nios II 系统的名称nios2_ep2c35,然后单击OK进入到如图1.3所示的SOPC Builder的主界面。

图1.2 Create New System对话框图1.3 SOPC Builder的主界面(3)双击SOPC Builder主界面左侧中的“Nios II Processor-Altera Corporation”,出现Nios II CPU的配置向导对话框,如图1.4所示,在这果可以有三种Nios II CPU选择,我们选择快速型的Nios II/f,然后单击Next进入下一步配置。

基于FPGA的LED流水灯与按键消抖实验

基于FPGA的LED流水灯与按键消抖实验

基于FPGA的LED流水灯与按键消抖实验1.实验目的(1)通过实验进一步学习Quartus II软件的使用方法。

(2)通过实验学习流水灯的设计原理。

(3)通过实验学习按键消抖(边沿检测法)的基本原理。

2.实验仪器设备(1)FPGA开发实验箱。

(2)数字万用表。

(3)电脑。

3.预习(1)复习FPGA开发有关的流程。

(2)复习Verilog HDL语言语法。

(3)复习实验所用的相关原理。

(4)按要求编写实验中要求的硬件描述语言程序。

4.实验原理(1)LED流水灯。

流水灯是一个典型的FPGA程序设计,通过控制8位led向左依次循环点亮,达到对硬件语言、软件开发平台等的初步认识。

①if语句的使用。

Verilog HDL语言中的if语句与C语言中的十分相似,其使用方法有以下三种:a.if(条件1)语句块1;b.if(条件1)语句块1;else 语句块2;c.if(条件1)语句块1;else if(条件2)语句块2;……else if(条件n)语句块n;else 语句块n+1。

在上述三种方式中,“条件”一般为逻辑表达式或关系表达式,也可以是一位的变量。

如果表达式的值出现0(假),x(未知),z(高阻),则全部按“假”来处理;若为“1”,则按“真”来处理。

语句块若为单句,直接书写即可;若为多句,则需要用“begin end”块括起来。

建议无论多句还是单句都用“begin end”括起来。

②case语句的使用。

case语句是一个多路条件分支语句,常用于多路译码、状态机和微处理机的指令译码等场合。

case语句的语法格式为:case(条件表达式)分支1:语句块1;分支2:语句块2;……default:语句块nendcase其中,“分支n”通常都是一些常量表达式。

case语句先对“条件表达式”求值,然后同时并行对各分支项求值并进行比较,这是与if语句最大不同。

比较完成后,与条件表达式值相匹配的分支中的语句被执行。

分支项需要互斥,否则会出现逻辑矛盾。

sopc 流水灯实验

sopc 流水灯实验

实验3、流水灯实验一、实验目的熟悉并行输入、输出内核提供从NiOSII软核处理器到通用输入/输出端口之间的寄存器映射接口。

二、实验环境PC机、Quartus II 13.0、Nios II三、实验内容按照书上介绍的方法和流程,完成H ello World 实验,包括N ios II 软核处理器系统的产生、编译、综合、Nios II EDS 工程创建、C 语言源文件的编辑及编译、配置目标F PGA 器件、下载观察实验结果四、实验步骤1、启动Quartus II 13.0,新建工程将其命名为l edsk,选择好目标芯片,然后设置没有用的引脚。

2、进入Tool-Qsys,进行如下图所示的硬件构架(1)从左侧组件库输入p io,双击添加组件并进行如下设置,并改名为l ed18_pio。

(2)双击led18_pio 组件中export 栏输入led18_pio,这是设置该组件外部硬件连接端口(注意点击自动分配地址和自动连接复位端口选项)。

(3)将文件保存命名为l ed18.qsys,点击g enerate 生成硬件。

3、添加q ip 文件,新建如图所示的b df(Block Schematic File)文件,编译分配引脚,再编译。

4、由Nios II C/C++菜单File-New- Nios II Application and BSP from Template 打开新工程设置窗口如下图所示。

找到led18.sopcinfo 文件,将软件工程命名为LED,并选择空白模板blank project.5、在L ED 文件夹下新建l ed.c 文件。

输入代码,Ctrl+s 保存。

Ctrl+b 进行全编译,编译完成进行,进行板上运行,观察结果。

五、实验心得与体会在这次实验中,主要是在NiosII上做出流水灯的实验,实验步骤大都与以往相同,在Quartus II上操作比较熟练。

但也有很多不足,下一次会注意本次试验中的问题。

基于FPGA的流水灯

基于FPGA的流水灯

基于FPGA的流水灯概述流水灯是一种常见的电子实验项目,也是学习数字电路和FPGA编程的入门项目之一。

本文介绍了如何使用FPGA实现一个基于流水灯的电子项目。

需求流水灯项目的主要需求是将一组LED灯以一定的速率顺序点亮,然后逐个熄灭,再以同样的速率顺序点亮下一个LED 灯,如此循环。

硬件设计FPGA板在本项目中,我们使用一块支持FPGA编程的开发板。

可选的FPGA开发板包括Xilinx的Nexys 4或Digilent的Basys 3等。

LED灯流水灯需要一组LED灯来显示效果。

我们将使用FPGA开发板上的LED灯作为显示单元。

连接将LED灯的阳极连接到FPGA开发板的GPIO引脚上,并将其地连接到电路板上的公共地线。

软件设计硬件描述语言(HDL)HDL是一种用于描述数字电路和FPGA的语言。

常用的HDL包括VHDL和Verilog。

我们将使用Verilog作为本项目的HDL语言。

Verilog代码下面是一个基于FPGA的流水灯的Verilog代码示例:module led_shifter(input clk,output reg [7:0] leds);reg [25:0] counter;always @(posedge clk) begincounter <= counter + 1;if (counter == 26'd255) begincounter <= 0;leds <= leds << 1;endendendmodule上述Verilog代码中,我们定义了一个led_shifter模块,该模块接受一条时钟信号(clk)和一个用于控制LED灯的8位寄存器(leds)。

leds寄存器表示LED灯的状态,其中每个位代表一个LED灯。

在always块中,我们使用一个计数器counter来计算时钟脉冲的数量。

当计数器的值达到255时,即过了一定的时钟周期,我们将计数器重置为0,并将leds寄存器向左移动一位,即将下一个LED灯点亮。

SOPC技术LED流水灯设计

SOPC技术LED流水灯设计

SOPC技术LED流水灯设计Sopc_LED实验指导一.实验目的:1.掌握NIOS II软核的定制流程。

2.掌握NIOS II的开发流程。

3.熟识NIOS II IDE 开发环境的使用。

4.掌握基本的软件的调试方法。

5.掌握通过寄存器形式对硬件进行控制,可以更透彻地看清NIOS II 开发过程。

二.实验内容:1.PIO 模块的构建。

2.软件编程,通过寄存器形式对硬件进行控制。

3.下载程序并硬件调试。

4. 扩展实验:程序功能通过SOPC建立的软核来运行程序功能:LED 显示控制。

通过PIO 直接控制8 个LED 产生流水灯效果三.实验简介:这一节,我将给大家了解第一个与硬件有关的程序,虽然内容简单,却极具代表性。

我将采用一种寄存器的操作方案,让大家感受到开发NIOS跟单片机一样的简单,看透NIOS II开发的本质,尽量避免使用NIOS II IDE提供的API,这样做有很多好处。

首先,有单片机开发经验的人应熟悉这种操作方案,其次,它是硬件试验部分的第一课,通过这个简单的实验,可以让你对单片机的操作有一个感官上的了解,可以说意义不同寻常。

这一节,我也通过LED 实验来带大家进入NIOS II 的开发世界,感受NIOS 的魅力所在,下面我们开始吧。

四.实验内容:1.硬件开发第一步,我们要在软核中加入PIO 模块。

打开我们上一次建的Quartus 工程,如下图红圈所示(如果你没保留上次的工程,需要按照上次指导书重新再做一个下面的。

)双击上图的hello_word后进入了SOPC BUILDER界面,如下图所示点击下图所示红圈处PIO(Parallel I/O)点击后,如下图所示,红圈1处是你需要的PIO口的宽度,即你需要几个IO口,这里面我设置为8,即我要控制8个LED,红圈2是选择输出方式,我选择为输出(Output)。

接下来,点击Finish,完成PIO模块的构建,然后将其改名为LED,如下图所示接下来,需要自动分配一下基地址,上一次已经讲过,如下图所示接下来,双击cpu,看下图红圈的地址为下图的。

fpga流水灯实验报告

fpga流水灯实验报告

竭诚为您提供优质文档/双击可除fpga流水灯实验报告篇一:vhdl流水灯课程设计报告院系:姓名:学号:课程设计名称:指导老师:时间:摘要VhDL的特点应用VhDL进行系统设计,有以下几方面的特点。

(一)功能强大VhDL具有功能强大的语言结构。

它可以用明确的代码描述复杂的控制逻辑设计。

并且具有多层次的设计描述功能,支持设计库和可重复使用的元件生成。

VhDL是一种设计、仿真和综合的标准硬件描述语言。

(二)可移植性VhDL语言是一个标准语言,其设计描述可以为不同的eDA工具支持。

它可以从一个仿真工具移植到另一个仿真工具,从一个综合工具移植到另一个综合工具,从一个工作平台移植到另一个工作平台。

此外,通过更换库再重新综合很容易移植为AsIc设计。

(三)独立性VhDL的硬件描述与具体的工艺技术和硬件结构无关。

设计者可以不懂硬件的结构,也不必管最终设计实现的目标器件是什么,而进行独立的设计。

程序设计的硬件目标器件有广阔的选择范围,可以是各系列的cpLD、FpgA及各种门阵列器件。

(四)可操作性由于VhDL具有类属描述语句和子程序调用等功能,对于已完成的设计,在不改变源程序的条件下,只需改变端口类属参量或函数,就能轻易地改变设计的规模和结构。

(五)灵活性VhDL最初是作为一种仿真标准格式出现的,有着丰富的仿真语句和库函数。

使其在任何大系统的设计中,随时可对设计进行仿真模拟。

所以,即使在远离门级的高层次(即使设计尚未完成时),设计者就能够对整个工程设计的结构和功能的可行性进行查验,并做出决策。

VhDL的设计结构VhDL描述数字电路系统设计的行为、功能、输入和输出。

它在语法上与现代编程语言相似,但包含了许多与硬件有特殊关系的结构。

VhDL将一个设计称为一个实体entity(元件、电路或者系统),并且将它分成外部的可见部分(实体名、连接)和内部的隐藏部分(实体算法、实现)。

当定义了一个设计的实体之后,其他实体可以利用该实体,也可以开发一个实体库。

基于FPGA的流水灯

基于FPGA的流水灯

基于FPGA的流水灯介绍流水灯(Traffic Light)是一种常见的电子实验项目,通过一组灯的亮灭变化来模拟交通信号灯的工作原理。

在本文档中,我们将介绍如何使用FPGA(Field-Programmable Gate Array)来实现流水灯功能。

背景知识FPGA概述FPGA是一种重新可编程的集成电路芯片,可以通过修改内部逻辑电路来实现不同的功能。

相比于传统的固定功能芯片,FPGA具有更高的灵活性和可重构能力。

流水灯原理流水灯由多个灯泡组成,每个灯泡在不同的时间点亮。

通过逐个点亮和熄灭灯泡,可以模拟交通信号灯的变化效果。

硬件设计硬件平台选择在本项目中,我们选择使用一块FPGA开发板作为硬件平台。

开发板上集成了FPGA芯片以及所需的外围器件,方便我们进行流水灯的实验。

硬件连接将FPGA开发板上的LED灯连接到FPGA芯片的GPIO(通用输入输出)引脚上。

通过配置FPGA芯片的GPIO引脚为输出模式,我们可以控制LED灯的亮灭状态。

软件设计硬件描述语言(HDL)为了描述FPGA中的逻辑电路,我们需要使用一种称为硬件描述语言(Hardware Description Language)的工具。

常用的硬件描述语言有Verilog和VHDL两种。

Verilog代码示例以下是一个使用Verilog描述的简单流水灯控制器的例子:module led_controller (input wire clk, // 时钟输入output wire [7:0] led // LED灯控制输出);reg [25:0] counter; // 计数器always @(posedge clk) beginif (counter == 0)led <= 8'h01; // 第一个灯亮else if (counter == 500000)led <= 8'h02; // 第二个灯亮else if (counter == 1000000)led <= 8'h04; // 第三个灯亮else if (counter == 1500000)led <= 8'h08; // 第四个灯亮else if (counter == 2000000)led <= 8'h10; // 第五个灯亮else if (counter == 2500000)led <= 8'h20; // 第六个灯亮else if (counter == 3000000)led <= 8'h40; // 第七个灯亮else if (counter == 3500000)led <= 8'h80; // 第八个灯亮counter <= counter + 1'b1;endendmodule在该代码中,我们定义了一个8位宽的led输出端口和一个26位宽的计数器。

时序流水灯实验报告

时序流水灯实验报告

一、实验目的1. 熟悉时序电路的基本原理和设计方法。

2. 掌握FPGA开发软件的使用方法,包括原理图设计、Verilog HDL编程、仿真调试等。

3. 学会使用FPGA实现时序流水灯的功能,并观察其工作效果。

二、实验原理时序流水灯是一种常见的电子电路,通过控制LED灯的亮灭顺序,实现流水灯效果。

本实验采用FPGA实现时序流水灯,主要原理如下:1. 使用FPGA内部寄存器作为计数器,对时钟信号进行计数。

2. 根据计数器的值,通过查找表(LUT)控制LED灯的亮灭顺序。

3. 使用时钟分频器产生定时器时钟,用于更新计数器的值。

三、实验内容1. 使用FPGA开发软件,建立时序流水灯的原理图。

2. 使用Verilog HDL编写时序流水灯的代码。

3. 对代码进行仿真调试,验证其正确性。

4. 将程序烧录到FPGA开发板上,观察时序流水灯的工作效果。

四、实验步骤1. 建立原理图(1)打开FPGA开发软件,创建一个新项目。

(2)添加FPGA芯片,并配置其引脚。

(3)添加时钟信号源,设置时钟频率。

(4)添加计数器模块,设置计数器的位宽和初始值。

(5)添加查找表(LUT)模块,用于控制LED灯的亮灭顺序。

(6)添加时钟分频器模块,产生定时器时钟。

2. 编写Verilog HDL代码(1)创建一个名为`seq_led`的模块,包含以下端口:- `clk`:时钟信号输入- `rst`:复位信号输入- `led`:LED灯输出(2)在模块内部,定义以下信号:- `count`:计数器信号- `led_pattern`:查找表输出信号(3)编写代码实现以下功能:- 初始化计数器和查找表输出信号。

- 在每个时钟周期,对计数器进行加1操作。

- 根据计数器的值,通过查找表输出对应的LED灯亮灭顺序。

3. 仿真调试(1)将编写好的代码添加到原理图中。

(2)设置仿真参数,包括时钟频率、仿真时间等。

(3)启动仿真,观察LED灯的亮灭顺序是否符合预期。

fpga流水灯实验报告

fpga流水灯实验报告

竭诚为您提供优质文档/双击可除fpga流水灯实验报告篇一:vhdl流水灯课程设计报告院系:姓名:学号:课程设计名称:指导老师:时间:摘要VhDL的特点应用VhDL进行系统设计,有以下几方面的特点。

(一)功能强大VhDL具有功能强大的语言结构。

它可以用明确的代码描述复杂的控制逻辑设计。

并且具有多层次的设计描述功能,支持设计库和可重复使用的元件生成。

VhDL是一种设计、仿真和综合的标准硬件描述语言。

(二)可移植性VhDL语言是一个标准语言,其设计描述可以为不同的eDA工具支持。

它可以从一个仿真工具移植到另一个仿真工具,从一个综合工具移植到另一个综合工具,从一个工作平台移植到另一个工作平台。

此外,通过更换库再重新综合很容易移植为AsIc设计。

(三)独立性VhDL的硬件描述与具体的工艺技术和硬件结构无关。

设计者可以不懂硬件的结构,也不必管最终设计实现的目标器件是什么,而进行独立的设计。

程序设计的硬件目标器件有广阔的选择范围,可以是各系列的cpLD、FpgA及各种门阵列器件。

(四)可操作性由于VhDL具有类属描述语句和子程序调用等功能,对于已完成的设计,在不改变源程序的条件下,只需改变端口类属参量或函数,就能轻易地改变设计的规模和结构。

(五)灵活性VhDL最初是作为一种仿真标准格式出现的,有着丰富的仿真语句和库函数。

使其在任何大系统的设计中,随时可对设计进行仿真模拟。

所以,即使在远离门级的高层次(即使设计尚未完成时),设计者就能够对整个工程设计的结构和功能的可行性进行查验,并做出决策。

VhDL的设计结构VhDL描述数字电路系统设计的行为、功能、输入和输出。

它在语法上与现代编程语言相似,但包含了许多与硬件有特殊关系的结构。

VhDL将一个设计称为一个实体entity(元件、电路或者系统),并且将它分成外部的可见部分(实体名、连接)和内部的隐藏部分(实体算法、实现)。

当定义了一个设计的实体之后,其他实体可以利用该实体,也可以开发一个实体库。

fpga流水灯设计实验报告

fpga流水灯设计实验报告

fpga流水灯设计实验报告一、实验目的通过此实验进一步了解,熟悉FPGA开发软件的使用方法及,的编程方法:学习简单时序电路的设计。

二、实验原理和内容实验内容:在实验板上实现LED1~LED8发光二极管流水灯显示实验原理:在LED1~LED8引脚上周期性地输出流水数据,如原来输出的数据是则表示点亮LED1,LED2流水一次后,输出数据应该为,而此时则应点亮LED1-LED3三个LED发光二极管,这样就可以实现LED流水灯,为了观察方便,流水速率最好在2Hz左右。

在QuickSOPC核心板上有48MHz的标准时钟源,该时钟脉冲CLOCK与芯片的28脚相连,为了产生2Hz的时钟脉冲,在此调用了一个分频模块intdiv模块,通过修改分频系数来改变输出频率,int-div模块是一个占空比为50%的任意整数分频器。

三、实验步骤1、启动QuartusⅡ建立一个空白工程,然后命名为。

2、新建VerilogHDL源程序文件,输入程序代码并保存,然后进行综合编译。

若在编译过程中发现错误,则找出并更正错误,直至编译成功为止。

3、从设计文件创建模块,由生成名为的模块符号文件。

4、将光盘中EDA-Component目录下的和拷贝到工程目录。

5、新建图形设计文件命名为并保存。

在空白处双击鼠标左键,在Symbol对话框左上角的中,分别将project下的ledwater和int-div模块放在图形文件中,加入输入,输出引脚,双击各引脚符号进行引脚命名。

将与ledwater模块led[7.0]连接的引脚命名为led[7..0],与int-div模块clock连接的引脚命名为clock,int-div模块的clk-out与ledwater模块的clk相连接。

6、选择目标器件并对相应的引脚进行锁定,在这里所选择的器件为Altera公司Cyclone系列的EPIC12Q240C8芯片,引脚锁定方法见下表,将未使用的引脚设置为三态输入。

流水灯显示实验报告

流水灯显示实验报告

流水灯显示实验报告流水灯显示实验报告一、实验目的本实验旨在通过单片机控制LED灯的亮灭,实现流水灯的显示效果。

通过本实验,旨在巩固学生对单片机基本理论知识的理解,掌握流水灯显示的基本原理与设计方法,提高实践操作能力。

二、实验原理流水灯是一种常见的LED显示效果,通过控制LED灯的亮灭顺序和时间间隔,使LED灯以一定的速度逐次点亮或熄灭,形成流水般的效果。

本实验采用单片机控制LED灯的亮灭,通过编程实现流水灯的显示。

三、实验步骤1.准备实验材料(1)单片机开发板(2)LED灯若干(3)杜邦线若干(4)面包板(5)镊子、电烙铁等工具2.搭建硬件电路(1)将LED灯按照一定的顺序连接到单片机开发板的GPIO口上。

(2)使用杜邦线将电源连接到LED灯的正极和负极。

(3)连接单片机开发板与电脑的串口。

3.编写程序(1)打开单片机开发板的编程软件,如Keil uVision。

(2)编写程序代码,实现流水灯的显示效果。

程序代码包括初始化、延时、循环点亮和熄灭LED灯等部分。

(3)将程序代码下载到单片机开发板中。

4.调试与测试(1)打开电源,观察LED灯的亮灭情况,检查是否实现了流水灯效果。

(2)调整程序代码中的延时参数,改变LED灯的亮灭速度。

(3)检查程序代码中的语法错误和逻辑错误,确保程序的正确性。

四、实验结果与分析1.实验结果通过本次实验,我们成功地实现了流水灯的显示效果。

当电源接通后,LED灯按照设定的顺序逐次点亮或熄灭,形成流水般的效果。

同时,通过调整程序代码中的延时参数,我们还可以改变LED灯的亮灭速度。

2.结果分析本次实验的成功得益于正确的实验方法和步骤。

首先,我们准确地搭建了硬件电路,确保LED灯与单片机的连接正确;其次,我们合理地编写了程序代码,实现了流水灯的显示效果;最后,我们对实验结果进行了仔细的观察和调试,确保实验结果的正确性。

通过本次实验,我们不仅提高了实践操作能力,还巩固了对单片机基本理论知识的理解。

FPGA入门系列实验教程——LED流水灯

FPGA入门系列实验教程——LED流水灯

艾米电子工作室FPGA入门系列实验教程FPGA入门系列实验教程V1.0前言目前市场销售FPGA开发板的厂商很多,但大多只提供些简单的代码,没有详尽的文档和教程提供给初学者。

经验表明,很多学生在学习FPGA设计技术的过程中,虽然刚开始学习热情很高,但真正坚持下来一直到“学会”的却寥寥无几,除了学生个人毅力的因素外,另外一个更主要的原因就是所选的开发板缺少配套的说明文档和手把手系列的入门教程。

原本FPGA的学习门槛相对于单片机来说就高了不少,再加上缺少手把手系列教程资料,这就给初学者学习FPGA增添了更多的困难,很多初学者因为找不到入门的方法而渐渐失去了学习FPGA的兴趣和信心。

作者从接著到系统学习FPGA有两年多的时间了,学习FPGA的时间不长,期间因为没有专业的老师指导,自己摸索学习FPGA走了很多的弯路。

有过问题迎刃而解的快乐,也有过苦苦寻求结果和答案的痛苦历程,回想起自己学习FPGA的历程,从开始的茫然,到后来的疯狂看书,购买开发板,在开发板上练习各种FPGA实例,到最后能独立完成项目,一路走来,感受颇多。

发觉学习FPGA只要选择正确的方法是有捷径可走的,有很多人学习FPGA很长时间,因为没有找到正确的方法还是停留在入门阶段。

针对现状,作者从初学者的角度出发,结合作者学习FPGA的经验和亲身体会,遵循“宁可啰嗦一点,也不放过细节”的原则编写了详尽的实验教程作为艾米电子工作室开发套件的配套教程使用,主要面向FPGA初学者。

FPGA的学习只有通过大量的操作与实践才能很好并快速的掌握。

为此本实验教程从点亮LED 灯写起,深入浅出,以图文并茂的方式由易到难地列举了很多实例,采用手把手、Step by Step的方式让初学者以最快的方式掌握FPGA技术的开发流程以及Quartus II软件的使用,从而激起初学者学习FPGA的兴趣。

在教程中作者采用“授人以渔”的方式,努力做到不仅讲述怎样进行试验,而且分析为什么这样做,以便初学者深刻理解并快速掌握FPGA的学习方法。

基于SOPC的LED循环流水灯控制设计说明

基于SOPC的LED循环流水灯控制设计说明

课程报告设计课题: 基于SOPC 的LED 循环流水灯控制设计姓名: XXX专业: 集成电路设计与集成系统学号: 1115103004日期 2014 年 11月 18 日指导教师: XXX 华侨大学信息科学与工程学院电子工程系基于SOPC的LED循环流水灯控制设计一.设计的任务与要求1. 将8 只LED 灯编号,奇数号亮1 秒,灭2 秒,偶数号亮3 秒,灭3 秒。

2. 用数码管显示每个灯的亮灭时间。

3. 循环点亮。

二.系统设计整体硬件电路框图整体电路设计由一个锁相环,SOPC搭建的CPU模块组成,由DE2部时钟50MHZ输入控制,输出接LED[7..0]8个LED灯,HEX0-HEX7 8个数码管,用程序编程控制,来实现LED循环流水灯数码管计时功能的实现。

三.单元电路设计锁相环设计模块(PLL)SOPC设计模块在DE2 平台上建立SOPC系统的硬件,这个系统包括一个NIos II/s 嵌入式处理器、存储器、一个JTAG UART 及一个定时器,一个ID 模块和IO模块。

另外,我们将加入一个自定义组件,实现对DE2 平台上七段数码管的控制。

SOPC模块硬件电路图四:仿真结果五.软件设计程序详见附录六.系统测试:实验仪器用DE2板验证,芯片型号为EP2C35F672C6,将计算机软件与DE2板相连。

用8只LED灯实现循环点亮,并在8只数码管显示每只LED灯的亮灭时间。

七.结论:从DE2板实验结果可以看出,该实验现象满足设计的任务与要求,即:1. 将8 只LED 灯编号,奇数号亮1 秒,灭2 秒,偶数号亮3 秒,灭3 秒。

2. 用数码管显示每个灯的亮灭时间。

3. 循环点亮。

满足了该设计的1,2,3点要求,唯一不足的地方是在用数码管显示每个灯的亮灭时间时,我是用usleep()函数来延迟的,时间精度方面可能比不上用定时计数器来的准确,可以做进一步改进。

附录:软件程序:#include "system.h"#include "alt_types.h"#include "unistd.h"#include "io.h"int main (void){alt_u8 led=0x01;alt_u32 count;volatile int i; //i用来控制循环的次数volatile int j; //j用来控制每次循环时间为1Swhile(1){led=0x01;*(unsigned int *)PIO_LED_BASE = led; //点亮第一个LED灯for(i=1,j=1000000,count=0x00000001;i>0;i--) //用数码管控制亮的时间1S{IOWR(SEG7_LUT_8_0_BASE,0,count); //第一个数码管显示count值1 usleep(j); //j=1000000,延时1秒count=count-0x00000001; //count值减1}IOWR(SEG7_LUT_8_0_BASE,0,count); //第一个数码管显示count值0led=0x00;*(unsigned int *)PIO_LED_BASE = led; //熄灭第一个LED灯for(i=2,j=1000000,count=0x00000002;i>0;i--) //用数码管控制熄灭的时间2S{IOWR(SEG7_LUT_8_0_BASE,0,count);usleep(j);count=count-0x00000001;}IOWR(SEG7_LUT_8_0_BASE,0,count);led=0x02;*(unsigned int *)PIO_LED_BASE = led;//点亮第二个LED灯for(i=3,j=1000000,count=0x00000030;i>0;i--) //用数码管控制亮的时间3S{IOWR(SEG7_LUT_8_0_BASE,0,count);usleep(j);count=count-0x00000010;}IOWR(SEG7_LUT_8_0_BASE,0,count);led=0x00;*(unsigned int *)PIO_LED_BASE = led;//熄灭第二个LED灯for(i=3,j=1000000,count=0x00000030;i>0;i--)//用数码管控制熄灭的时间3S{IOWR(SEG7_LUT_8_0_BASE,0,count);usleep(j);count=count-0x00000010;}IOWR(SEG7_LUT_8_0_BASE,0,count);led=0x04;*(unsigned int *)PIO_LED_BASE = led;//点亮第三个LED灯for(i=1,j=1000000,count=0x00000100;i>0;i--) //用数码管控制亮的时间1S{IOWR(SEG7_LUT_8_0_BASE,0,count);usleep(j);count=count-0x00000100;}IOWR(SEG7_LUT_8_0_BASE,0,count);led=0x00;*(unsigned int *)PIO_LED_BASE = led;//熄灭第三个LED灯for(i=2,j=1000000,count=0x00000200;i>0;i--)//用数码管控制熄灭的时间2S{IOWR(SEG7_LUT_8_0_BASE,0,count);usleep(j);count=count-0x00000100;}IOWR(SEG7_LUT_8_0_BASE,0,count);led=0x08;*(unsigned int *)PIO_LED_BASE = led;//点亮第四个LED灯for(i=3,j=1000000,count=0x00003000;i>0;i--)//用数码管控制亮的时间3S{IOWR(SEG7_LUT_8_0_BASE,0,count);usleep(j);count=count-0x00001000;}IOWR(SEG7_LUT_8_0_BASE,0,count);led=0x00;*(unsigned int *)PIO_LED_BASE = led;//熄灭第四个LED灯for(i=3,j=1000000,count=0x00003000;i>0;i--)//用数码管控制熄灭的时间3S{IOWR(SEG7_LUT_8_0_BASE,0,count);usleep(j);count=count-0x00001000;}IOWR(SEG7_LUT_8_0_BASE,0,count);led=0x10;*(unsigned int *)PIO_LED_BASE = led;//点亮第五个LED灯for(i=1,j=1000000,count=0x00010000;i>0;i--)//用数码管控制亮的时间1S {IOWR(SEG7_LUT_8_0_BASE,0,count);usleep(j);count=count-0x00010000;}IOWR(SEG7_LUT_8_0_BASE,0,count);led=0x00;*(unsigned int *)PIO_LED_BASE = led;//熄灭第五个LED灯for(i=2,j=1000000,count=0x00020000;i>0;i--)//用数码管控制熄灭的时间2S{IOWR(SEG7_LUT_8_0_BASE,0,count);usleep(j);count=count-0x00010000;}IOWR(SEG7_LUT_8_0_BASE,0,count);led=0x20;*(unsigned int *)PIO_LED_BASE = led;//点亮第六个LED灯for(i=3,j=1000000,count=0x00300000;i>0;i--)//用数码管控制亮的时间3S{IOWR(SEG7_LUT_8_0_BASE,0,count);usleep(j);count=count-0x00100000;}IOWR(SEG7_LUT_8_0_BASE,0,count);led=0x00;*(unsigned int *)PIO_LED_BASE = led;//熄灭第六个LED灯for(i=3,j=1000000,count=0x00300000;i>0;i--)//用数码管控制熄灭的时间3S{IOWR(SEG7_LUT_8_0_BASE,0,count);usleep(j);count=count-0x00100000;}IOWR(SEG7_LUT_8_0_BASE,0,count);led=0x40;*(unsigned int *)PIO_LED_BASE = led;//点亮第七个LED灯for(i=1,j=1000000,count=0x01000000;i>0;i--)//用数码管控制亮的时间1S {IOWR(SEG7_LUT_8_0_BASE,0,count);usleep(j);count=count-0x01000000;}IOWR(SEG7_LUT_8_0_BASE,0,count);led=0x00;*(unsigned int *)PIO_LED_BASE = led;//熄灭第七个LED灯//for(i=0;i<2000000;i++);for(i=2,j=1000000,count=0x02000000;i>0;i--)//用数码管控制熄灭的时间2S{IOWR(SEG7_LUT_8_0_BASE,0,count);usleep(j);count=count-0x01000000;}IOWR(SEG7_LUT_8_0_BASE,0,count);led=0x80;*(unsigned int *)PIO_LED_BASE = led;//点亮第八个LED灯//for(i=0;i<3000000;i++);for(i=3,j=1000000,count=0x30000000;i>0;i--)//用数码管控制亮的时间3S{IOWR(SEG7_LUT_8_0_BASE,0,count);usleep(j);count=count-0x10000000;}IOWR(SEG7_LUT_8_0_BASE,0,count);led=0x00;*(unsigned int *)PIO_LED_BASE = led;//熄灭第八个LED灯//for(i=0;i<3000000;i++);for(i=3,j=1000000,count=0x30000000;i>0;i--)//用数码管控制熄灭的时间3S{IOWR(SEG7_LUT_8_0_BASE,0,count);usleep(j);count=count-0x10000000;}IOWR(SEG7_LUT_8_0_BASE,0,count);}return 0;}1.添加自定义组件七段数码管控制器SEG7_LUT.V 是一个查找表,完成七段码显示的译码。

基于FPGA的数字电路实验7:流水灯的实现

基于FPGA的数字电路实验7:流水灯的实现

基于FPGA的数字电路实验7:流水灯的实现原创 Daniel继年前介绍的时序逻辑电路之时钟分频后,今天我们来介绍第7讲:流水灯。

流水灯,有时候也叫跑马灯,是一个简单、有趣又经典的实验,基本所有单片机的玩家们在初期学习的阶段都做过。

本次我们也来介绍一下如何通过小脚丫FPGA实现一个流水灯。

流水灯就是让一连串的灯在一定时间内先后点亮并循环往复,所以其中的关键要领就在于控制每两个相邻LED亮灭的时间差,以及所有LED灯完成一组亮灭动作后的循环。

很久都没有用过小脚丫的朋友可以再回顾一下,这上面有8个LED灯,且低电平点亮。

实现流水灯的方法绝不止一种,在这里我们采用模块化的设计思路,因为模块化设计对于之后构建大型电路系统非常有帮助,并且我们还可以借机温习一下以前学过的内容。

现在我们的目标是每过1秒后点亮下一个LED灯并且熄灭当前灯,且在第8个灯熄灭之后循环整个流程,该如何设计整个模块?我们先上图后解释。

毫无疑问,第一步需要做的就是通过分频来生成一个周期为1秒的时钟信号,不了解时钟分频童鞋可以读一下本系列的第6篇内容。

有了一个1秒钟嘀嗒一次的时钟后,我们还要考虑到循环问题,因为在第8个LED灯熄灭之后还需要再返回到第1个。

那么这个时候我们就需要一个计数器,它的作用就是数羊,一只,两只…...数到第八只后重头再来。

数8只羊需要一个3位宽的变量(23=8)。

最后,由于我们是要依次点亮,也就是说8位的输出中每次只有1位是低电平,其余均为高电平(小脚丫LED灯为低电平点亮)。

这个特性正好对应了我们之前学过的3-8译码器。

现在我们再来捋一遍。

首先,通过分频在小脚丫上生成一个周期为1秒的慢速时钟信号,这个时钟信号传送到计数器之中;这个计数器是3位宽的,因此最多可以计八次慢速时钟的嘀嗒,并且计数每增加1时,都对应着3-8译码器的下一种输出,也就对应着流水灯的下一个状态。

现在我们上代码:•••••••••••••••••••••••module runningled (clk,led); input clk,rst; output[7:0] le d; reg [2:0] cnt ; / /定义了一个3位的计数器,输出可以作为3-8译码器的输入 wire clk1hz; //定义一个中间变量,表示分频得到的时钟,用作计数器的触发 //例化分频模块,产生一个1Hz时钟信号 divide #(.WIDTH(24),.N(12000000)) u2 ( //除数为12,000,000,因此频率为1Hz .clk(clk), .rst_n(rst), .clkout(clk1hz) ); //生成计数器,上沿触发并循环计数 always@(posedge clk1hz) cnt <=< span=""> cnt +1; // 达到位宽上限后可自动溢出清零 //例化3-8译码器模块 decode38 u1 ( .X(cnt), //例化的输入端口连接到cnt,输出端口连接到led .D(led) );endmodule在第四篇讲译码器的文章里,我们介绍过,如果需要调用/例化子模块时,需要将各子模块与大模块放入同一个工程文件下进行编译。

FPGA流水灯实验报告

FPGA流水灯实验报告

1、原始代码与硬件电路module led(Input wire clk,Input wire rst_n,output reg[3:0] led;)reg [25:0] cnt_1sparameter END_CNT1S = 4999999;always @(posedge clk or negedge rst_n)if (!rst_n)cnt_1s <= ‘d0;else if (cnt_1s==END_CNT_1S)cnt_1s <=’d0;else cnt_1s <= cnt_1s+1’b1;always @(posedge clk or negedge rst_n)if(!rst_n)led <= 4’b0001;else if(cnt_1s==END_CNT_1S)case(led)4’b0001: led <= 4’b0010;4’b0010: led <= 4’b0100;4’b0100: led <= 4’b1000;4’b1000: led <= 4’b0001;default: led <= 4’b0000;elseled<= led;endmodule可见引脚输出为1时LED灯被点亮。

本程序中输入时钟为50MHz,所以一个时钟周期为20ns (1/50MHz)。

因此计数器counte通过对50MHz系统时钟计数,计时到0.1s,需要累加0.1s/20ns=5000000次。

每当计时到0.1s计数器清零一次。

2、如何改变流水灯流动的快慢?要改变流水灯的快慢只需改变计数器的计数上限即可,要加快流水灯的速度就把计数器的计数上限降低一些,反之,要减慢流水灯的速度就把计数器的计数上限提高一些,改第七行的数值即可。

原始:parameter END_CNT1S = 4999999;加快速度:parameter END_CNT1S = 3999999;降低速度:parameter END_CNT1S = 9999999;3、如何改变流水灯移动的方向?要改变流水灯的方向,更改第18行到第21行的引脚赋值语句的数值即可原始方向代码:4’b0001: led <= 4’b0010;4’b0010: led <= 4’b0100;4’b0100: led <= 4’b1000;4’b1000: led <= 4’b0001;更改方向后的代码:4’b0001: led <= 4’b1000;4’b0010: led <= 4’b0100;4’b0100: led <= 4’b0010;4’b1000: led <= 4’b0001;。

实验4 基于FPGA的流水灯设计

实验4 基于FPGA的流水灯设计

实验四基于FPGA的流水灯设计
一、实验的目的
学习运用VHDL语言实现LED灯的控制方法。

二、实验内容
1.用VHDL语言编程,实现用8个发光二极管从左至右循环显示。

要求:(1) 用模式5中PI08-PI15接灯;
(2) 流水灯输入时钟为1Hz,即每秒钟变化一次;
(3) 流水灯输出为8位显示,每次仅一个灯亮;
(4) 用至少两种方法来设计流水灯的各部分功能模块(如:可以用元件例化的方法,或者用多进程的设计方法等等)。

(5)用VHDL语言编程,实现其功能
三、实验仪器
计算机、QuartusII软件和康芯EDA实验箱
四、实验报告要求
根据以上的实验内容写出实验预习报告(没写预习报告的不准进入实验室)和实验报告,包括程序设计、硬件连接图。

FPGA基础试验之流水灯

FPGA基础试验之流水灯

综合实验报告第四组组长:韩欢02081535陈洁钰02081536侯旭涛02081514高耀02081510李欣昊02081508李昊02081506FPGA基础试验之流水灯一、实验目的通过此实验进一步了解、熟悉和掌握Quartus II开发软件的使用方法及Verilog 语言的编程方法。

学习简单时序电路的设计分析和硬件测试。

二、实验内容1.熟悉信号产生板中的FPGA的普通I/O的连接;2.根据实际的流水灯分析时序,体会用Verilog语言的编程产生相应时序;3.熟悉集成开发工具Quartus II,学会使用Quartus II对Cyclone系列FPGA的程序开发、编译与调试;4.掌握Cyclone系列FPGA的程序加载,熟练掌握将.sof文件加载到实验板的FPGA中,实现流水灯的效果。

三、实验原理流水灯,顾名思义就是让LED像水一样的点亮。

如果把流水做慢动作播放,可以想象到其实就是移动,即:把水块不断地向同一方向移动,而原来的水块保持不动,就形成了流水。

同样,如果使得最左边的灯先亮,然后通过移位,在其右侧的灯,从左向右依次点亮,而已经亮的灯又不灭,便形成了向右的流水灯。

初始状态时,四个灯都不亮,每来一个时钟脉冲,CLK,计数器就加1.这样通过移位依次点亮所有的灯,就形成了流水灯。

而当四个灯都点亮时,需要一个操作使得所有的灯恢复为初始状态。

然后,再一次流水即可。

如果是右移位,就出现向右流水的现象;反之,向左流水。

四、实验要求控制4个LED进行花式显示,根据硬件设施设计两种模式:S0:从全亮到全灭,再到全亮,依次循环;S1:从LED0开始依次点亮,为LED1亮,LED2亮,LED3亮,后再LED2亮,LED1亮,LED0亮,不停循环。

即输出为:S0时,从0000到1111不停循环转换;S1时,0111,1011,1101,1110,1101,1011,0111不断循环。

五、实验步骤(1)建立工程(2)建立Verilog文件,编写相关程序(3)将verilog文件编译为可视化电路图文件(4)将可视化电路图文件添加输入输出组合成电路图文件(5)编译语法及验证原理图(6)根据需要分配管脚并进行编译(7)下载编译后得到的文件.sof(在线方式),.pof(离线方式)。

FPGA流水灯实验

FPGA流水灯实验
通过流水灯的实验实现了串行工作,流水线工作(时间并行),并 行流水线工作(空间并行)。串行工作是 CPU 的工作方式,也就是一 个时间只能做一件事。通过 verilogHDL 完全可以模仿这种工作方式, 也就是说通过 CPU 实现的算法和驱动程序完全可以转换成对应的 verilogHDL。并且结构化程序设计的思想(顺序,选择,循环)也可 以通过 verilogHDL 实现。除了串行工作外,verilogHDL 还有 CPU 很 难实现的流水线(时间并行)和并行处理(空间并行)的优势。当然 现在的多核 CPU 通过多线程编程也可以实现并行处理,但实现相对比 较复杂。FPGA 只要逻辑资源足够多,理论上可以实现无限并行处理。
编写代码的首要任务是管理复杂度,研究表明人能同时关注的智 力模型为 7+2,而嵌套关注通常不超过 5 层。编写一段代码的同时关 注点很容易会超过 9 个。通过智力训练提供关注智力模型数的效果微 乎其微。所以为了能编写任意大规模的代码,把同一时间关注的智力 模型数降低的方法是很有效的。而且软件工程也是在制定相关的编程 规范,对编程限制的基础上发展起来的。VerilogHDL 虽然是硬件描述 语言,但它已经摆脱了原始的电路图输入的方式,具有更高的抽象性, 所以它应该可以应该软件开发中的类似的结论来提高开发效率。就像 高级语言相对于 01 机器码编程一样。我觉得在 verilogHDL 在模仿顺 序操作上更像汇编语言,因为它没有实现顺序,选择,循环结构的相
10
了对 Led_Driver 更高层次的操作,使得操作每个 LED 站在了抽象层, 而不是是底层。
在底层你需要考虑定时器翻转多少次才能到这个时间,然后还要 用这个时间打开或关闭 LED,这样需要考虑的问题很复杂也容易出错。 在抽象层你只需要给什么时候打开或关闭 LED 就够了,它就会自动的 完成翻转工作。抽象性也是人脑处理信息的方式,例如自己的家你甚 至说不清门是什么颜色的,门的把手是什么样式的。人脑对门的处理 是抽象的,它是一个可以开和关的门。你只需要知道这个就可以进入 家中,根本不需要记得门的颜色是什么。

流水灯实验

流水灯实验

流水灯实验一实验目的:通过此次实验,让用户进一步了解,熟悉和掌握CPLD\FPGA开发软件的使用方法及VERILOG HDL的编程方法。

学习简单时序电路的设计和硬件测试。

本实验要求建立可用于控制LED流水灯的简单硬件电路,要求在SMARTSOPC实验箱上实现LED1—LED8发光二极管流水灯。

二实验原理:根据所学知识及实验要求,编程如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_Arith.ALL;USE IEEE.STD_LOGIC_Unsigned.ALL;ENTITY sfwy ISPORT(clk:IN STD_LOGIC;led: OUT STD_LOGIC_VECTOR(7 DOWNTO 0));end;ARCHITECTURE one OF sfwy ISsignal led_r: std_logic_vector(8 DOWNTO 0);signal tmp:std_logic_vector(25 downto 0);signal q:std_logic;beginprocess(clk)beginif clk 'event and clk='1'then tmp<=tmp+1;end if;end process;q<=tmp(25);led<=led_r(7 DOWNTO 0);process(q)beginif q'event and q='1'thenled_r<=led_r(7 DOWNTO 0) & '0';if led_r="000000000" THEN--循环完毕吗?led_r<="111111111";--是,则重新赋初值end if;end if;end process;end one;以上程序首先通过一个进程把所给四兆赫兹的频率计分频为一赫兹,由clk变为clk1,作为该电路的脉冲。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于FPGA的SOPC演示实验秦菁2012-07-10演示实验:流水灯实验内容:将8位LED灯点亮,进行流水灯控制实验步骤:(1)在Quartus II中建立工程(2)用SOPC builder建立Nios系统模块(3)在Quartus II中的图形编辑界面进行引脚连接工作等(4)编译工程后下载到FPGA中(5)在Nios II IDE中根据硬件建立软件工程(6)编译后,经过简单设置下载到FPGA中进行调试、实验随着嵌入式处理器、专用数字器件和DSP算法以IP核的形式嵌入FPGA中,以单片FPGA完成整个嵌入式系统数字部分的设计已经成为现实。

此实验主要通过运用Altera公司提供的Nios II软核处理器,了解SOPC的基本概念和基于FPGA的嵌入式系统的开发方法,掌握SOPC硬件开发工具,软件调试工具的使用。

下面主要从硬件和软件的部分进行介绍。

一、硬件部分设计(1)运行Quartus II软件,选择File/New Project Wizard菜单,选择工程目录(自定义)、工程名以及顶层文件名为led_test,在选择器件设置对话框中选择目标器件为Cyclone系列的EP1C6Q240C8N,建立新工程。

(2)双击左侧Entitiy框中的器件名,弹出如下对话框,点击Device and pin options/Unused pins,在Reserved all unused pins中选择As input tri-stated。

(3)选择Tools/SOPC Builder菜单项,或者点击Quartus II软件右上方工具栏的,打开SOPC Builder程序。

弹出Create New System对话框。

在System Name 文本框中键入nios32(自拟,但与工程名不同),选择语言为VHDL,单击确定(4)确认Device Family中我们选择的是Cyclone,系统频率为50MHz。

如图:(5)下面开始添加系统需要的元件:Nios II32位CPU、JTAG UART Interface、led_pio、RAM。

(5.1)首先添加Nios II32位CPU:双击Nios II Processor,或单击选中后点击Add按钮,然后在弹出的Nios II Processor设置对话框中设置添加CPU的参数,分别在Core Nios II和JTAG Debug Module选项中选择Nios II/e和level1,其他选项保持默认。

Nios II有三种标准:经济型(Nios II/e)、标准型(Nios II/s)、全功能型(Nios II/f)。

本实验中选择经济型。

切换至JTAG Debug Module选项选择level1,其他选项保持默认。

设置完成后单击Finish按钮返回SOPC Builder窗口,重命名为cpu。

注意:命名时,名字必须以英文字母开头,不能以数字开头,能使用的字符有英文字母、数字和下划线“_”,不能连续使用下划线符号,名字也不能以下划线结束。

(5.2)添加JTAG UART,此接口为Nios II系统嵌入式处理器新添加的接口元件,通过它可以在PC主机和SOPC Builder系统之间进行串行字符流通,主要用来调试、下载数据等,也可以作为标准输入/输出来使用。

(5.3)添加内部RAM,RAM作为程序运行空间,类似于计算机的内存。

在左侧选择Memories and Memory Controllers/On-Chip,双击On-Chip Memory(RAM or ROM),弹出如图所示的设置对话框,按图中所示进行设置(系统默认),单击Finish按钮后返回SOPC Builder窗口,重命名为RAM。

(5.4)加入PIO,此元件为I/O口,与单片机中的I/O类似,用户可以根据需要配置设置选项。

在左侧选择Peripherals/Microcontroller Peripherals,双击PIO,在弹出的对话框中做如图所示的设置,重命名为led_pio。

Width为8,表示有8个输出用IO口,分别控制开发板上的8个绿色LED灯(LEDG[7..0])。

(5.5)指定基地址和分配中断号。

SOPC Builder会给用户的Nios II系统模块分配默认的基地址,用户也可以更改这些默认地址。

如下图所示,分别点击system 菜单中的Assign Base Addresses和Assign Interrupt Numbers,让系统自动分配基地址和中断分配号,避免冲突。

(5.6)系统设置。

双击cpu,在弹出的对话框中,分别在Reset Vector:Memory 和Exception Vector:Memory:下拉栏中选择ram。

(6)生成系统模块。

选择System Generation选项卡,单击Generate按钮,则SOPC Builder会根据用户的不同设定,而在生成的过程中执行不同的操作,大约两分钟系统生成,系统生成后单击如果准确无误,会提示System generation was successful,单击Exit推出SOPC Builder。

(7)将刚生成的模块以符号的形式添加到BDF中:在SOPC Builder生成的过程中,会生成系统模块的符号文件,可以将该符号文件像其他Quartus II符号文件一样添加到当前项目的BDF文件中。

SOPC系统生成完毕后,回到Quartus II 软件,选择File->New…,在弹出的对话框中选择Block Diagram/Schematic File,点击OK。

双击空白处,或单击右键,在弹出的快捷菜单中选择Insert/Symbol,打开新对话框,在左侧的列表中选择Project->nios32,单击ok按钮。

(8)按照如图所示连接各个模块。

Nios32元件为刚才使用SOPC Builder生成的片上系统。

共有3组IO口,分别是clk时钟输入、reset_n重启信号输入和LED 信号输出IO口。

再次在空白部分双击,在Name框内输入input,添加输入端口。

一共需要两个。

然后使用同样步骤添加一个ouput输出端口。

双击输入或输出元件可以更改它们的名称。

将两个输入端分别改名为clk及rst,实际与之连接的是开发板上的50MHz晶振和KEY0按钮。

将输出端改名为led_down[7..0],代表开发板上的LEDG7到LEDG0共8个LED灯。

需要注意的是SOPC Builder生成的系统的重启信号为低电平有效,开发板上的按键按下后代表低电平,弹起代表高电平。

然后将这几个元件连接起来,硬件电路部分设计完毕。

(9)连接完成后,选择Processing/Start Compilation选项或者点击工具栏上按钮,开始编译该文件。

编译无误后开始下一步工作。

(10)如果有编辑好的管脚定义文件,则点击Quartus II软件菜单栏上的Assignments->Import Assignments…导入文件,此处我们打开pin planner,按照文件夹中《EP1C6FPGA实验系统中EP1C6的管脚分配.doc》自定义引脚。

(10)定义完成后,需要再次编译工程。

选择Processing/Start Compilation选项或者点击工具栏上按钮,开始编译。

(11)配置FPGA,选择Tools/Programmer菜单或者单击工具栏上的按钮,选择Hardware Setup,选择ByteBlasterMV[LPT1],单击close后,选择Start按钮,开始将编译生成的sof文件下载到目标板上。

二、软件部分设计在FPGA器件配置完要求的硬件后,接下来就需要创建和执行实现期望操作的应用程序。

这个可以用Nios II汇编语言或高级语言如C来书写要求的程序实现。

下面主要在Nios II IDE中利用C语言完成软件部分的设计。

(1)启动Nios II IDE,在开始菜单中选择所有程序/Altera/Nios II EDS11.0/legacy Nios II tools/Nios II11.0IDE命令,打开Nios II IDE软件。

(2)新建工程,选择File->New->Nios II C/C++Application在Select Project Template内选择第一项Blank Project,Name自拟,SOPC Builder System PTF File的设置非常关键,此时应该选择第一步中SOPC Builder生成的.ptf文件,单击后面的browse,找到自己所建的工程所在目录下的nios.ptf文件,点击打开。

注意,Nios II IDE是通过这个.ptf文件与SOPC Builder连接的,也就是说Nios II IDE的软件工程与SOPC Builder建立的系统是一一对应的,如果选错的话Nios II IDE就会连接到其他的系统上,后面的软件设计也会跟着发生错误。

正确选择后,点Next>,在下一个界面中选择第一项,Create a new system library,点击Finish完成。

(3)设置软件工程的属性。

打开软件界面后会看到新建的两个文件夹,第一个是show,一个是show_syslib[nios32],它是对应的软件工程的程序库。

要设置软件工程的属性,右击第一个文件show,选择System Library Properities,进入系统设置界面,Stdout、stderr和stdin是系统的标准输入输出,由于没有添加这方面的IP核,所以默认使用null,将Support C++前面的勾去掉,这里不需要对C++的支持;再将Small C Library前面的勾打上,因为程序运行的空间是在片内的RAM上,它只有20KB的容量,无法运行全部C语言的编译库,所以使用精简后的C语言编译库。

右侧使用默认的ram,设置完毕后单击OK按钮。

(4)软件设计,要求同学们自己编写相应的程序,以实现不同的目的,下附演示实验流水灯的源程序:#include"stdio.h"#include"system.h"#include"altera_avalon_pio_regs.h"#include"alt_types.h"int main(void)__attribute__((weak,alias("alt_main")));int alt_main(void){alt_u8led=0x80;volatile int i;while(1){while(i<500000)i++;led=led>>1;if(led==0x00)led=0x80;led=~led;IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,led);led=~led;i=0;printf("Hello world!\n");}}此处需要注意,我们在程序中可以看到以下一行陌生的代码:IOWR_ALTERA_AV ALON_PIO_DATA(LED_PIO_BASE,led);这个函数的意思是把led变量的值赋给LED_PIO_BASE,LED_PIO_BASE就是曾在SOPC Builder添加的led_pio核的基地址,Nios II使用地址都是用_BASE 表示,一定要用大写,所以此处_BASE前面的名字一定要与前面的led_pio名字一致。

相关文档
最新文档