流水灯基于Verilog语言实现及测试代码
流水灯实验报告

实验二流水灯一、实验目的通过此实验进一步了解,熟悉FPGA开发软件的使用方法及V erilog.HDL,的编程方法;学习简单时序电路的设计。
二、实验原理和内容实验内容:在实验板上实现LED1~LED8发光二极管流水灯显示实验原理:在LED1~LED8引脚上周期性地输出流水数据,如原来输出的数据是11111100则表示点亮LED1,LED2,流水一次后,输出数据应该为11111000,而此时则应点亮LED1~LED3三个LED发光二极管,这样就可以实现LED流水灯,为了观察方便,流水速率最好在2Hz左右。
在QuickSOPC核心板上有-48MHz的标准时钟源,该时钟脉冲CLOCK 与芯片的28脚相连,为了产生2Hz的时钟脉冲,在此调用了一个分频模块int_div模块,通过修改分频系数来改变输出频率,int-div模块是一个占空比为50%的任意整数分频器。
三、实验步骤1,启动QuartusⅡ建立一个空白工程,然后命名为led-water.qpf。
2,新建V erilog HDL源程序文件ledwater.v,输入程序代码并保存,然后进行综合编译。
若在编译过程中发现错误,则找出并更正错误,直至编译成功为止。
3,从设计文件创建模块,由ledwater.v生成名为ledwater.bsf的模块符号文件。
4,将光盘中EDA-Component目录下的int-div.bsf和int-div.v拷贝到工程目录。
5,新建图形设计文件命名为led-water.bdf并保存。
在空白处双击鼠标左键,在Symbol对话框左上角的libraries.v中,分别将project下的ledwater和int-div模块放在图形文件led-water.bdf中,加入输入,输出引脚,双击各引脚符号进行引脚命名。
将与ledwater模块led[7..0]连接的引脚命名为led[7..0],与int-div模块clock连接的引脚命名为clock,int-div模块的clk-out与ledwater模块的clk相连接。
基于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位宽的计数器。
流水灯控制的实验报告

流水灯控制的实验报告
《流水灯控制的实验报告》
实验目的:通过对流水灯控制的实验,掌握流水灯的原理和实现方法,加深对
电子电路控制的理解。
实验设备:Arduino开发板、LED灯、面包板、导线等。
实验步骤:
1. 连接电路:将LED灯连接到Arduino开发板的数字引脚上,通过面包板和导
线连接。
2. 编写代码:使用Arduino IDE编写代码,实现流水灯的控制逻辑。
代码中需
要包括LED灯的引脚定义、控制流水灯的循环逻辑等。
3. 上传程序:将编写好的代码上传到Arduino开发板上,进行实际的控制操作。
4. 测试效果:观察LED灯的亮灭情况,检验流水灯控制的效果。
实验结果:通过实验,成功实现了对流水灯的控制。
LED灯按照设定的流水灯
效果进行亮灭,实现了预期的控制效果。
实验分析:流水灯控制实验是一种常见的电子电路控制实验,通过这个实验可
以加深对Arduino开发板以及LED灯的控制原理的理解。
同时,通过编写代码
实现流水灯的控制,也可以提高对编程逻辑的理解和掌握。
实验总结:通过本次实验,我对流水灯的控制原理和实现方法有了更深入的了解,同时也加深了对电子电路控制和编程的理解。
这对我今后的学习和实践都
有很大的帮助。
结语:流水灯控制的实验报告告诉了我们,通过实际操作和实验,我们可以更
深入地理解和掌握电子电路控制的原理和方法。
这对我们的学习和实践都有着
重要的意义。
fpga流水灯实验报告

fpga流水灯实验报告篇一:vhdl流水灯课程设计报告院系:姓名:学号:课程设计名称:指导老师:时间:摘要VHDL的特点应用VHDL进行系统设计,有以下几方面的特点。
(一)功能强大VHDL具有功能强大的语言结构。
它可以用明确的代码描述复杂的控制逻辑设计。
并且具有多层次的设计描述功能,支持设计库和可重复使用的元件生成。
VHDL是一种设计、仿真和综合的标准硬件描述语言。
(二)可移植性VHDL语言是一个标准语言,其设计描述可以为不同的EDA工具支持。
它可以从一个仿真工具移植到另一个仿真工具,从一个综合工具移植到另一个综合工具,从一个工作平台移植到另一个工作平台。
此外,通过更换库再重新综合很容易移植为ASIC设计。
(三)独立性VHDL的硬件描述与具体的工艺技术和硬件结构无关。
设计者可以不懂硬件的结构,也不必管最终设计实现的目标器件是什么,而进行独立的设计。
程序设计的硬件目标器件有广阔的选择范围,可以是各系列的CPLD、FPGA及各种门阵列器件。
(四)可操作性由于VHDL具有类属描述语句和子程序调用等功能,对于已完成的设计,在不改变源程序的条件下,只需改变端口类属参量或函数,就能轻易地改变设计的规模和结构。
(五)灵活性VHDL最初是作为一种仿真标准格式出现的,有着丰富的仿真语句和库函数。
使其在任何大系统的设计中,随时可对设计进行仿真模拟。
所以,即使在远离门级的高层次(即使设计尚未完成时),设计者就能够对整个工程设计的结构和功能的可行性进行查验,并做出决策。
VHDL的设计结构VHDL描述数字电路系统设计的行为、功能、输入和输出。
它在语法上与现代编程语言相似,但包含了许多与硬件有特殊关系的结构。
VHDL将一个设计称为一个实体Entity(元件、电路或者系统),并且将它分成外部的可见部分(实体名、连接)和内部的隐藏部分(实体算法、实现)。
当定义了一个设计的实体之后,其他实体可以利用该实体,也可以开发一个实体库。
时序流水灯实验报告

一、实验目的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灯的亮灭顺序是否符合预期。
可控流水灯的设计-EDA技术应用(Verilog语言版)课件 PPT

第5章 可控流水灯设计
目录
5.1 项目需求分析 5.2 项目理论知识 5.3 项目设计 5.4 项目实施与调试 5.5 项目总结与拓展
5.1 项目需求分析
控制16个LED灯进行流水灯显示.设计4种显示模 式状态: (1)从左到右逐个点亮LED灯; (2)从右到左逐个点亮LED灯; (3)从中间到两边逐个点亮LED灯; (4)从两边到中间逐个点亮LED灯. 4种模式状态循环切换,由复位键Rst控制系统的运 行与停止.
一、电路调试 (1)根据项目需要引入20MHz时钟源; (2)接通电源,观察16个LED灯的闪烁状态,看是否随时钟变化进行4个 显示状态 切换. 二、故障分析与排除 1.LED 灯显示不正确 故障原因:状态机输出不正确,外围电路引脚配置错误. 故障排除:检查状态转换时输出的设置,如果不正确,重新根据状态对输出 进行设置. 如果正确,检查外围电路引脚配置顺序. 2.状态切换不正确 故障原因:状态转换工作不正常. 故障排除:首先检查当前状态(现态)的设置是否正确,如果不正确,重新设 置当前状 态;如果正确,则检查下一个状态(次态)的设置是否正确.
5.3.1 项目功能分析
5.3.2 项目软件设计
采用文本输入法,使用VerilogHDL语言描述可控流水灯设计
5.4 项目实施与调试
5.4.1 项目实施 5.4.2 项目调试
5.4.1 项目实施
一、设计输入 1.建立工程 2.建立设计文件 二、设计处理2.1 有限状态机
建立有限状态机主要有2种方法:状态转移图(状态 图)和状态转移表(状态表).
5.2.2 有限状态机的设计
一、典型的状态机
二、有限状态机的描述方法 (1)一段式FSM 描述方法 (2)两段式FSM 描述方法 (3)三段式FSM 描述方法
VerilogHDL流水灯设计
V e r i l o g H D L流水灯设计(总4页)--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--大规模数字逻辑题目:流水灯控制专业电子信息科学与技术班级学号学生姓名设计时间教师评分2013年 12 月 10 日目录一、概述 0二、设计目的 0三、设计内容 0四、设计原理图 0五、引脚分配情况 (1)六、源程序代码 (1)VerilogHDL 程序: (1)分频器部分: (1)七、心得体会 (1)八、参考文献 (1)一、概述流水灯是一串按一定的规律像流水一样连续闪亮,流水灯控制是可编程控制器的一个应用,其控制思想在工业控制技术领域也同样适用。
流水灯控制可用多种方法实现,但对现代可编程控制器而言,基于EDA技术的流水灯设计也是很普遍的。
二、设计目的1、熟悉利用Quartus II 开发数字电路的基本流程和Quartus II 软件的相关操作。
2、掌握基本的设计思路,软件环境参数配置,仿真,管脚分配,利用JTAG/AS进行下载等基本操作。
3、了解VerilogHDL 语言设计或原理图设计方法。
4、通过本此设计,了解流水灯的工作原理,掌握其逻辑功能及设计方法。
三、设计内容1、用VerilogHDL语言设计一个流水灯,输入0的时候led~led7,1Hz正向流水3次,然后全亮;然后2Hz逆向流水5次全亮;循环。
输入1的时候led0~led7,奇数流水2次,全亮,1Hz偶数流水4次,全亮,然后循环。
2、用QuartusII 软件进行编译,仿真,下载到实验平台进行验证。
四、设计原理图en为可调输入,输出为8位数据,为流水灯实验,试用8个LED指示灯来表示,具体引脚分配见下。
五、引脚分配情况六、源程序代码VerilogHDL 程序:module LED( clk,led,en );input clk;input en;output [7:0]led;国大学生电子设计获奖作品汇编[J].北京理工大学出版社,2005。
Verilog关于LED控制程序几例
1.下面的这段程序是通过Verilog语言编写程序实现让LED点亮的功能。
有两种方法可以参考。
(A)利用连续赋值语句assign实现,文件名ledlight1.v程序代码:module ledlight1 (LED);output [7:0] LED;assign LED=8’b10101010;endmodule(B)利用过程赋值语句来实现,文件名ledlight2.v程序代码:module ledlight2 (LED);output [7:0] LED;reg [7:0] LED;alwaysbeginLED=8'b10101010;endendmodule=============================================================2.下面的这个程序是用Verilog语言控制8个数码管(共阳)接法,然后让它们隔一段时间(大约是1S)亮,然后隔一段时间又灭的一个程序。
很简单的几句。
module shumaguanliangmie (LED,CLK);output[7:0] LED;input CLK;reg [7:0] LED;reg [24:0] counter;always@(posedge CLK) //在时钟负延跳变,也就是计数什么的begincounter<=counter+1; //计数器加1if(counter==25'b1_0111_1101_0111_1000_0100_0000) //这个数就是25000000beginLED<=~LED; //求反,闪烁counter<=0; //重新计数endendendmodule=================================================================3.下面的这个程序是用Verilog语言控制8个数码管(共阳)接法,然后让它们隔一段时间(大约是1S)依次点亮,然后循环,意思就是一个流水灯程序。
Vivado实验01_流水灯仿真实验及下板步骤
一、新建工程1. 打开Vivado ,界面如下:2. 点击上述界面中的Create New Project ,弹出新建工程向导,依次点击Next:3.板卡选项分别为Family: Artix-7Sub-Family: Artix-7Package: csg324Speed grade: -1Temp grade: C于是,Part选择xc7a100tcsg324-1,然后下一步点击Next Finish;二、设计文件输入1.如下图,点击输入设计程序:2.如下图,选择新建文件,依次创建4个verilog文件,文件名依次为:clock_div; ctc; s_74ls138; led_light注意:最后一个为顶层文件,文件名与项目的文件名相同,且所有名称中不能出现中文、空格和符号3.双击打开,然后输入依次设计程序:注意:每次输入一个设计程序最好保存一次,保存操作如下图然后重复步骤,将4个设计程序依次输入保存4.添加仿真文件:5.进入仿真,点击 Run Simulation Run Behavioral Simulation6.调节缩小按钮,将间隔调节为1s,方便观察实验结果,然后点击上方运行按钮进行仿真,接着点击弹出的信息条的Background将其隐藏,即可看到完整的仿真循环结果7.仿真结果如下图:三、下板操作1.仿真完成后,先关闭仿真,操作如下图:2.接着进行下一步综合,如下图操作:3.综合处成功后,要进行实现操作,如下图:4.实现成功后进行下一步,管脚约束,操作如下图:注意:此处需用到板卡手册,请使用老师群共享的文件“Nexys4-DDR_r m”,此为配适的较新版本,否则可能出现错误5.约束文件生成后,更改为I/O操作界面:6.此处不能使用默认电压值,否则会报错,更改电压值为,然后将时钟引脚接至E3,复位引脚接至C12,y0至y7输出接至V16、T15、U14、T16、V15、V14、V15、V11,引脚的连接方式有三种,所有操作如下图:7.约束完成后,关闭保存:8.在源程序文档中的约束文件中可以看到刚才操作生成的约束文件,也可以直接在约束文件中直接输入代码来完成管教的约束和更改:9.约束完成后,生成编程文件:10.此时需要连接板卡到电脑,在此之前需要对板卡进行设置:11.连接电脑,打开电源开关,等待驱动安装完成后,打开Hardware Manager Open a new hardware target 在跳出的提示框中一直点击Next,不需更改,直到Finish Program device 选择板卡xc7a100t_0 在跳出的选择框中点击ok,这时就可以观察到仿真结果中的流水灯效果,以上为识别板卡到把编程文件下载到板卡的无脑操作,具体步骤请看下图:12.观察到板卡上的实验结果正确后,实验到此结束,关闭板卡的电源开关,拔出板卡,以上。
流水灯的实验代码
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity liu isport (clk:in std_logic;s:in std_logic_vector(3 downto 0);led7s:out std_logic_vector(6 downto 0); zd:out std_logic;q:out std_logic_vector(7 downto 0));end;architecture decl of liu issignal mode:std_logic_vector(2 downto 0); signal mode1:std_logic_vector(2 downto 0); beginprocess(clk,mode)variable qs:std_logic_vector(7 downto 0); beginif rising_edge(clk) thenif mode=0 thenif qs=0 thenqs:="10000000";elsif qs="11111111" thenqs:="00000000";mode1<="001";elseqs(6 downto 0):=qs(7 downto 1);end if;elsif mode=1 thenif qs=0 thenqs:="00000001";elsif qs="11111111" thenqs:="00000000";mode1<="010";elseqs(7 downto 1):=qs(6 downto 0);end if;elsif mode=2 thenif qs=0 thenqs:="10000001";elsif qs="11111111" thenqs:="00000000";mode1<="011";elseqs(6 downto 4):=qs(7 downto 5);qs(3 downto 1):=qs(2 downto 0);elsif mode=3 thenif qs=0 thenqs:="00011000";elsif qs="11111111" thenqs:="00000000";mode1<="100";elseqs(7 downto 5):=qs(6 downto 4);qs(2 downto 0):=qs(3 downto 1);end if;elsif mode=4 thenif qs=0 thenqs:="10000000";elsif qs="00000001" thenqs:="00000000";mode1<="101";elseqs(6 downto 0):=qs(7 downto 1);qs(7):='0';end if;elsif mode=5 thenif qs=0 thenqs:="00000001";elsif qs="10000000" thenqs:="00000000";mode1<="110";elseqs(7 downto 1):=qs(6 downto 0);qs(0):='0';end if;elsif mode=6 thenif qs=0 thenqs:="00011000";elsif qs="10000001" thenqs:="00000000";mode1<="111";elseqs(7 downto 5):=qs(6 downto 4);qs(4):='0'; qs(2 downto 0):=qs(3 downto 1);qs(3):='0'; end if;elsif mode=7 thenif qs=0 thenqs:="10000001";elsif qs="00011000" thenqs:="00000000";mode1<="000";qs(6 downto 4):=qs(7 downto 5);qs(7):='0'; qs(3 downto 1):=qs(2 downto 0);qs(0):='0'; end if;end if;end if;q<=qs;end process;process(s,mode1)beginif s(3)='0' thenmode<=mode1;elsemode<=s(2 downto 0);end if;end process;zd<=s(3);process(mode)begincase mode iswhen "000" =>led7s<="0000110";when "001" =>led7s<="1011011";when "010" =>led7s<="1001111";when "011" =>led7s<="1100110";when "100" =>led7s<="1101101";when "101" =>led7s<="1111101";when "110" =>led7s<="0000111";when others=>led7s<="0111111";end case;end process;end;。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
百度文库 - 让每个人平等地提升自我
4
流水灯实验的Testbench报告
一、 设计源码(顺序方法)
module led(
input clk,
input rstn,
output reg[3:0]led
);
parameter T1s = 4'd10;
reg[3:0]cnt_1s;
always@(posedge clk or negedge rstn)
if(!rstn)begin
cnt_1s <= 0;
end
else if(cnt_1s == T1s)begin
cnt_1s <= 0;
end
else begin
cnt_1s <= cnt_1s + 1'b1;
end
always@(posedge clk or negedge rstn)
if(!rstn)begin
led <= 4'hf;
end
else if(led == 4'hf) begin
led <= 4'he;
end
else if(cnt_1s == T1s)begin
led <= {led[2:0],1'b1};
end
endmodule
二、 测试代码
`timescale 1 ns/1 ns
module led_tb();
reg clk ;
reg rstn;
wire[3:0] led;
parameter CYCLE = 20;
parameter RST_TIME = 3 ;
百度文库 - 让每个人平等地提升自我
4
led u( .clk (clk ),
.rstn (rstn ),
.led (led )
);
initial begin
clk = 0;
forever
#(CYCLE/2)
clk=~clk;
end
initial begin
rstn = 1;
#CYCLE;
rstn = 0;
#(CYCLE*RST_TIME);
rstn = 1;
end
endmodule
Testbench设计的几个步骤:
1、 设定时间标尺、timescale;
2、 定义信号类型,与输入对接的reg,与输出对接的wire;
3、 对待测设计的顶层模块进行例化,即将testbench与待测设计接口对接;
4、 给输入接口产生激励。
三、 结果分析
老师的源代码中设置的流水灯跳转周期是1S钟,但是在仿真的过程中,1S
实在是太漫长了,所以我将跳转周期改为10个时钟周期了。
百度文库 - 让每个人平等地提升自我
4
根据testbench可知,第一个时间周期结束,拉低复位信号。复位信号
产生低电平,always块得到反应,led=4’hf(即1111);每次clk上升沿的时候
always都会响应,但是rstn为低电平时,计数的变量cnt_1s会一直清零,led
一直处于全灭状态。我在TESTBENCH中设置的rstn拉低持续3时钟周期,3
时钟周期后,rstn会变成高电平,在下一个clk上升沿,always又开始响应,
根据设计当led原状态为1111,触发后会跳转为1110,即第一个led亮。
之后,按设计初衷应该是每过10个时钟周期,led产生一次流水式变
化,但实际情况并非如此。
我们可以看到上图中黄线位置,led由0111经过10个时钟周期后变成
1111,但是1111只持续了一个周期就变成了1110.原来,在第二个always
中有这么一句
else if(led == 4'hf) begin
led <= 4'he;
end
虽然计时变量cnt_1s未满足条件,但是led==1111,仍然会使led发生
改变。
而且led==1111时,led是处于全灭状态,作为流水灯应该是不希望全
灭状态的出现,第四个灯亮完,应该马上跳转到第一个灯。即便如此在实
物电路中,这并不会影响功能的实现,因为多出的这一个时钟周期仅为20ns,
人的肉眼根本无法识别。
四、 程序优化
试想如果这不是一个流水灯实验,而是一个对精度有很高要求的电路,
不允许出现这么一段全1的状态,那么程序该如何修改?
其实led全为1的状态,主要是由于第二个always模块产生,所以只用
修改第二个always的内容,下面是我修改后的代码,和运行结果。
这段代码主要的关键就在于阻塞赋值。
百度文库 - 让每个人平等地提升自我
4
修改后:
运行结果:
对比运行结果,我们很容易发现,led没有再出现全1的状态,而是标
准的按照10个时钟周期跳转一次,达到预期效果。