LED灯移位显示,ise开发环境Verilog编程流水灯

合集下载

Verilog流水灯实验报告

Verilog流水灯实验报告

流火灯真验报告之阳早格格创做真验两流火灯一、真验手段教会编写一个简朴的流火灯步调并掌握分频的要领.认识Modelsim仿真硬件的使用.二、真验央供用Quartus编写流火灯步调,正在Modelsim硬件中举止仿真.三、真验仪器战设备1、硬件:估计机2、硬件:Quartus、Modelsim、(UE)四、真验真质1、将时钟周期举止分频.2、编写Verilog步调真止LED等依次明灭,用Modelsim举止仿真,画造波形图.五、真验安排(一)分频本理已知时钟周期f为50MHz,周期T为1/f,即20ns.若念得到四分频计数器,即周期为80ns的时钟,需要把时钟举止分频.即每四个时钟周期合并为一个周期.本理图如图1所示.图1四分频本理图(两)流火灯安排思路1、真止4盏LED灯依次隔1s明灭,即周期为1s;2、估计出频次f为1/T=1Hz;3、树坐计数器cnt,当检测到clk降下沿时启初计数,当cnt计数到24_999_999时,clk_4跳形成1,LED灯明起,当cnt计数49_999_999时,clk_4置0,LED灯燃烧.4、给LED赋初值4’b0001,第一盏灯明.5、利用位拼交,真止循环.(三)安排框图图2安排基础框图(四)位拼交的用法若输进a=4'b1010,b=3'b101,c=4'b0101,念要使输出d=5'b10001用位拼交,标记“{}”:d<={b[2:1],c[1],a[2:1]}即把b的矮1~2位10,c的矮1位0,a的矮1~2位01拼交起去,得到10001.流火灯4'b00014'b00104'b01004'b1000相称于把矮三位左移,并最下位搁正在最矮位.用位拼交可写为:led<={led[2:0],led[3]};矮三位最下位六、真验要领战步调(一)时钟分频1、编写分频步调.2、编写尝试步调.3、举止仿真,波形如图3所示.图3分频仿真截止(两)流火灯1、编写分频步调.3、编写尝试步调.3、举止仿真,为了俭朴时间战便当瞅察波形,将计数器值分别改为24、49跳转.波形如图4所示.图4流火灯仿真截止七、真验参照步调(一)时钟分频1、步调文献module div_clk( //模块名取文献名普遍.定义端心列表,input wire clk, //输进线型input wire rst_n,output reg clk_4 //输出定义为寄存器型);reg[3:0] cnt; //中括号定义位宽,定义中间变量cntalways@(posedge clk)if(rst_n==0)cnt <= 0; //复位为0,计数器也为0else if(cnt==3) //当计数器=3时浑整(可用else if)cnt <= 0;elsecnt <= cnt+1; //计数器自加1 always@(posedge clk)if(rst_n==0)else if(cnt==1)clk_4 <= 1; //当计数器为1时,时钟跳形成1else if(cnt==3)clk_4 <= 0; //当计数器为3时,时钟跳形成0endmodule2、尝试文献`timescale 1ns/1ns module tb_div_clk();reg clk;reg rst_n;wire clk_4;initialbeginclk = 0;rst_n = 0;#100rst_n = 1;endalways #5 clk=~clk; div_clk div_clk_inst(.clk(clk),.rst_n(rst_n),.clk_4(clk_4));endmodule(二)流火灯1、步调文献module LSD( //模块名取文献名普遍.定义端心列表,input wire clk, //输进线型input wire rst_n,output reg[3:0] led);reg[25:0] cnt; //中括号定义位宽,定义中间变量cntreg clk_4;always@(posedge clk)if(rst_n==0)cnt <= 0; //复位为0,计数器也为0else if(cnt==49_999_999) //当计数器=49999999时浑整(可用else if)cnt <= 0;elsecnt <= cnt+1; //计数器自加1 always@(posedge clk or negedge clk) //同步复位if(rst_n==0)else if(cnt==24_999_999)clk_4 <= 1; //当计数器为24999999时,时钟跳形成1else if(cnt==49_999_999)clk_4 <= 0; //当计数器为49999999时,时钟跳形成0elseclk_4 =clk_4;always@(posedge clk_4 or negedge clk_4)if(rst_n==0)led <= 4'b0001;elseled <= {led[2:0],led[3]};//位拼交endmodule2、尝试文献`timescale 1ns/1nsmodule LSD();reg clk;reg rst_n;reg cnt;wire led;initialbeginclk = 0;rst_n = 0;#100rst_n = 1;endalways #5 clk=~clk;LSD LSD_inst(.clk(clk),.rst_n(rst_n),.led(led));endmodule八、真验小结1、干真验要养成良佳的习惯,屡屡干真验时,皆要修坐一个新的文献夹存搁真验所需的步调文献,为仿真时增加文献干准备,也便当以去的查找战使用.2、写步调前要念领会电路真止本理,根据所教数电知识对于各个元器件举止统造.3、写步调时注意排版好瞅整净,共时注意增加注释.4、注意步调中模块名要战文献名普遍,可则步调报错,无法编译通过.5、仿真时,不妨采用分歧的进造.正在念要变动的场合左键,采用【Radix】,其中【Binary】为两进造.如图5所示.图5更矫正造6、正在流火灯仿真时,LED灯的波形一启初是过失的,果为步调中只检测了降下沿always@(posedge clk) ,加上下落沿检测always@(posedge clk or negedge clk) ,即可办理问题,乐成画造波形图.。

Verilog流水灯实验报告

Verilog流水灯实验报告

V e r i l o g流水灯实验报告 The Standardization Office was revised on the afternoon of December 13, 2020流水灯实验报告实验二 流水灯一、 实验目的学会编写一个简单的流水灯程序并掌握分频的方法。

熟悉Modelsim 仿真软件的使用。

二、 实验要求用Quartus 编写流水灯程序,在Modelsim 软件中进行仿真。

三、 实验仪器和设备1、 硬件:计算机2、 软件:Quartus 、Modelsim 、(UE )四、 实验内容1、 将时钟周期进行分频。

2、 编写Verilog 程序实现LED 等依次亮灭,用Modelsim 进行仿真,绘制波形图。

五、 实验设计(一)分频原理已知时钟周期f 为50MHz ,周期T 为1/f ,即20ns 。

若想得到四分频计数器,即周期为80ns 的时钟,需要把时钟进行分频。

即每四个时钟周期合并为一个周期。

原理图如图1所示。

rst_nclkclk_4图1 四分频原理图(二)流水灯设计思路1、实现4盏LED 灯依次隔1s 亮灭,即周期为1s ;2、计算出频率f 为1/T=1Hz ;3、设置计数器cnt ,当检测到clk 上升沿时开始计数,当cnt 计数到24_999_999时,clk_4跳变为1,LED 灯亮起,当cnt 计数49_999_999时,clk_4置0,LED 灯熄灭。

4、给LED 赋初值4’b0001,第一盏灯亮。

5、利用位拼接,实现循环。

(三)设计框图FPGAclkcntLED LED图2 设计基本框图(四)位拼接的用法若输入a=4'b1010,b=3'b101,c=4'b0101,想要使输出d=5'b10001用位拼接,符号“{ }”:d<={b[2:1],c[1],a[2:1]}即把b 的低1~2位10,c 的低1位0,a 的低1~2位01拼接起来,得到10 0 01。

LED灯移位显示-ise开发环境Verilog编程流水灯

LED灯移位显示-ise开发环境Verilog编程流水灯

LED灯移位显⽰-ise开发环境Verilog编程流⽔灯DDPP课程设计⼋位LED可控移位显⽰设计与实现本设计基于Xilinx ISE Design Suite 13.2软件开发平台和其综合⼯具进⾏⼋位LED可控移位显⽰数字电路的功能设计,在FPGA BSSYS2开发板上来完成设计的测试和实现。

I、总体RTL SCHEMATIC端⼝说明:CLK_IN:50MHZ时钟输⼊C:控制左右移,0为LED[0]-LED[7],1反之。

S:选择移动频率,共四档。

RST:重置LED:点亮LED灯II、源程序module led_shiftingdisplay(LED,CLK_IN,RST,S,C);input CLK_IN,RST,C;input [1:0] S;output [7:0] LED;reg [25:0] cn;reg CLK;reg [7:0] LED;wire CLK_OUT;wire CLK2_OUT;wire CLK3_OUT;wire CLK4_OUT;initialbegincn=0;endalways @(posedge CLK_IN)beginif(cn==49999999)begin cn<=0; endelse cn<=cn+26'd1;endassign CLK_OUT=cn[25]; //1HZassign CLK2_OUT=cn[24]; //2HZassign CLK3_OUT=cn[21]; //16HZassign CLK4_OUT=cn[20]; //32HZalways @(S,CLK_OUT,CLK2_OUT,CLK3_OUT,CLK4_OUT) begin case(S)2'd0:CLK<=CLK_OUT;2'd1:CLK<=CLK2_OUT;2'd2:CLK<=CLK3_OUT;2'd3:CLK<=CLK4_OUT;endcaseendinitial begin LED=8'b00000000;endalways @(posedge CLK)beginif(C) //C==1,left shifting if(RST) LED<=8'b00000001;else if(LED==8'b00000000)LED<=8'b00000001;else LED<=LED<<1;else //C==1,right shifting if(RST) LED<=8'b10000000;else if(LED==8'b00000000)LED<=8'b10000000;else LED<=LED>>1;endendmoduleIII、⽤户约束⽂件led_shiftingdisplay.vNET "C" LOC = N3;NET "CLK_IN" LOC = B8;NET "LED[0]" LOC = M5;NET "LED[1]" LOC = M11;NET "LED[2]" LOC = P7;NET "LED[3]" LOC = P6;NET "LED[4]" LOC = N5;NET "LED[5]" LOC = N4;NET "LED[6]" LOC = P4;NET "LED[7]" LOC = G1;NET "RST" LOC = A7;NET "S[0]" LOC = P11;NET "S[1]" LOC = L3;# PlanAhead Generated IO constraintsNET "C" IOSTANDARD = LVCMOS33;NET "CLK_IN" IOSTANDARD = LVCMOS33; NET "LED[0]" IOSTANDARD = LVCMOS33; NET "LED[1]" IOSTANDARD = LVCMOS33; NET "LED[2]" IOSTANDARD = LVCMOS33; NET "LED[3]" IOSTANDARD = LVCMOS33; NET "LED[4]" IOSTANDARD = LVCMOS33; NET "LED[5]" IOSTANDARD = LVCMOS33; NET "LED[6]" IOSTANDARD = LVCMOS33; NET "LED[7]" IOSTANDARD = LVCMOS33; NET "RST" IOSTANDARD = LVCMOS33; NET "S[0]" IOSTANDARD = LVCMOS33;IV、程序仿真测试⽂件led_shiftingdisplay.vmodule test_ledshiftingdisplay;reg CLK_IN;reg RST;reg [1:0] S;reg C;wire [7:0] LED;led_shiftingdisplay uut (.LED(LED),.CLK_IN(CLK_IN),.RST(RST),.S(S),.C(C));parameter PERIOD = 20;initialbeginCLK_IN = 1'b0;#10;forever#(PERIOD/2) CLK_IN = ~CLK_IN;endinitial beginRST = 0;S = 3;C = 1;endendmodule仿真波形:各个信号仿真波形正常,唯有LED[7:0]均为⾼阻态(除最低位外),仿真不成功,不得其解。

verilog实验报告流水灯数码管秒表交通灯

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的流水灯

基于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位宽的计数器。

[Keil][Verilog][微机原理]流水灯、存储器、外部中断实验_北京邮电大学计算机。。。

[Keil][Verilog][微机原理]流水灯、存储器、外部中断实验_北京邮电大学计算机。。。

[Keil][Verilog][微机原理]流⽔灯、存储器、外部中断实验_北京邮电⼤学计算机。

计算机原理与应⽤实验-流⽔灯、存储器、外部中断实验1 实验⼀流⽔灯实验1.1 实验⽬的1. 掌握ARM开发⼯具的使⽤。

2. 掌握基本IO的使⽤。

1.2 实验原理及内容1. 电路结构图实现流⽔灯的电路结构图如图1所⽰。

以两条红⾊虚线为界,从左⾄右第⼀部分为ARM系统部分,第三部分为外围电路,第⼆部分是接⼝部分,需要⾃⼰将其连接。

图 1 流⽔灯的电路结构图接线⽅式为:GPIOF_0~GPIOF_7(P12接⼝)接LED1~LED8(P2接⼝)。

1. LED电路原理LED灯的驱动原理如图2所⽰。

当发光⼆极管正向导通时,LED灯点亮。

图 2 LED灯正向导通如图3所⽰,LED灯与MCU引脚连接,MCU IO额定电流为25mA,例如0603封装红⾊LED灯额定电流为20mA,已经接近MCU IO的额定电流,可能会损毁器件。

因此图1.3微控制器驱动LED灯⽅案不可取。

图 3 微控制器驱动 LED 灯实际微控制驱动LED灯的电路模型包括:控制器、驱动器和执⾏器三部分,控制器提供控制信号,再由驱动器驱动执⾏器,如图4所⽰。

图 4 LED 灯去驱动电路模型如图5所⽰LED灯通过N沟道MOS管驱动,MCU IO输出⾼电平时MOS管漏极和源极导通LED灯被点亮,反之MCU输出低电平时MOS管漏极和源极截⽌,LED灯不能被点亮。

假设VCC电压3.3V,MOS管导通阻值为零,通过LED灯的电流将远超额定电流出现短路现象,故此⽅案不可取。

图 5 MOS 管驱动 LED 灯电路如图6所⽰,LED驱动电路中增加电阻(R),以此保证通过LED灯的电流不超过额定电流,避免损坏器件,故将电阻R称为限流电阻。

图 6 限流电阻如图7所⽰LED电路原理图,R1位置电阻作为限流电阻,R29位置电阻作为下拉电阻,避免MOS管栅极出现亚稳态。

图 7 LED 电路原理图1. 微控制器IO输出控制原理如图8所⽰,基本结构针对STM32F407有7组IO。

verilog语言的FPGA变速花样流水灯设计

verilog语言的FPGA变速花样流水灯设计

基于XILINX--XSE500E型FPGA的变速流水灯以及花样流水灯的verilog语言设计摘要临近大四毕业,诸多工科院校电子电科通信等专业会选择用FPGA项目作为课程设计的课题,笔者同样经历了这个过程,收获颇多,在此将设计成果在此分享,以帮助大家更好掌握FPGA设计。

FPGA种类繁多,时效性非常好,设计过程中十分注重实时性,在时间点控制上非常优秀。

此次设计采用XILINX的XSE500E型芯片的开发板,芯片采用FG320型接口,速度级别-4。

板载时钟50MHz,如需其他时钟周期,可采用IP核中的clocking,其中的 DCM可以实现变频,引入DCM,输入频率50MHz,输出频率填入需要的频率即可,之后进行实例化。

此外,可以借助计数器进行延时减速,此次设计采用了计数器延时方法。

本次列举了四种流水灯相关设计:普通流水灯(向左和向右滚动),自动反复式流水灯(到最右端自动向左滚动,到左端自动向右滚动),花样流水灯,变速流水灯。

谢谢大家的支持!正文一,普通流水灯1,建模思想普通流水灯,可以向右滚动,到最右端返回最左端,也可以向左滚动,到最左端返回最右端。

普通流水灯模块涉及的端口有:clk,它是时钟输入,一般就是板载时钟,这里是50MHz,具体参照开发板说明。

还有复位输入rst,高电平有效。

此外就是led端口,这个端口有8根管脚,共8位,连接8个led灯。

采用verilog语言,端口定义格式如下:module led(input clk,input rst,output reg[7:0] led //此行定义说明led端口既是驱动管脚的,又是寄存器);采用过程建模,这里不采用行为建模和功能建模,因为这个过程就是一个大循环,规律性极强。

由于板载时钟50MHz,如果每个时钟周期都要滚动流水灯,那么速度是惊人的,人眼根本无法分辨。

所以采用计数器延时,当计数达到约4千万时候,驱动系统进行动作,可以判断,也可以进行流水灯动作。

verilog流水灯控制器++

verilog流水灯控制器++

verilog流水灯控制器//学习3 8译码器的原理,//拨码开关的 1 2 3作为输入//本实验采用拨码开关来作为输入,LED作为状态显示//当然如果你的学习板没有拨码开关,可以用key1 key2 key3 作为数据输入。

//视频教程适合我们21EDA电子的所有学习板module decoder_38(out,key_in);output[7:0] out; //3 8译码器输出有8钟状态,所以要8个LED灯。

input[2:0] key_in; //(1 2 3)key1 key2 key3 作为数据输入reg[7:0] out;always @(key_in)begincase(key_in)3'd0: out=8'b11111110; //LED作为状态显示,低电平有效3'd1: out=8'b11111101;3'd2: out=8'b11111011;3'd3: out=8'b11110111;3'd4: out=8'b11101111;3'd5: out=8'b11011111;3'd6: out=8'b10111111;3'd7: out=8'b01111111;endcaseendendmodule1位数码管动态显示//一位数码管试验//利用分频计数器得到数码管,效果//视频教程适合我们21EDA电子的所有学习板module SMG_LED (clk_50M,rst,led_bit,dataout);input clk_50M,rst; //系统时钟50M输入从12脚输入。

output [7:0] dataout; //我们这里用数码管,output led_bit; //一位数码管的位选择reg [7:0] dataout;reg led_bit;reg [27:0] count; //分频计数器//分频计数器always @ ( posedge clk_50M )begincount<=count+1; //计数器自加endalways @ ( posedge clk_50M or negedge rst)beginled_bit <= 'b0; //是数码管的位选择处于导通状态case ( count[27:24] )// case ( count[27:24] )这一句希望初学者看明白,// 也是分频的关键// 在数码管上面显示0到F0: dataout<=8'b11000000; //01: dataout<=8'b11111001;2: dataout<=8'b10100100;3: dataout<=8'b10110000;4: dataout<=8'b10011001;5: dataout<=8'b10010010;6: dataout<=8'b10000010;7: dataout<=8'b11111000;8: dataout<=8'b10000000;9: dataout<=8'b10010000;10:dataout<=8'b10001000;11:dataout<=8'b10000011;12:dataout<=8'b11000110;13:dataout<=8'b10100001;14:dataout<=8'b10000110;15:dataout<=8'b10001110; //fendcaseendendmodule7段数码管静态显示//本实验就是学习单个数码管的显示//视频教程适合我们21EDA电子的所有学习板module SMG_LED (clk_50M,led_bit,dataout);input clk_50M ; //系统时钟50M输入从12脚输入。

verilog程序-流水灯

verilog程序-流水灯

/****************************************************程序功能:流水灯版本:1.1 版权:分享快乐*****************************************************/ module liu_shui_deng(input wire pin_clk_in,input wire pin_rest_n ,input wire [1:0] pin_ctrl,output reg [7:0] pin_led_out);wire clk ;reg [31: 0] counter32;always @ (posedge pin_clk_in or negedge pin_rest_n) begin if(pin_rest_n==1'b0) begincounter32 <= 32'b0;endelse begincounter32 <= counter32+1'b1;endendassign clk = counter32[3] ;reg [2:0] cur_sta,stateparameter [2:0] IDLE =3'b000;parameter [2:0] RIGHT =5'b001;parameter [2:0] LEFT =5'b010;parameter [2:0] DOUB_LEFT =5'b011;parameter [2:0] ERROR =5'b100;always @ (posedge clk or negedge pin_rest_n) beginif(pin_rest_n==1'b0) beginstate <= IDLE ;endelse begincase (state)IDLE : beginif (pin_ctrl==2'b00) beginstate <= LEFT ;endelse if (pin_ctrl==2'b01) beginstate <= RIGHT ;endelse if (pin_ctrl==2'b10) beginendelse beginstate <= ERROR ;endendLEFT : beginif (pin_ctrl==2'b00) beginstate <= LEFT ;endelse if (pin_ctrl==2'b01) begin state <= RIGHT ;endelse if (pin_ctrl==2'b10) begin state <= DOUB_LEFT ;endelse beginstate <= ERROR ;endendRIGHT : beginif (pin_ctrl==2'b00) beginstate <= LEFT ;endelse if (pin_ctrl==2'b01) begin state <= RIGHT ;endelse if (pin_ctrl==2'b10) begin state <= DOUB_LEFT ;endelse beginstate <= ERROR ;endendDOUB_LEFT : beginif (pin_ctrl==2'b00) beginstate <= LEFT ;endelse if (pin_ctrl==2'b01) begin state <= RIGHT ;endelse if (pin_ctrl==2'b10) beginendelse beginstate <= ERROR ;endendERROR : beginif (pin_ctrl==2'b00) beginstate <= LEFT ;endelse if (pin_ctrl==2'b01) beginstate <= RIGHT ;endelse if (pin_ctrl==2'b10) beginstate <= DOUB_LEFT ;endelse beginstate <= ERROR ;endenddefault: state <= IDLE ;endcaseendendalways @ (posedge clk or negedge pin_rest_n) beginif (pin_rest_n == 1'b0) beginpin_led_out[7:0]<=8'b0000_0000 ;endelse begincase (state)IDLE : beginpin_led_out [7:0] <=8'b0000_0000 ;endLEFT : beginif((pin_led_out[0]+pin_led_out[1]+pin_led_out[2]+pin_led_out[3]+pin_led_out[4]+pin_led_out[5]+pin_led_out[6]+pin_led_out[7])!=8'd1 ) beginpin_led_out[7:0] <= 8'b0000_0001;endelse beginpin_led_out[7:1] <= pin_led_out[6:0];pin_led_out[0] <= pin_led_out[7];endendRIGHT : beginif((pin_led_out[0]+pin_led_out[1]+pin_led_out[2]+pin_led_out[3]+pin_led_out[4]+pin_led_out[5]+pin_led_out[6]+pin_led_out[7])!=8'd1 ) beginpin_led_out [7:0] <= 8'b0000_0001 ;endelse beginpin_led_out [6:0] <= pin_led_out [7:1] ;pin_led_out [7] <= pin_led_out [0] ;endendDOUB_LEFT : beginif((pin_led_out[0]+pin_led_out[1]+pin_led_out[2]+pin_led_out[3]+pin_led_out[4]+pin_led_out[5]+pin_led_out[6]+pin_led_out[7])!=8'd2 ) beginpin_led_out [7:0] <= 8'b0000_0011 ;endelse beginpin_led_out [7:1] <= pin_led_out [6:0] ;pin_led_out [0] <= pin_led_out [7] ;endendERROR : beginpin_led_out [7:0]<=8'b1111_1111;enddefault : pin_led_out [7:0] <= 8'b0000_0000;endcaseendendendmodule。

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。

流水灯verilog设计代码

流水灯verilog设计代码
end
else if (pin_ctrl==3'b011) begin
state <= DDOUB_RIGHT ;
if (pin_ctrl==3'b000) begin
state <= LEFT ;
end
else if (pin_ctrl==3'b001) begin
else if (pin_ctrl==3'b001) begin
state <= RIGHT ;
end
else if (pin_ctrl==3'b010) begin
end
RIGHT : begin
if (pin_ctrl==3'b000) begin
state <= LEFT ;
end
ERROR : begin
if (pin_ctrl==3'b000) begin
counter32 <= 32'b0;
end
else begin
counter32 <= counter32+1'b1;
end
end
assign clk = counter32[3] ; //16 fen pin
else if (pin_ctrl==3'b011) begin
state <= DDOUB_RIGHT ;
end
end
else begin
state <= ERROR ;
end
else if (pin_ctrl==3'b011) begin
state <= DDOUB_RIGHT ;

用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;
可编辑

Verilog实现双向流水灯

Verilog实现双向流水灯

Verilog实现双向流⽔灯 实现⼀个双向流⽔灯,从右往左流动,到最左边时,再从左边往右流动,然后再从右边开始流动,如此不断反复。

灯亮、间隔时间都为0.2s,本实验共有四个LED灯,从左到右依次为LED[3]、LED[2]、LED[1]、LED[0],FPGA输出低电平点亮。

实现思路:1. 定义⼀个0.2s的计数器2. LED[3]、LED[0]作为边界标志位,在被点亮时,切换流向,即LED[3]、LED[0]为低电平时,要进⾏⽅向转换,所以要定义⼀个1bit reg变量存储标志实验代码:1//灯亮、间隔时间都为0.2s的双向流⽔灯2module flow_led(3input clk,4input rst_n,5output reg [3:0]led6 );78parameter SYS_FRQ = 50; //时钟输⼊频率,50MHz9parameter LED_FLOW_TIME = 18'd200_000; //LED流⽔灯亮间隔时间,单位us,这⾥是0.2s10parameter LED_FLOW_CNT_TIME = LED_FLOW_TIME * SYS_FRQ; //LED流⽔灯,每个灯亮的时钟周期数1112reg [23:0] flow_cnt; //0.2s计数器13reg flow_flag; //流向标志,0----从右往左,1----从左往右141516//流⽔灯每个灯亮时间计数器17always @(posedge clk or negedge rst_n)18if(!rst_n)19 flow_cnt <= 24'b0;20else if(flow_cnt == LED_FLOW_CNT_TIME - 1'b1)21 flow_cnt <= 24'b0;22else23 flow_cnt <= flow_cnt + 1'b1;242526//流⽔⽅向边界,分别为四个LED灯的两边,即LED[0]、LED[3],在这两个地⽅需要转换标志,以改变其流向27always @(posedge clk or negedge rst_n)28if(!rst_n)29 flow_flag <= 1'b0;30else if(led[0] == 1'b0)31 flow_flag <= 1'b0;32else if(led[3] == 1'b0)33 flow_flag <= 1'b1;34else35 flow_flag <= flow_flag;363738//流⽔效果实现39always @(posedge clk or negedge rst_n)40if(!rst_n)41 led <= 4'b1110; //FPGA输出低电平时,点亮LED42else if(flow_flag == 1'b0) //从右往左43begin44if(flow_cnt == LED_FLOW_CNT_TIME - 1'b1)45 led <= {led[2:0], led[3]};46else47 led <= led;48end49else if(flow_flag == 1'b1) //从左往右50begin51if(flow_cnt == LED_FLOW_CNT_TIME - 1'b1)52 led <= {led[0], led[3:1]};53else54 led <= led;55end56else57 led <= led;585960endmoduleView Code。

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

DDPP课程设计
八位LED可控移位显示设计与实现
本设计基于Xilinx ISE Design Suite 13.2软件开发平台和其综合工具进行八位LED可控移位显示数字电路的功能设计,在FPGA BSSYS2开发板上来完成设计的测试和实现。

I、总体RTL SCHEMATIC
端口说明:
CLK_IN:50MHZ时钟输入
C:控制左右移,0为
LED[0]-LED[7],1反之。

S:选择移动频率,共四档。

RST:重置
LED:点亮LED灯
II、源程序
module led_shiftingdisplay(LED,CLK_IN,RST,S,C);
input CLK_IN,RST,C;
input [1:0] S;
output [7:0] LED;
reg [25:0] cn;
reg CLK;
reg [7:0] LED;
wire CLK_OUT;
wire CLK2_OUT;
wire CLK3_OUT;
wire CLK4_OUT;
initial
begin
cn=0;
end
always @(posedge CLK_IN)
begin
if(cn==49999999)
begin cn<=0; end
else cn<=cn+26'd1;
end
assign CLK_OUT=cn[25]; //1HZ
assign CLK2_OUT=cn[24]; //2HZ
assign CLK3_OUT=cn[21]; //16HZ
assign CLK4_OUT=cn[20]; //32HZ
always @(S,CLK_OUT,CLK2_OUT,CLK3_OUT,CLK4_OUT) begin
case(S)
2'd0:CLK<=CLK_OUT;
2'd1:CLK<=CLK2_OUT;
2'd2:CLK<=CLK3_OUT;
2'd3:CLK<=CLK4_OUT;
endcase
end
initial begin LED=8'b00000000;end
always @(posedge CLK)
begin
if(C) //C==1,left shifting if(RST) LED<=8'b00000001;
else if(LED==8'b00000000)
LED<=8'b00000001;
else LED<=LED<<1;
else //C==1,right shifting if(RST) LED<=8'b10000000;
else if(LED==8'b00000000)
LED<=8'b10000000;
else LED<=LED>>1;
end
endmodule
III、用户约束文件led_shiftingdisplay.v
NET "C" LOC = N3;
NET "CLK_IN" LOC = B8;
NET "LED[0]" LOC = M5;
NET "LED[1]" LOC = M11;
NET "LED[2]" LOC = P7;
NET "LED[3]" LOC = P6;
NET "LED[4]" LOC = N5;
NET "LED[5]" LOC = N4;
NET "LED[6]" LOC = P4;
NET "LED[7]" LOC = G1;
NET "RST" LOC = A7;
NET "S[0]" LOC = P11;
NET "S[1]" LOC = L3;
# PlanAhead Generated IO constraints
NET "C" IOSTANDARD = LVCMOS33;
NET "CLK_IN" IOSTANDARD = LVCMOS33; NET "LED[0]" IOSTANDARD = LVCMOS33; NET "LED[1]" IOSTANDARD = LVCMOS33; NET "LED[2]" IOSTANDARD = LVCMOS33; NET "LED[3]" IOSTANDARD = LVCMOS33; NET "LED[4]" IOSTANDARD = LVCMOS33; NET "LED[5]" IOSTANDARD = LVCMOS33; NET "LED[6]" IOSTANDARD = LVCMOS33; NET "LED[7]" IOSTANDARD = LVCMOS33; NET "RST" IOSTANDARD = LVCMOS33; NET "S[0]" IOSTANDARD = LVCMOS33; NET "S[1]" IOSTANDARD = LVCMOS33;
IV、程序仿真
测试文件led_shiftingdisplay.v
module test_ledshiftingdisplay;
reg CLK_IN;
reg RST;
reg [1:0] S;
reg C;
wire [7:0] LED;
led_shiftingdisplay uut (
.LED(LED),
.CLK_IN(CLK_IN),
.RST(RST),
.S(S),
.C(C)
);
parameter PERIOD = 20;
initial
begin
CLK_IN = 1'b0;
#10;
forever
#(PERIOD/2) CLK_IN = ~CLK_IN;
end
initial begin
RST = 0;
S = 3;
C = 1;
end
endmodule
仿真波形:
各个信号仿真波形正常,唯有LED[7:0]均为高阻态(除最低位外),仿真不成功,不得其解。

相关文档
最新文档