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

合集下载

基于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语句最大不同。

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

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

Verilog及Xilinx_FPGA入门(一)

Verilog及Xilinx_FPGA入门(一)

Verilog及Xilinx_FPGA⼊门(⼀)⼀、流⽔灯实验;⼀、FPGA的⼯作是基于时钟的,语⾔中⼏乎每处都⽤到了always@(posedge clk),意思是clk上升沿触发⼯作,之后执⾏其下的语句。

⼆、<=⾮阻塞语⾔,并⾏⽅式三、FPGA基本⼯作原理基于LUT查表,查表这也是⼀种特别重要的编程思想,下⾯的流⽔灯实现(⼆)差不多就是这种思想。

(1)实现(⼀)module liushuideng(input clk,input rst,output reg[7:0] led=8'b00000001;);reg[31:0] cnt=0;always@(posedge clk or negedge rst)if(!rst) begin //rst按键按下为低电平led<=8'b00000001;cnt<=0;end else beginif(cnt==32'd100000000) //假如时钟为100MHz 那么32‘d100000000代表1秒钟beginled<={led[6:0],led[7]}; //⾼电平代表点亮灯,实现循环左移位cnt<=0;end else begincnt<=cnt+1;endend(2)实现(⼆)module liushuideng(input clk,input rst,output reg[7:0] led=8'b00000001;);reg[31:0] cnt=0;always@(posedge clk or negedge rst)if(!rst) begin //rst按键按下为低电平led<=8'b00000001;cnt<=0;end else beginif(cnt==32'd800000000)begincnt<=0; //cnt==32'd800000000时重新复位为0end else begincnt<=cnt+1;//每当时钟沿到来时 cnt⾃加1endcase(cnt)32'd800000000:led<=8'b10000000; //cnt为800000000时led==8‘d1*******(8代表位宽//缺省为最⼤位宽)32'd700000000:led<=8'b01000000;32'd600000000:led<=8'b00100000;32'd500000000:led<=8'b00010000; 32'd400000000:led<=8'b00001000; 32'd300000000:led<=8'b00000100; 32'd200000000:led<=8'b00000010; 32'd100000000:led<=8'b00000001;default:;endend。

基于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灯点亮。

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流水灯实验报告

竭诚为您提供优质文档/双击可除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位宽的计数器。

5.1流水灯实践

5.1流水灯实践

第五章FPGA基本实践5.1流水灯实践流水灯的关键设计流水灯工程的vivado 实现5.2数码管动态显示实践数码管动态显示原理分析数码管动态显示设计数码管动态显示工程的vivado 实现数码管动态显示IP 核设计与实现调用IP 核实现动态显示5.3 VGA 显示的实现VGA 显示基本原理VGA 显示设计与实现补充按键行列按键原理行列按键实践5.1 流水灯实践一组发光LED,在控制系统的控制下按照设定的顺序和时间来发亮和熄灭,这样就能形成一定的视觉效果。

如果通过设计,实现LED灯依次点亮,那么就形成流水灯。

本节的内容就是设计这样的控制系统,实现12位流水灯,并进行仿真及下载到电路板验证。

5.1.1 流水灯的关键设计1.状态及其变化(1)状态需要存储当前的状态,12个灯中有一个是亮的,定义12个触发器构成的12位寄存器ledtemp保存当前的状态。

(2)时钟流水灯的流转时间设置为半秒钟(500ms/2Hz)比较合适,系统的唯一时钟来源是由电路板上的有源晶振所产生的时钟连接到FPGA,是50MHz的时钟clk,因此需做25,000,000分频。

(3)状态变化将寄存器ledtemp的初始值设置为12'b0000_0000_0001,divclk的每个上升边沿,对ledtemp进行向左移位,当移到12'b1000_0000_0000之后,再次移位应移为12'b0000_0000_0001。

5.1.1 流水灯的关键设计2.分频设计要进行25,000,000分频,采用计数器的方式。

当计数值达到12,500,000时令divclk翻转,这样divclk的一个周期就是25,000,000个clk时钟周期。

需要一个寄存器变量存储计数值,12,500,000的十六进制是BEBC20为24位,因此需要设计24位以上的寄存器保存计数值。

0->12,500,000->0-> 12,500,000->0-> 12,500,0004.约束设计一个时钟输入12个数码管输出⏹module v1(⏹input clk, //时钟输入⏹output [11:0] led //LED输出⏹);⏹reg[11:0] ledtemp= 12'b0000_0000_0001; //led初始值⏹reg[31:0] divclk_cnt= 0; //32位计数器⏹reg divclk= 0; //低频时钟⏹assign led=ledtemp; //实现将寄存器变量值赋给LED输出⏹parameter halfduty_cntvalue= 12500000;⏹always@(posedge clk) //把系统时钟分频50/2500 0000= 2HZ ⏹begin⏹if(divclk_cnt==halfduty_cntvalue) //计数满后翻转⏹begin⏹divclk=~ divclk;⏹divclk_cnt= 0;⏹end⏹else⏹begin⏹divclk_cnt= divclk_cnt+1'b1;⏹end⏹end⏹仿真⏹仿真文件编写⏹仿真的目的,修改分频值以缩短仿真时间⏹执行仿真⏹编写约束文件代码⏹保存工程⏹综合⏹实现⏹生成比特流文件⏹下载到实验板测试⏹set_property PACKAGE_PIN D4 [get_ports clk]⏹set_property PACKAGE_PIN P9 [get_ports{led[0]}]⏹set_property PACKAGE_PIN R8 [get_ports{led[1]}]⏹set_property PACKAGE_PIN R7 [get_ports{led[2]}]⏹set_property PACKAGE_PIN T5 [get_ports{led[3]}]⏹set_property PACKAGE_PIN N6 [get_ports{led[4]}]⏹set_property PACKAGE_PIN T4 [get_ports{led[5]}]⏹set_property PACKAGE_PIN T3 [get_ports{led[6]}]⏹set_property PACKAGE_PIN T2 [get_ports{led[7]}]⏹set_property PACKAGE_PIN R1 [get_ports{led[8]}]⏹set_property PACKAGE_PIN G5 [get_ports{led[9]}]⏹set_property PACKAGE_PIN H3 [get_ports{led[10]}]⏹set_property PACKAGE_PIN E3 [get_ports{led[11]}]⏹set_property IOSTANDARD LVCMOS33 [get_ports clk]⏹……5.1.2流程灯工程的VIVADO实现有缘学习更多+谓ygd3076或关注桃报:奉献教育(店铺)示实践。

verilog语言循环流水灯LED流水从中间向两边点依次点亮

verilog语言循环流水灯LED流水从中间向两边点依次点亮

verilog语言循环流水灯LED流水从中间向两边点依
次点亮
目的是实现FPGA开发板上的四个LED灯依次点亮,每次只点亮一个,每个点亮时间是0.5s。

输入有时钟和复位信号,一路输出连接到FPGA开发板上的四个LED灯。

设置输出信号位宽四位宽,刚好一个位宽控制一个LED灯亮灭。

需要设置一个中间变量计数器,初值为0,因为50MHz晶振,0.5秒计数为25000000,从0开始计数,所以计数器计数最大值为24_999_999,当计数器在复位信号无效或计数到最大值时,对计数器进行清零操作。

再设置一个计数标致信号,在计数器计数到最大值时,拉高一个时钟周期的高电平,其他时刻保持低电平。

led灯是低电平点亮,所以想要第一个灯点亮就需要对输出信号赋初值1110,然后当计数标致信号为高电平且复位信号无效时,赋值为1101,下一个周期为1011,再下一个周期为0111,然后再是1110,这样就实现了流水灯效果。

这里需要用到移位操作,但需要注意的是在移位过程中,补位补的是0,及1101,1010,0100,1000,0000这就意味着最后所有灯都处于被点亮的状态,与目标不符。

于是再定义一个新的变量,对输出信号进行寄存。

初值为0001,接下来是0010,0100,1000,0001,输出信号对这个变量取反就可以得到预期结果。

计数到最大值时归零,计数器标致信号在最大值处拉高一个时钟周期,led输出与预期吻合。

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芯片,引脚锁定方法见下表,将未使用的引脚设置为三态输入。

基于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在第四篇讲译码器的文章里,我们介绍过,如果需要调用/例化子模块时,需要将各子模块与大模块放入同一个工程文件下进行编译。

实例教学六 流水灯 CPLD FPGA可编程逻辑器件

实例教学六 流水灯 CPLD FPGA可编程逻辑器件

end clkdiv_stru;
end clkdiv_stru;
16进制计数器
entity counter is port( reset: in std_logic; clock: in std_logic; Q: out std_logic_vector(3 downto 0) ); end counter;
end clkdiv_stru;
VHDL语法
——信号的数据类型

已学:std_logic(标准逻辑位)、std_logic_vector (标准逻辑矢量)

整型 integer

VHDL提供了一个预定义整型数据类型,即integer。 integer类型数据的取值范围:

-2,147,483,647~+2,147,483,647。
entity clkdiv is
clk: in std_logic;
q: buffer std_logic; ); end clkdiv; );
state: in std_logic_vector(3 downto 0); Y: out std_logic_vector(7 downto 0)
end decoder ;
entity clkdiv is port( clk: in std_logic; q: buffer std_logic; ); end clkdiv; 1/8分频器 实体部分 不变
entity clkdiv is port( clk: in std_logic; q: buffer std_logic; ); end clkdiv; 1/50000000分频器
流水灯 的VHDL设计
桂林师范高等专科学校 羊日飞

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

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

FPGA入门系列实验教程——LED流水灯1.实验任务让实验板上的8个LED实现流水灯的功能。

通过这个实验,进一步掌握采用计数与判断的方式来实现分频的VHDL的编程方法以及移位运算符的使用。

2.实验环境硬件实验环境为艾米电子工作室型号EP2C8Q208C8增强版开发套件。

软件实验环境为Quartus II8.1开发软件。

3.实验原理流水灯,顾名思义就是让LED象水一样的点亮。

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

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

初始状态时,8个灯都不亮。

每来一个时钟脉冲CLK,计数器就加1。

每当判断出计数器中的数值达到25000000时,就会点亮一个灯,并进行移位。

FPGA输出的数据就应该首先是10000000,隔1秒钟变成11000000……一直变化到11111111,这样,依次点亮所有的灯,就形成了流水灯。

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

然后,再一次流水即可。

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

4.实验程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity LED isport(clk:in std_logic;//设置时钟输入dout:out std_logic_vector(7downto0));//8位端口输出end LED;architecture behave of LED issignal p:std_logic_vector(31downto0);//信号变量signal t:std_logic_vector(8downto0);beginprocess(clk)beginif(clk'event and clk='1')then//判断上升沿信号p<=p+1;if(p=25000000)thent(8downto1)<=t(7downto0);//将低8位移至高8位t(0)<='1';//最地位置1p<="00000000000000000000000000000000";end if;if(t(8)='1')thent<="000000000";end if;end if;end process;dout<=t(7downto0);//将低8位赋给输出端口end behave;代码分析:先定义一个二进制32位的信号变量P和一个9位的信号变量t,时钟每产生一个上升沿的时钟跳变,P自动加1。

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流水灯实验报告

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

FPGA流水灯实验

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

用FPGA实现的流水灯VHDL代码

用FPGA实现的流水灯VHDL代码
双击 Boundary Scan,在右边空白处单击右健,选择 Initialize Chain
双击图标选择 bit 文件。右键图标选 择
可编辑
-------------精选文档-----------------
Program
可编辑
-------------精选文档-----------------
设计目的:
在 8 盏 LED 灯每隔一秒钟顺序循环提供高电平使 LED 亮,复位键使 LED 全部置低电平使 LED 灭,重新进行流ED(1) LED(2) LED(3) LED(4) LED(5) LED(6) LED(7)
entity LED_FLASH_VHD is Port ( clk : in STD_LOGIC;
可编辑
-------------精选文档-----------------
rst : in STD_LOGIC; LED_RUN : out STD_LOGIC_VECTOR (7 downto 0)); end LED_FLASH_VHD;
其中 cnt 实现记数功能,对时钟进行分频。 Step 实现让具体哪一盏灯亮。 使用引脚: 复位 rst(Y18)、时钟 clk(D11)、LED 灯(N19、 N15、 R20、R18、U20、
T18、U18、W20);
具体设计:
1、 打开设计软件 Xilinx ISE 11,新建工程 2、 新建 VHDL Module 设置代码,对时钟进行分频: library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL;
可编辑

Quartus下LED流水灯实验步骤详细指导

Quartus下LED流水灯实验步骤详细指导

01.Quartus下LED流水灯实验1.软件界面菜单栏编译窗口:左边编译窗口综合布局布线生成下载文件时域分析用户设置的文件软件自带的IP打印信息软件界面2.创建工程File——新建工程——点击下一步添加工程路径,新建一个文件夹,英文名字命名,路径不能出现任何中文,点击下一步,下一步,下一步,点击芯片型号:cyclone IV E引脚数是:256速度等级:8下一步,下一步,finish EP4CE6F17C83.新建文件可以点击新建文件快捷键选择verilog HDL File点击OK。

4.复制文件将例子中的.V文件复制进来,保存,取名位为:led_test.v 取名与模块名字一样,选择file,将文件设置为顶层实体,设置为顶层实体在Assignments——Device将不用的引脚设置为:输入三态将多用途的引脚设置为普通的IO,双击可修改电压,板子上基本上都是3.3V-LVTTL,点击OK,OK5.引脚绑定此时是没有引脚的先进行综合,点击综合按钮等待综合完毕,打开可以看到引脚已经出现在location 列填写引脚,不需要保存,可以直接关闭该窗口6.编译点击编译按钮,等待片刻可以看到编译窗口的进度编译完毕,就可以将程序下载到开发板里7.下载程序拿出开发板AX3010,断电插拔连接JTAG找到下载按钮programmer确定之后Start按钮就可用了双击可以选中文件.sof文件点击start.SOF文件断电会消失,可以写flash文件,通过写flash文件使得每次FPGA重新上电后从FLASH读取数据,可以从file——转换下载文件里将下载的文件类型修改,修改为.jic文件点击flash loader点击右边的添加找到cyclone IV E ——EP4CE6点击SOF,添加文件,将上一步生成的.SOF文件添加进来,生成成功后可以看到文件夹下有。

打开programe添加.jic文件将flash进行擦除将程序下载到program里面将FPGA重新上电,就可以得到流水灯,断电再上电,也一样不会丢失。

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

艾米电子工作室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的学习方法。

本实验教程的所有实例均在艾米电子工作室开发套件上验证通过,本教程虽然简单但编写也花费了作者大量的时间和精力,对于转载需要注明出处:(艾米电子工作室作者:静水流深),并未经艾米电子工作室同意不得用于其他商业用途。

FPGA技术是不断发展变化的,要掌握FPGA技术的精髓,需要设计者在实践中不懈地摸索与积累,逐步提高自己的设计水平,本实验教程试图对初学者起到快速入门的作用。

但由于作者学习FPGA时间不长,水平有限,错漏和不严谨之处在所难免,欢迎大家批评指正。

并请您将阅读中发现的错误或建议发送到作者Email:zhoujie9220@,以使本教程不断地完善。

FPGA入门系列实验教程——LED流水灯
1.实验任务
让实验板上的8个LED实现流水灯的功能。

通过这个实验,进一步掌握采用计数与判断的方式来实现分频的Verilog HDL的编程方法以及移位运算符的使用。

2.实验环境
硬件实验环境为艾米电子工作室型号EP2C8Q208C8增强版开发套件。

软件实验环境为Quartus II8.1开发软件。

3.实验原理
流水灯,顾名思义就是让LED象水一样的点亮。

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

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

初始状态时,8个灯都不亮。

每来一个时钟脉冲CLK,计数器就加1。

每当判断出计数器中的数值达到25000000时,就会点亮一个灯,并进行移位。

FPGA输出的数据就应该首先是10000000,隔1秒钟变成11000000……一直变化到11111111,这样,依次点亮所有的灯,就形成了流水灯。

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

然后,再一次流水即可。

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

4.实验程序
module ledwater(clk,led);//模块名及端口参数
output[7:0]led;//输出端口定义
input clk;//输入端口定义,50M时钟
reg[8:0]led_out;//变量led_out定义为寄存器型
reg[8:0]led_out1;//变量led_out1定义为寄存器型
reg[25:0]buffer;//中间变量buffer定义为寄存器型
always@(posedge clk)
begin
buffer=buffer+1;
if(buffer==26'd2*******)//判别buffer数值为25000000时,做输出处理
begin
led_out=led_out<<1;//led向左移位,空闲位自动添0补位
if(led_out==9'b000000000)
led_out=9'b111111111;
led_out1=~led_out;//取反输出
end
end
assign led=led_out1[7:0];
endmodule
5.实验步骤
(1)建立新工程项目:
打开Quartus II软件,进入集成开发环境,点击File→New project wizard建立一个工程项目ledwater。

(2)建立文本编辑文件:
点击File→New在该项目下新建Verilog HDL源程序文件ledwater.v,
输入试验程序中的源程序代码保存后选择工具栏中的
按钮,配置led[0]---led[7]以及clk的引脚。

上述配置引脚的方法适合引脚比较少的项目,对于引脚比较多的工程项
目,分配起来就比较麻烦了,下面介绍一种方便快捷的引脚分配方法。

a.首先建立一个TCL Script文件:点File→New选择Design Files选项
卡里面的Tcl Script File,如下图所示:
b.点击ok,输入下面的代码:
#Pin_Setup.tcl
#Setup pin setting
set_global_assignment-name RESERVE_ALL_UNUSED_PINS"AS INPUT TRI-STATED"
set_global_assignment-name ENABLE_INIT_DONE_OUTPUT ON
set_location_assignment PIN_23-to clk
set_location_assignment PIN_75-to led[0]
set_location_assignment PIN_76-to led[1]
set_location_assignment PIN_89-to led[2]
set_location_assignment PIN_94-to led[3]
set_location_assignment PIN_92-to led[4]
set_location_assignment PIN_97-to led[5]
set_location_assignment PIN_102-to led[6]
set_location_assignment PIN_101-to led[7]
比较简单的代码,简单的讲解一下,第一行和第二行是注释,第四行的意思是设置不用的引脚为三态输入,第五行的意思是打开INIT_DONE输出。

后面的几行分别是锁定clk和8个led的引脚。

c.在Quartus II主界面中选择File→Save As保存这个文档,软件会自动把它加
到项目里面。

d.在Quartus II主界面中选择点Tools->TCL Scripts...,出现下图所示这个界面:
e.选中你刚才建好的Tcl文件,点击Run。

f.你可以选择Assignments→Pins或选择工具栏上
怎么样这种方法是不是比以前的方法快多了!这个文件你可以适当修改用于别的项目,如果引脚一样也可以直接在别的项目中加入这个文件然后执行,可以省很多事情。

(5)编译工程项目:
在Quartus II主页面下,选择Processing—Start Compilation或点击工具
栏上的。

相关文档
最新文档