Verilog流水灯实验报告.pptx

合集下载

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

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

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

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

此次设计采‎用X ILI‎NX的XS‎E500E‎型芯片的开‎发板,芯片采用F‎G320型‎接口,速度级别-4。

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

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

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

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

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

还有复位输‎入r st,高电平有效‎。

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

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

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入门系列实验教程——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。

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脚输入。

课程设计流水灯报告

课程设计流水灯报告

大规模数字电路课程设计设计题目:流水灯设计专业:电子信息科学与技术班级:电信092学号:3学生姓名:***设计时间:2011-2012学年上学期教师评分:2011年 12 月 12日目录一、实验目的:.................................................................... 错误!未定义书签。

二、设计内容........................................................................ 错误!未定义书签。

三、实验用到的软件和器材................................................ 错误!未定义书签。

四、实验步骤........................................................................ 错误!未定义书签。

五、程序源代码.................................................................... 错误!未定义书签。

六、调试结果及分析............................................................ 错误!未定义书签。

1.在线调试:.............................................................. 错误!未定义书签。

2.管脚分配.................................................................... 错误!未定义书签。

3.分频器:.................................................................. 错误!未定义书签。

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。

流水灯实验报告

流水灯实验报告

流水灯实验报告
今天,我们进行了一个有趣的实验 - 流水灯实验。

首先,让我们来谈一谈流水灯的原理。

简单来说,流水灯是一
组LED灯,它们像水一样从一端流向另一端,每个灯的状态依次
更改。

然后,我们开始制作流水灯。

首先,我们需要一块电路板和一
些LED灯。

我们将LED灯焊接在电路板上,并使用一些导线连接它们。

然后,在一端添加一个电缆,以便将电路板连接到电源。

接下来,我们需要使用一个可编程芯片来控制LED灯的闪烁
模式。

我们使用了Atmel AVR芯片作为我们的控制器,并编写了
一些简单的程序来控制LED灯的行为。

我们将程序上传到芯片中,然后将电路板连接到电源。

最后,我们观察了流水灯的行为。

在阳光明媚的白天,我们试
图让它在室内工作。

我们发现,在光线充足的情况下,灯的亮度
有些微弱,但在较暗的照明条件下,流水灯效果比较明显。

在实验中,我们学会了如何制作和控制流水灯。

这为我们了解电子设备的原理和工作方式提供了一个很好的机会。

我们也体会到了在实验过程中需要耐心和细心的重要性。

总的来说,这是一个乐趣和收获并存的实验。

我们期待着在将来的实验中探索更多有趣和有用的东西。

FPGA入门系列实验教程——LED流水灯

FPGA入门系列实验教程——LED流水灯

艾米电子工作室FPGA入门系列实验教程FPGA入门系列实验教程V1.0前言目前市场销售FPGA开发板的厂商很多,但大多只提供些简单的代码,没有详尽的文档和教程提供给初学者。

经验表明,很多学生在学习FPGA设计技术的过程中,虽然刚开始学习热情很高,但真正坚持下来一直到“学会”的却寥寥无几,除了学生个人毅力的因素外,另外一个更主要的原因就是所选的开发板缺少配套的说明文档和手把手系列的入门教程。

原本FPGA的学习门槛相对于单片机来说就高了不少,再加上缺少手把手系列教程资料,这就给初学者学习FPGA增添了更多的困难,很多初学者因为找不到入门的方法而渐渐失去了学习FPGA的兴趣和信心。

作者从接著到系统学习FPGA有两年多的时间了,学习FPGA的时间不长,期间因为没有专业的老师指导,自己摸索学习FPGA走了很多的弯路。

有过问题迎刃而解的快乐,也有过苦苦寻求结果和答案的痛苦历程,回想起自己学习FPGA的历程,从开始的茫然,到后来的疯狂看书,购买开发板,在开发板上练习各种FPGA实例,到最后能独立完成项目,一路走来,感受颇多。

发觉学习FPGA只要选择正确的方法是有捷径可走的,有很多人学习FPGA很长时间,因为没有找到正确的方法还是停留在入门阶段。

针对现状,作者从初学者的角度出发,结合作者学习FPGA的经验和亲身体会,遵循“宁可啰嗦一点,也不放过细节”的原则编写了详尽的实验教程作为艾米电子工作室开发套件的配套教程使用,主要面向FPGA初学者。

FPGA的学习只有通过大量的操作与实践才能很好并快速的掌握。

为此本实验教程从点亮LED 灯写起,深入浅出,以图文并茂的方式由易到难地列举了很多实例,采用手把手、Step by Step的方式让初学者以最快的方式掌握FPGA技术的开发流程以及Quartus II软件的使用,从而激起初学者学习FPGA的兴趣。

在教程中作者采用“授人以渔”的方式,努力做到不仅讲述怎样进行试验,而且分析为什么这样做,以便初学者深刻理解并快速掌握FPGA的学习方法。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
reg rst_n; reg cnt; wire led;
initial begin clk = 0; rst_n = 0; #100 rst_n = 1; end
always #5 clk=~clk;
LSD LSD_inst( .clk(clk), .rst_n(rst_n),
学海无 涯
流水灯实验报告
实验二 流水灯
一、 实验目的
学会编写一个简单的流水灯程序并掌握分频的方法。熟悉 Modelsim 仿真软件的使用。
二、 实验要求
用 Quartus 编写流水灯程序,在 Modelsim 软件中进行仿真。
三、 实验仪器和设备
1、 硬件:计算机 2、 软件:Quartus、Modelsim、(UE)
四、 实验内容
1、 将时钟周期进行分频。 2、 编写 Verilog 程序实现 LED 等依次亮灭,用 Modelsim 进行仿真,绘制波形图。
五、 实验设计
(一)分频原理 已知时钟周期f 为 50MHz,周期 T 为 1/f,即 20ns。若想得到四分频计数器,即周期为 80ns 的时钟,需要把时钟进行分频。即每四个时钟周期合并为一个周期。原理图如图 1 所示。
1
学海无 涯
clk LED
LED
FPGA
cnt
图 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。 流水灯
always@(posedge clk_4 or negedge clk_4) if(rst_n==0)
led
<=
4'b0001;
else
led
<=
{led[2:0],led[3]};//位拼接
endmodule 2、 测试文件 `timescale 1ns/1ns module LSD(); reg clk;
if(rst_n==0)
clk_4 <=
0;
else if(cnt==24_999_999)
clk_4 <=
1;
else if(cnt==49_999_999)
clk_4 <=
0;
else clk_4 =
clk_4;
//异步复位 //复位为 0.clk_4 为 0 //当计数器为 24999999 时,时钟跳变为 1 //当计数器为 49999999 时,时钟跳变为 0
图 4 流水灯仿真结果
//模块名与文件名一致。定义端口列表, //输入线型
output reg );
clk_4
//输出定义为寄存器型
reg[3:0] cnt;
//中括号定义位宽,定义中间变量 cnt
always@(posedge clk)
if(rst_n==0)
cnt
<=
else if(cnt==3)
cnt
<=
else
cnt
<=
0; 0; cnt+1;
//复位为 0,计数器也为 0 //当计数器=3 时清零(可用else if)
//计数器自加 1
always@(posedge clk)
if(rst_n==0)
clk_4 <=
0;
else if(cnt==1)
//复位为 0.clk_4 为 0
3
clk_4 <=
4
学海无 涯
cnt
<=
0;
else if(cnt==49_999_999)
cnt
<=
0;
else
cnt
<=ຫໍສະໝຸດ cnt+1;//复位为 0,计数器也为 0 //当计数器=49999999 时清零(可用 else if)
//计数器自加 1
always@(posedge clk or negedge clk)
1;
else if(cnt==3)
clk_4 <=
0;
endmodule 2、测试文件
`timescale 1ns/1ns
module tb_div_clk();
reg
clk;
reg
rst_n;
wire clk_4;
initial begin clk rst_n #100 rst_n end
= 0; = 0;
= 1;
always #5 clk=~clk;
div_clk div_clk_inst( .clk(clk), .rst_n(rst_n),
.clk_4(clk_4) );
endmodule (二) 流水灯
1、 程序文件
module LSD(
input
wire
input
wire
clk, rst_n,
output reg[3:0] led );
reg[25:0] cnt;
reg
clk_4;
always@(posedge clk) if(rst_n==0)
学海无 涯
//当计数器为 1 时,时钟跳变为 1 //当计数器为 3 时,时钟跳变为 0
//模块名与文件名一致。定义端口列表, //输入线型 //中括号定义位宽,定义中间变量 cnt
(二)流水灯 1、编写分频程序。
图 3 分频仿真结果 2
学海无涯
3、 编写测试程序。 3、进行仿真,为了节约时间和方便观察波形,将计数器值分别改为 24、49 跳转。波 形如图 4 所示。
七、 实验参考程序
(一) 时钟分频 1、程序文件 module div_clk( input wire clk, input wire rst_n,
clk rst_n clk_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、利用位拼接,实现循环。 (三)设计框图
4'b0001 4'b0010 4'b0100 4'b1000 相当于把低三位左移,并最高位放在最低位。 用位拼接可写为:
led<={led[2:0], led[3]}; 低三位 最高位
六、 实验方法和步骤
(一)时钟分频 1、 编写分频程序。 2、 编写测试程序。 3、 进行仿真,波形如图 3 所示。
相关文档
最新文档