FPGA基础试验之流水灯
基于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语句最大不同。
比较完成后,与条件表达式值相匹配的分支中的语句被执行。
分支项需要互斥,否则会出现逻辑矛盾。
基于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基础试验之流水灯

综合实验报告第四组组长:韩欢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(离线方式)。
verilog实验报告流水灯数码管秒表交通灯

流水灯实验目的:在basys2开发板上实现LED灯的花样流水的显示,如隔位显示,依次向左移位显示,依次向右移位显示,两边同时靠中间显示。
实验仪器:FPGA开发板一块,计算机一台。
实验原理:当一个正向的电流通过LED时,LED就会发光。
当阳极的电压高于阴极的电压时,LED就会有电流通过。
当在LED上增添一个典型值为1.5V—2.0V之间的电压时,LED就会有电流通过并发光。
实验内容:顶层模块:输入信号:clk_50MHz(主时钟信号),rst(重置信号),输出信号:[7:0] led(LED灯控制信号)。
module led_top(clkin,rst,led_out);input clkin, rst;output [7:0] led_out;wire clk_1hz;divider_1hz d0(clkin, rst, clk_1hz);led l0(clk_1hz, rst, led_out);endmodule分频模块:module divider_1hz(clkin,rst,clkout);input clkin,rst;output reg clkout;reg [24:0] cnt;always@(posedge clkin, posedge rst)beginif(rst) begincnt<=0;clkout<=0; endelse if(cnt==24999999) begincnt<=0;clkout=!clkout; endelse cnt<=cnt+1;endendmodule亮灯信号模块:module led(clkin,rst,led_out);input clkin,rst;output [7:0] led_out;reg [2:0] state;always@(posedge clkin, posedge rst)if(rst) state<=0;else state<=state+1;always@(state)case(state)3'b000:ledout<=8'b0000_0001;3'b001:ledout<=8'b0000_0010;3'b010:ledout<=8'b0000_0100;3'b011:ledout<=8'b0000_1000;3'b100:ledout<=8'b0001_0000;3'b101:ledout<=8'b0010_0000;3'b110:ledout<=8'b0100_0000;3'b111:ledout<=8'b1000_0000;endcaseendmodule实验中存在的问题:1 芯片选择问题automotive spartan3EXA3S100E XA3S250E CPG132spartan3EXC3S100E XC3S250E CP1322 时序逻辑部分,阻塞赋值和非阻塞赋值混用always@(posedge clk)begina=b+c;d<=e+f;end3 UCF文件格式错误NET “CLK” LOC = “B8”;NET “a” LOC = “N11”;NET “b” LOC = “G13”;NET “c[0]”LOC =“K11;数码管实验目的:设计一个数码管动态扫描程序,实现在四位数码管上动态循环显示“1”、“2”“3”“4”;实验仪器:FPGA开发板一块,计算机一台。
fpga流水灯实验报告

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

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)beginbuffer=buffer+1;if(buffer==26'd2*******)//判别buffer数值为25000000时,做输出处理beginled_out=led_out<<1;//led向左移位,空闲位自动添0补位if(led_out==9'b000000000)led_out=9'b111111111;led_out1=~led_out;//取反输出endendassign led=led_out1[7:0];endmodule5.实验步骤(1)建立新工程项目:打开Quartus II软件,进入集成开发环境,点击File→New project wizard建立一个工程项目ledwater。
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或关注桃报:奉献教育(店铺)示实践。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
综合实验报告第四组组长:韩欢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(离线方式)。
一般考虑用在线方式。
(8)显示实验结果六、电路符号:流水灯的电路符号如下图所示。
sw1为模式选择输入。
rst_n为复位信号,接高电平,sys_clk为时钟信号输入,led[3..0]为LED显示信号输出端。
七:设计方法:采用文本编辑法,即利用verilogHDL语言描述流水灯,代码如下:module liushuideng(sw1,sys_clk,rst_n,led); //接口定义input sys_clk,rst_n,sw1; //输入:系统时钟50MHz,复位输入output [3:0] led; //输出:3个led产生流水现象,轮流点亮+reg [25:0] count; //系统时钟频率过高,需要计数的方式来产生延时,使led保持状态一段时间reg [3:0] led; //led低电平点亮reg [2:0] flag; //状态转换的入口,发生变化的时候,点亮另外一个ledalways @(posedge sys_clk)beginif(!rst_n) //复位,给寄存器赋初值beginflag <= 3'b0;count <= 26'b0;end//else //sys_clk上升沿到来//beginif( count == 26'd20)begincount <= 26'd0; //count归零,便于下次重新开始计数if(flag == 3'b111) //当flag等于2’b10时,flag归零(实际上,当flag==2’b10时,要在下一次归零,即在flag==2’b11时,马上就变成2’b00,而并非当flag==2’b10时马上变为2’b00;)flag <= 3'b000;else //否则flag加一flag <= flag+3'b001;endelsecount <= count + 26'd1; //当count没计数到指定值是,count执行加一操作endalways @(posedge sys_clk)if(sw1==1'b1)begincase(flag) //由于flag会不断变化,并且flag在从一个值变成另一个值的时候,会保持一段很长的时间,我们利用它来产生流水灯现象3'b000: led <= 4'b0000; //点亮所有灯,都为低电平3'b001: led <= 4'b1111; //没有点亮灯,都为高电平3'b010: led <= 4'b0000; //点亮所有灯,都为低电平3'b011: led <= 4'b1111; //没有点亮灯,都为高电平3'b100: led <= 4'b0000; //点亮所有灯,都为低电平3'b101: led <= 4'b1111; //没有点亮灯,都为高电平3'b110: led <= 4'b0000; //点亮所有灯,都为低电平3'b111: led <= 4'b1111; //没有点亮灯,都为高电平default:led <= 4'b1111; //一般要设置一个缺省状态,三个led全部灭endcaseendelsebegincase(flag) //由于flag会不断变化,并且flag在从一个值变成另一个值的时候,会保持一段很长的时间,我们利用它来产生流水灯现象3'b000: led <= 4'b0111; //点亮第一个灯低电平点亮3'b001: led <= 4'b1011; 点亮第二个灯低电平点亮//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++3'b010: led <= 4'b1101; //点亮第三个灯低电平点亮3'b011: led <= 4'b1110; //点亮第四个灯低电平点亮3'b100: led <= 4'b1101; //点亮第三个灯低电平点亮3'b101: led <= 4'b1011; //点亮第二个灯低电平点亮3'b110: led <= 4'b0111; //点亮第一个灯低电平点亮3'b111: led <= 4'b1111;default:led <= 4'b1111; //一般要设置一个缺省状态,三个led全部灭endcaseendendmodule七:仿真结果:1:当swl=1时,(1)时序仿真结果如图所示(2)功能仿真结果为:功能仿真没有时延。
2:当swl=0时,(1)时序仿真结果为:(2)功能仿真结果为:FPGA基础实验之正弦波形产生一、实验目的通过此实验进一步了解、熟悉和掌握Quartus II开发软件的使用方法及Verilog语言的编程方法。
学习简单时序电路的设计分析和硬件测试。
二、实验内容1.熟悉信号产生板中的FPGA的普通I/O的连接;2.根据实际的正弦波形产生时序,体会用Verilog语言的编程产生相应时序;3.熟悉集成开发工具Quartus II,学会使用Quartus II对Cyclone系列FPGA的程序开发、编译与调试;4.掌握Cyclone系列FPGA的程序加载,熟练掌握将.sof文件加载到实验板的FPGA中,实现正弦波形产生。
三、实验原理DDS(Direct Digital Synthesis)是一种应用直接数字合成技术来产生信号波形的方法。
DDS技术建立在采样定理的基础上,它首先对需要的信号波形进行采样、量化,然后存入存储器作为待产生信号的数据查询表。
在输出信号波形时,从数据表依次读出数据,产生数字信号。
四、实验步骤1、通过matlab产生一组正弦信号:a=1:1:1023;b=127*cos((1/512)*pi*a)+128;b=round(b’);将生成的1024个在1~255之间的数存入ROM之中。
2、将产生的数据保存为sin.hex文件;IP核的产生。
3、选中单口rom添加文件名。
4、将q output port 勾选去掉。
5、添加产生的sin.hex文件到rom中。
6、根据需要分配管脚并进行编译。
7、完成rom的设置,添加输入输出端口。
8、验证结果:利用波形仿真看结果,新建波形文件。
9、双击Name下面的空白处,点击NewFolder。
10、点击list。
11、点击”>>”。
12、将输入及输出添加到仿真文件中。
13、给相应的输入进行赋值;对时钟进行赋值。
14、点击工具栏中的时钟标志。
15、对a进行赋值,选出一段然后点击工具栏中的“?”选择以16进制显示。
16、赋值完毕后,开始时序仿真。
17、选择相应的仿真文件,开始仿真,完毕后查看report18、点击按幅度为5的显示,得到相应的波形,a和b的值决定了显示波形的频率及相位。
五、电路符号六、设计程序Rom1module rom1 (address,clock,q);input [9:0] address;input clock;output [7:0] q;wire [7:0] sub_wire0;wire [7:0] q = sub_wire0[7:0];altsyncram altsyncram_component (.clock0 (clock),.address_a (address),.q_a (sub_wire0),.aclr0 (1'b0),.aclr1 (1'b0),.address_b (1'b1),.addressstall_a (1'b0),.addressstall_b (1'b0),.byteena_a (1'b1),.byteena_b (1'b1),.clock1 (1'b1),.clocken0 (1'b1),.clocken1 (1'b1),.clocken2 (1'b1),.clocken3 (1'b1),.data_a ({8{1'b1}}),.data_b (1'b1),.eccstatus (),.q_b (),.rden_a (1'b1),.rden_b (1'b1),.wren_a (1'b0),.wren_b (1'b0));defparamaltsyncram_component.address_aclr_a = "NONE",`ifdef NO_PLIaltsyncram_component.init_file = "boxing.rif"`elsealtsyncram_component.init_file = "boxing.hex"`endif,altsyncram_component.intended_device_family = "Cyclone",altsyncram_component.lpm_hint = "ENABLE_RUNTIME_MOD=NO",altsyncram_component.lpm_type = "altsyncram",altsyncram_component.numwords_a = 1024,altsyncram_component.operation_mode = "ROM",altsyncram_component.outdata_aclr_a = "NONE",altsyncram_component.outdata_reg_a = "UNREGISTERED",altsyncram_component.widthad_a = 10,altsyncram_component.width_a = 8,altsyncram_component.width_byteena_a = 1;endmodulemodule my_add (clock,dataa,datab,result);input clock;input [31:0] dataa;input [31:0] datab;output [31:0] result;wire [31:0] sub_wire0;wire [31:0] result = sub_wire0[31:0];lpm_add_sub lpm_add_sub_component (.dataa (dataa),.datab (datab),.clock (clock),.result (sub_wire0)// synopsys translate_off,.aclr (),.add_sub (),.cin (),.clken (),.cout (),.overflow ()// synopsys translate_on);defparamlpm_add_sub_component.lpm_direction = "ADD",lpm_add_sub_component.lpm_hint = "ONE_INPUT_IS_CONSTANT=NO,CIN_USED=NO",lpm_add_sub_component.lpm_pipeline = 1,lpm_add_sub_component.lpm_representation = "UNSIGNED",lpm_add_sub_component.lpm_type = "LPM_ADD_SUB",lpm_add_sub_component.lpm_width = 32;endmodulemodule add(clk,a,b,c);input clk;input[31:0] a;input[31:0] b;output[31:0] c;reg[31:0] c;reg[31:0] d;initialbegind<=b;endalways @(posedge clk)beginc<=a+d;d<=c;endendmodules translate_off`timescale 1 ps / 1 ps// synopsys translate_onmodule rom (address,clock,q);input [9:0] address;input clock;output [7:0] q;wire [7:0] sub_wire0;wire [7:0] q = sub_wire0[7:0];altsyncram altsyncram_component (.clock0 (clock),.address_a (address),.q_a (sub_wire0),.aclr0 (1'b0),.aclr1 (1'b0),.address_b (1'b1),.addressstall_a (1'b0),.addressstall_b (1'b0),.byteena_a (1'b1),.byteena_b (1'b1),.clock1 (1'b1),.clocken0 (1'b1),.clocken1 (1'b1),.clocken2 (1'b1),.clocken3 (1'b1),.data_a ({8{1'b1}}),.data_b (1'b1),.eccstatus (),.q_b (),.rden_a (1'b1),.rden_b (1'b1),.wren_a (1'b0),.wren_b (1'b0));defparamaltsyncram_component.address_aclr_a = "NONE",`ifdef NO_PLIaltsyncram_component.init_file = "boxing.rif"`elsealtsyncram_component.init_file = "boxing.hex"`endif,altsyncram_component.intended_device_family = "Cyclone",altsyncram_component.lpm_hint = "ENABLE_RUNTIME_MOD=NO",altsyncram_component.lpm_type = "altsyncram",altsyncram_component.numwords_a = 1024,altsyncram_component.operation_mode = "ROM",altsyncram_component.outdata_aclr_a = "NONE",altsyncram_component.outdata_reg_a = "UNREGISTERED",altsyncram_component.widthad_a = 10,altsyncram_component.width_a = 8,altsyncram_component.width_byteena_a = 1;endmodule七、实验结果八、实验总结经过不断的实验,最终完成了该实验的基本要求,通过该信号发生器的设计,学习和掌握了DA转换,更加熟练地使用Verilog语言描述硬件电路和信号的输出,也更加熟练的掌握语言编程过程中的数据的控制,运用quartusII仿真和调用modelsim仿真。