fpga 拨码开关控制流水灯方向
基于FPGA的verilog的流水灯程序

基于FPGA的流水灯verilog程序`define cnt 17d7840 //cnt是计数量此处计时0.5s。
我调试的板子晶振频率是50MHZ。
32’h17d7840就是0.5s 。
这个十六进制的数值你可以用电脑自带的计数器转换的。
`define cnt_n 17d7841 //cnt值加一,用于下边的计数寄存器led_cnt的复位module led_new (clk,rest,led);input clk;input rest;output [7:0]led;reg [7:0]led;reg [7:0]led_n;reg [31:0] led_cnt;always@(posedge clk or negedge rest)beginif(!rest) led<=8'h80;else led<=led_n;endalways@(*)beginif(!rest) led_n=8'h00;else if(led_cnt==32'h`cnt) led_n={led[6:0],led[7]};else led_n=led;endalways@(posedge clk or negedge rest)beginif(!rest) led_cnt<=32'h0;else if(led_cnt==32'h`cnt_n) led_cnt<=32'h0;else led_cnt<=led_cnt+1'b1;endendmodule十进制数转换成十六进制的操作:先在电脑的开始》附件》计数器;打开计数器,点击“科学型”,窗口右边的键盘输入你想要的计数值,然后再点十六进制就行了QUARTUS II里面的引脚绑定其中clk是芯片内部时钟,仔细观察板子,观察晶振连进板子的那个引脚就是时钟引脚了。
我板子上边标示的是clk0/17。
注意:把程序复制进去的时候请把那些注释删掉,因为我写那些注释只是在WORD文档写而已的。
基于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流水灯课程设计

大规模数字逻辑课程设计题目:流水灯控制专业电信班级091学号************学生姓名dashitou设计时间2011-2012学年上学期教师评分2011年10 月29 日目录一、概述 (3)二、 EDA技术发展及介绍 (3)(一) EDA技术的介绍 (3)(二) EDA技术的发展趋势 (4)三、程序代码 (5)(一) 分频器代码 (5)(二) 分频器block (6)(三) 主程序代码 (6)(四) 主程序block (9)(五) 总的block模块 (9)四、管脚分配 (9)五、设计原理 (10)六、心得体会 (10)七、参考文献 (10)一、概述流水灯是一串按一定的规律像流水一样连续闪亮,流水灯控制是可编程控制器的一个应用,其控制思想在工业控制技术领域也同样适用。
流水灯控制可用多种方法实现,但对现代可编程控制器而言,基于EDA技术的流水灯设计也是很普遍的。
二、EDA技术发展及介绍(一) EDA技术的介绍EDA是电子设计自动化(Electronic Design Automation)缩写,EDA技术是在电子CAD技术基础上发展起来的计算机软件系统,是指以计算机为工作平台,融合了应用电子技术、计算机技术、信息处理及智能化技术的最新成果,进行电子产品的自动设计。
利用EDA工具,电子设计师可以从概念、算法、协议等开始设计电子系统,大量工作可以通过计算机完成,并可以将电子产品从电路设计、性能分析到设计出IC版图或PCB版图的整个过程在计算机上自动处理完成。
随着EDA技术发展和应用领域的扩大与深入,EDA技术在电子信息、通讯、自动控制及计算机应用等领域的重要性突出。
随着技术市场与人才市场对EDA的需求不断提高,产品的市场需求和技术市场的要求也必然会反映到教学领域和科研领域中来。
因此学好EDA技术对我们有很大的益处。
EDA是指以计算机为工具,在EDA软件平台上,根据设计社描述的源文件(原理图文件、硬件描述语言文件或波形图文件),自动完成系统的设计,包括编译、仿真、优化、综合、适配(或布局布线)以及下载。
基于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(离线方式)。
流水灯的按键方向控制

流⽔灯的按键⽅向控制module liushuideng(clk,rst_n,led_0,sw1_n,sw2_n,sw3_n);input clk; //时钟信号,50MHZinput rst_n; //复位信号,低电平有效input sw1_n,sw2_n,sw3_n; //三个独⽴按键,低表⽰按下output[3:0] led_0; //流⽔灯,0--灭,1--不灭//--------------------------------------------------------reg led_dir; //0--right,1--leftreg led_on; //0--off,1--onreg[23:0] cnt;always @(posedge clk or negedge rst_n) //计数if(!rst_n)cnt <=24'd0;elsecnt <= cnt+1'b1;reg[3:0] led_move;always @(posedge clk or negedge rst_n) //流⽔灯if(!rst_n)led_move <= 4'b1;else if(cnt == 24'hffffff && led_on)beginif(led_dir)led_move <= {led_move[2:0],led_move[3]}; //leftelseled_move <= {led_move[0],led_move[3:1]}; //rightend//---------------------------------------------------------reg [2:0] key_rst;always @(posedge clk or negedge rst_n)if (!rst_n)key_rst <= 3'b111;elsekey_rst <= {sw3_n,sw2_n,sw1_n}; //每个时钟周期都会把按键值赋给key_rstreg[2:0] key_rst_r; //每个时钟周期的上升沿将low_sw信号锁存到low_sw_ralways @ (posedge clk or negedge rst_n)if(!rst_n)key_rst_r <= 3'b111;elsekey_rst_r <= key_rst; //第⼆级寄存器,将之前锁存的按键值给key_rst_rwire[2:0] key_an = key_rst_r & ( ~key_rst );//当寄存器key_rst由1变为0时,led_an的值变为⾼,维持⼀个时钟周期//------------------------------------------------------reg[23:0] cnt_cn;//计数寄存器always @ (posedge clk or negedge rst_n)if (!rst_n)cnt_cn <= 24'd0; //异步复位else if(key_an)cnt_cn <=24'd0;elsecnt_cn <= cnt_cn + 1'b1;reg[2:0] low_sw;always @ (posedge clk or negedge rst_n)if (!rst_n)low_sw <= 3'b111;else if(cnt_cn == 24'hffffff) //满20ms,将按键值锁存到寄存器low_sw中low_sw <= {sw3_n,sw2_n,sw1_n}; //每个20ms执⾏⼀次//------------------------------------------------------reg[2:0] low_sw_r;always @ ( posedge clk or negedge rst_n )if (!rst_n)low_sw_r <= 3'b111;elselow_sw_r <= low_sw; //每个时钟周期采⼀次/*low_sw 111 111 111 110 110 110~low_sw 000 000 000 001 001 001low_sw_r 111 111 111 110 110 110led_ctr1 000 000 000 001 000 000*///当寄存器low_sw由1变为0时,led_ctrl的值变为⾼,维持⼀个时钟周期wire[2:0] led_ctrl = low_sw_r[2:0] & ( ~low_sw[2:0]);always @ (posedge clk or negedge rst_n)if(!rst_n)beginled_on <= 1'b0;led_dir <= 1'b0;endelsebegin //某个按键值变化时,LED将做亮灭、左移或右移操作if ( led_ctrl[0] ) led_on <= ~led_on;if ( led_ctrl[1] ) led_dir <= 1'b1;if ( led_ctrl[2] ) led_dir <= 1'b0;endassign led_0 = led_dir; //LEDendmodule。
基于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位宽的计数器。
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输出与预期吻合。