流水灯基于Verilog语言实现及测试代码
- 格式:docx
- 大小:49.85 KB
- 文档页数:4
实验二流水灯一、实验目的通过此实验进一步了解,熟悉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流水灯实验报告一、实验目的熟练该软件的操作的同时,学会用VHDL语言来编程流水灯的制作二、实验步骤1、VHDL原程序:library ieee;use ieee.std_logic_1164.ALL;use ieee.std_logic_arith.ALL;use ieee.std_logic_unsigned.ALL;entity lsd isPort ( clk2,en2: in STD_LOGIC;lsd_out : out STD_LOGIC_VECTOR(15 downto 0));end lsd;architecture liushuideng of lsd issignal n:STD_LOGIC_VECTOR(3 downto 0);signal m:std_logic_vector(1 downto 0); signal k:std_logic;beginprocess(clk2,en2)beginif clk2'event and clk2='1'thenif en2='1' thenif m= thenm<=;k<=not k;else m<=m+;end if;end if;end if;end process;process(k)beginif k'event and k='1' thencase n iswhenlsd_out<=whenlsd_out<=when 0=>lsd_out<=when 1=>lsd_out<=when 0=>lsd_out<=when 1=>lsd_out<=when 0=>lsd_out<=when 1=>lsd_out<=when @0=>lsd_out<=when @1=>lsd_out<=when A0=>lsd_out<=when A1=>lsd_out<=when H0=>lsd_out<=when H1=>lsd_out<=0000000000000;when I0=>lsd_out<=0000000000000;when I1=>lsd_out<=@0000000000000;end case;n<=n+end if;end process;end liushuideng;2、实验过程:1)打开quartus软件,建立一个新工程,命名为liushuideng,在文件处新建一个VHDL File,编写程序。
基于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灯的控制原理的理解。
同时,通过编写代码
实现流水灯的控制,也可以提高对编程逻辑的理解和掌握。
实验总结:通过本次实验,我对流水灯的控制原理和实现方法有了更深入的了解,同时也加深了对电子电路控制和编程的理解。
这对我今后的学习和实践都
有很大的帮助。
结语:流水灯控制的实验报告告诉了我们,通过实际操作和实验,我们可以更
深入地理解和掌握电子电路控制的原理和方法。
这对我们的学习和实践都有着
重要的意义。
一、实验目的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流水灯实验报告篇一:vhdl流水灯课程设计报告院系:姓名:学号:课程设计名称:指导老师:时间:摘要VhDL的特点应用VhDL进行系统设计,有以下几方面的特点。
(一)功能强大VhDL具有功能强大的语言结构。
它可以用明确的代码描述复杂的控制逻辑设计。
并且具有多层次的设计描述功能,支持设计库和可重复使用的元件生成。
VhDL是一种设计、仿真和综合的标准硬件描述语言。
(二)可移植性VhDL语言是一个标准语言,其设计描述可以为不同的eDA工具支持。
它可以从一个仿真工具移植到另一个仿真工具,从一个综合工具移植到另一个综合工具,从一个工作平台移植到另一个工作平台。
此外,通过更换库再重新综合很容易移植为AsIc设计。
(三)独立性VhDL的硬件描述与具体的工艺技术和硬件结构无关。
设计者可以不懂硬件的结构,也不必管最终设计实现的目标器件是什么,而进行独立的设计。
程序设计的硬件目标器件有广阔的选择范围,可以是各系列的cpLD、FpgA及各种门阵列器件。
(四)可操作性由于VhDL具有类属描述语句和子程序调用等功能,对于已完成的设计,在不改变源程序的条件下,只需改变端口类属参量或函数,就能轻易地改变设计的规模和结构。
(五)灵活性VhDL最初是作为一种仿真标准格式出现的,有着丰富的仿真语句和库函数。
使其在任何大系统的设计中,随时可对设计进行仿真模拟。
所以,即使在远离门级的高层次(即使设计尚未完成时),设计者就能够对整个工程设计的结构和功能的可行性进行查验,并做出决策。
VhDL的设计结构VhDL描述数字电路系统设计的行为、功能、输入和输出。
它在语法上与现代编程语言相似,但包含了许多与硬件有特殊关系的结构。
VhDL将一个设计称为一个实体entity(元件、电路或者系统),并且将它分成外部的可见部分(实体名、连接)和内部的隐藏部分(实体算法、实现)。
当定义了一个设计的实体之后,其他实体可以利用该实体,也可以开发一个实体库。
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)依次点亮,然后循环,意思就是一个流水灯程序。
流水灯实验实验内容实验说明:如上图所示,板载 8个 LED 的阳极经排阻 RP1 上拉至 VCC,阴极连接至端口 J9。
实验中,使用杜邦线将单片机的 P1 端口(端口地址:0x90)顺序连接至 J9 端口。
程序功能:先将 P1 端口全部置高(LED 均熄灭),延时 0.2s 左右后,P1.0 置低(LED1 点亮),再延时 0.2s 左右后,P1.0 置高(LED1 熄灭),同时 P1.1 置低(LED2 点亮),如此循环,实现流水灯功能。
实验步骤:1.打开 Keil,新建工程:Project/New Project,输入工程名,并保存;2.选项选择器件:Atmel 的 89C52;3.新建程序文本,并另存该文件为汇编文件格式: (1)“File/New”,(2) File/Save As/键入欲使用的文件名及后缀名,即“文件名.asm”。
再单击“保存”;4.添加该文件到工程:回到编辑界面后,单击“Target 1”前面的“+”号,然后在“Source Group 1”上单击右键,单击“Add File to Group ‘Source Group 1’”,选择刚才新建的汇编文件。
5.在 keil 的汇编文件中输入程序代码,并编译,调试。
6.编译通过后,将生成的HEX文件下载到单片机实验板中,观察实验现象。
参考代码:(1)ORG 0000HLJMP STARTSTART:MOV A, #0FFHCLR CMOV R2, #8LOOP1:RRC AMOV P1,ALCALL DELAYDJNZ R2,LOOP1SJMP STARTDELAY: MOV R3,#7D1: MOV R4,#50D2: MOV R5,#250DJNZ R5,$DJNZ R4,D2DJNZ R3,D1RETEND(2)ORG 0000HLJMP START START:MOV A, #00H SETB CMOV R2, #8LOOP1: RRC A MOV P1,ALCALL DELAYDJNZ R2, LOOP1 SJMP START DELAY: MOV R3, #7 D1: MOV R4, #50 D2: MOV R5, #250 DJNZ R5, $DJNZ R4, D2DJNZ R3, D1RETEND(3)ORG 0000HLJMP START START: MOV A, #00H SETB CMOV R2, #8LOOP1: RRC AMOV P1,ALCALL DELAYDJNZ R2, LOOP1 MOV R2, #7LOOP2: RLC AMOV P1,ALCALL DELAYDJNZ R2,LOOP2 SJMP START DELAY: MOV R3, #7 D1: MOV R4, #50D2: MOV R5, #250 DJNZ R5, $DJNZ R4, D2DJNZ R3, D1RETEND实验结果。
一、新建工程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.观察到板卡上的实验结果正确后,实验到此结束,关闭板卡的电源开关,拔出板卡,以上。
百度文库 - 让每个人平等地提升自我
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个时钟周期跳转一次,达到预期效果。