Verilog流水灯实验报告
verilog- HDL实现流水灯
用verilog实现流水灯module flow_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;//fen pingalways @ (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] ; //16 fen pinreg [4:0] state;parameter [4:0] IDLE =5'b0_0001;parameter [4:0] RIGHT =5'b0_0010;parameter [4:0] LEFT =5'b0_0100;parameter [4:0] DOUB_LEFT =5'b0_1000;parameter [4:0] ERROR =5'b1_0000;reg [4:0] cur_sta;always @ (posedge clk or negedge pin_rest_n) begin if(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) beginstate <= DOUB_LEFT ;endelse beginstate <= ERROR ;endendLEFT : 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 ;endendRIGHT : 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 ;endendDOUB_LEFT : 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 ;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。
VerilogHDL流水灯设计
VerilogHDL流水灯设计第一篇:VerilogHDL流水灯设计大规模数字逻辑题目:流水灯控制专业电子信息科学与技术班级学号学生姓名设计时间教师评分2013年 12 月 10 日目录一、概述 (1)二、设计目的 (1)三、设计内容 (1)四、设计原理图 (1)五、引脚分配情况 (2)六、源程序代码...........................................2 VerilogHDL 程序:.....................................2 分频器部分: (5)七、心得体会 (6)八、参考文献 (6)一、概述流水灯是一串按一定的规律像流水一样连续闪亮,流水灯控制是可编程控制器的一个应用,其控制思想在工业控制技术领域也同样适用。
流水灯控制可用多种方法实现,但对现代可编程控制器而言,基于EDA技术的流水灯设计也是很普遍的。
二、设计目的1、熟悉利用Quartus II 开发数字电路的基本流程和Quartus II 软件的相关操作。
2、掌握基本的设计思路,软件环境参数配置,仿真,管脚分配,利用JTAG/AS进行下载等基本操作。
3、了解VerilogHDL 语言设计或原理图设计方法。
4、通过本此设计,了解流水灯的工作原理,掌握其逻辑功能及设计方法。
三、设计内容1、用VerilogHDL语言设计一个流水灯,输入0的时候led~led7,1Hz正向流水3次,然后全亮;然后2Hz逆向流水5次全亮;循环。
输入1的时候led0~led7,0.5Hz奇数流水2次,全亮,1Hz偶数流水4次,全亮,然后循环。
2、用QuartusII 软件进行编译,仿真,下载到实验平台进行验证。
四、设计原理图en为可调输入,输出为8位数据,为流水灯实验,试用8个LED 指示灯来表示,具体引脚分配见下。
五、引脚分配情况六、源程序代码VerilogHDL 程序:module LED(clk,led,en);input clk;input en;output [7:0]led;// 输出端口定义为寄存器型reg [7:0] led;reg [8:0] state1;reg [8:0] state2;always @(posedge clk)// always语句,表示每当CLK的上升沿到来时,完成begin-end之间语句的操作if(!en)begin state2 = 0;state1 = state1 + 1;// one clk,one statecase(state1)1,2: led <= 8'b00000001;//1-7 zhengxu,3bian3,4: led <= 8'b00000010;7,8: led <= 8'b00001000;9,10: led <= 8'b00010000;11,12: led <= 8'b00100000;13,14: led <= 8'b01000000;15,16: led <= 8'b10000000;17,18: led <= 8'b00000001;19,20: led <= 8'b00000010;21,22: led <= 8'b00000100;23,24: led <= 8'b00001000;25,26: led <= 8'b00010000;27,28: led <= 8'b00100000;29,30: led <= 8'b01000000;31,32: led <= 8'b10000000;33,34: led <= 8'b00000001;35,36: led <= 8'b00000010;37,38: led <= 8'b00000100;39,40: led <= 8'b00001000;41,42: led <= 8'b00010000;43,44: led <= 8'b00100000;45,46: led <= 8'b01000000;47,48: led <= 8'b10000000;49: led <= 8'b11111111;//quanliang 50: led <= 8'b10000000;51: led <= 8'b01000000;52: led <= 8'b00100000;53: led <= 8'b00010000;54: led <= 8'b00001000;55: led <= 8'b00000100;56: led <= 8'b00000010;58: led <= 8'b10000000; 59: led <= 8'b01000000; 60: led <= 8'b00100000; 61: led <= 8'b00010000; 62: led <= 8'b00001000; 63: led <= 8'b00000100; 64: led <= 8'b00000010; 65: led <= 8'b00000001; 66: led <= 8'b10000000; 67: led <= 8'b01000000; 68: led <= 8'b00100000; 69: led <= 8'b00010000; 70: led <= 8'b00001000; 71: led <= 8'b00000100; 72: led <= 8'b00000010; 73: led <= 8'b00000001; 74: led <= 8'b10000000; 75: led <= 8'b01000000; 76: led <= 8'b00100000; 77: led <= 8'b00010000; 78: led <= 8'b00001000; 79: led <= 8'b00000100; 80: led <= 8'b00000010; 81: led <= 8'b00000001; 82: led <= 8'b10000000; 83: led <= 8'b01000000; 84: led <= 8'b00100000; 85: led <= 8'b00010000; 86: led <= 8'b00001000;88: led <= 8'b00000010;89: led <= 8'b00000001;90: led <= 8'b11111111;91: begin led <= 8'b00000000;state1=0;end default: state1 = 0;endcaseendelsebegin state1 = 0;state2 = state2 + 1;// one clk,one statecase(state2)1,2,3,4: led <= 8'b00000001;5,6,7,8: led <= 8'b00000100;9,10,11,12: led <= 8'b00010000;13,14,15,16: led <= 8'b01000000;17,18,19,20: led <= 8'b00000001;21,22,23,24: led <= 8'b00000100;25,26,27,28: led <= 8'b00010000;29,30,31,32: led <= 8'b01000000;33: led <= 8'b11111111;34,35: led <= 8'b00000010;36,37: led <= 8'b00001000;38,39: led <= 8'b00100000;40,41: led <= 8'b10000000;42,43: led <= 8'b00000010;44,45: led <= 8'b00001000;46,47: led <= 8'b00100000;48,49: led <= 8'b10000000;50,51: led <= 8'b00000010;52,53: led <= 8'b00001000;54,55: led <= 8'b00100000;56,57: led <= 8'b10000000;58,59: led <= 8'b00000010;60,61: led <= 8'b00001000;62,63: led <= 8'b00100000;64,65: led <= 8'b10000000;66: led <= 8'b11111111;67:begin led <= 8'b00000000;state2=0;enddefault: state2 = 0;// default,8'b11111110endcaseend Endmodule分频器部分:module clk_div(clk_out,clk_in);input clk_in;output clk_out;reg clk_out;reg[25:0]counter;//50_000_000=1011_1110_1011_1100_0010_0000_00 parameter cnt=25_000_000;/// 50MHz is the sys clk,50_000_000=2FAF080always @(posedge clk_in)begincounter<=counter+1;if(counter==cnt/2-1)beginclk_out<=!clk_out;counter<=0;endend endmodule 5七、心得体会通过这次课程设计,我拓宽了知识面,锻炼了能力,综合素质得到较大提高。
流水灯实验报告
实验二流水灯一、实验目的通过此实验进一步了解,熟悉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相连接。
Verilog流水灯实验报告.pptx
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。 流水灯
verilog语言的FPGA变速花样流水灯设计
基于XILI NX--XSE500E型FPGA的变速流水灯以及花样流水灯的ve rilog语言设计摘要临近大四毕业,诸多工科院校电子电科通信等专业会选择用FP GA项目作为课程设计的课题,笔者同样经历了这个过程,收获颇多,在此将设计成果在此分享,以帮助大家更好掌握FP GA设计。
FPGA种类繁多,时效性非常好,设计过程中十分注重实时性,在时间点控制上非常优秀。
此次设计采用X ILINX的XSE500E型芯片的开发板,芯片采用FG320型接口,速度级别-4。
板载时钟50MHz,如需其他时钟周期,可采用IP核中的clo cking,其中的 DCM可以实现变频,引入DCM,输入频率50MHz,输出频率填入需要的频率即可,之后进行实例化。
此外,可以借助计数器进行延时减速,此次设计采用了计数器延时方法。
本次列举了四种流水灯相关设计:普通流水灯(向左和向右滚动),自动反复式流水灯(到最右端自动向左滚动,到左端自动向右滚动),花样流水灯,变速流水灯。
谢谢大家的支持!正文一,普通流水灯1,建模思想普通流水灯,可以向右滚动,到最右端返回最左端,也可以向左滚动,到最左端返回最右端。
普通流水灯模块涉及的端口有:clk,它是时钟输入,一般就是板载时钟,这里是50MHz,具体参照开发板说明。
还有复位输入r st,高电平有效。
此外就是le d端口,这个端口有8根管脚,共8位,连接8个le d灯。
采用veri log语言,端口定义格式如下:module led(inputclk,inputrst,output reg[7:0] led //此行定义说明l ed端口既是驱动管脚的,又是寄存器);采用过程建模,这里不采用行为建模和功能建模,因为这个过程就是一个大循环,规律性极强。
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开发板一块,计算机一台。
VerilogHDL流水灯设计
大规模数字逻辑题目:流水灯控制专业电子信息科学与技术班级学号学生姓名设计时间教师评分2013年12 月10 日目录一、概述 0二、设计目的 0三、设计内容 0四、设计原理图 0五、引脚分配情况 (1)六、源程序代码 (1)VerilogHDL 程序: (1)分频器部分: (4)七、心得体会 (5)八、参考文献 (5)一、概述流水灯是一串按一定的规律像流水一样连续闪亮,流水灯控制是可编程控制器的一个应用,其控制思想在工业控制技术领域也同样适用。
流水灯控制可用多种方法实现,但对现代可编程控制器而言,基于EDA技术的流水灯设计也是很普遍的。
二、设计目的1、熟悉利用Quartus II 开发数字电路的基本流程和Quartus II 软件的相关操作。
2、掌握基本的设计思路,软件环境参数配置,仿真,管脚分配,利用JTAG/AS 进行下载等基本操作。
3、了解VerilogHDL 语言设计或原理图设计方法。
4、通过本此设计,了解流水灯的工作原理,掌握其逻辑功能及设计方法。
三、设计内容1、用VerilogHDL语言设计一个流水灯,输入0的时候led~led7,1Hz正向流水3次,然后全亮;然后2Hz逆向流水5次全亮;循环。
输入1的时候led0~led7,0.5Hz奇数流水2次,全亮,1Hz偶数流水4次,全亮,然后循环。
2、用QuartusII 软件进行编译,仿真,下载到实验平台进行验证。
四、设计原理图en为可调输入,输出为8位数据,为流水灯实验,试用8个LED指示灯来表示,具体引脚分配见下。
五、引脚分配情况六、源程序代码VerilogHDL 程序:module LED( clk,led,en );input clk;input en;output [7:0]led;// 输出端口定义为寄存器型reg [7:0] led;reg [8:0] state1;reg [8:0] state2;always @(posedge clk )// always语句,表示每当CLK的上升沿到来时,完成begin-end之间语句的操作if(!en)begin state2 = 0;state1 = state1 + 1; // one clk,one statecase(state1)1,2: led <= 8'b00000001; //1-7 zhengxu,3bian3,4: led <= 8'b00000010;5,6: led <= 8'b00000100;9,10: led <= 8'b00010000;11,12: led <= 8'b00100000;13,14: led <= 8'b01000000;15,16: led <= 8'b10000000;17,18: led <= 8'b00000001;19,20: led <= 8'b00000010;21,22: led <= 8'b00000100;23,24: led <= 8'b00001000;25,26: led <= 8'b00010000;27,28: led <= 8'b00100000;29,30: led <= 8'b01000000;31,32: led <= 8'b10000000;33,34: led <= 8'b00000001;35,36: led <= 8'b00000010;37,38: led <= 8'b00000100;39,40: led <= 8'b00001000;41,42: led <= 8'b00010000;43,44: led <= 8'b00100000;45,46: led <= 8'b01000000;47,48: led <= 8'b10000000;49: led <= 8'b11111111; //quanliang50: led <= 8'b10000000;51: led <= 8'b01000000;52: led <= 8'b00100000;53: led <= 8'b00010000;54: led <= 8'b00001000;55: led <= 8'b00000100;56: led <= 8'b00000010;57: led <= 8'b00000001;58: led <= 8'b10000000;59: led <= 8'b01000000;60: led <= 8'b00100000;61: led <= 8'b00010000;62: led <= 8'b00001000;63: led <= 8'b00000100;64: led <= 8'b00000010;65: led <= 8'b00000001;66: led <= 8'b10000000;67: led <= 8'b01000000;68: led <= 8'b00100000;69: led <= 8'b00010000;71: led <= 8'b00000100;72: led <= 8'b00000010;73: led <= 8'b00000001;74: led <= 8'b10000000;75: led <= 8'b01000000;76: led <= 8'b00100000;77: led <= 8'b00010000;78: led <= 8'b00001000;79: led <= 8'b00000100;80: led <= 8'b00000010;81: led <= 8'b00000001;82: led <= 8'b10000000;83: led <= 8'b01000000;84: led <= 8'b00100000;85: led <= 8'b00010000;86: led <= 8'b00001000;87: led <= 8'b00000100;88: led <= 8'b00000010;89: led <= 8'b00000001;90: led <= 8'b11111111;91: begin led <= 8'b00000000;state1=0;enddefault: state1 = 0;endcaseendelsebegin state1 = 0;state2 = state2 + 1; // one clk,one statecase(state2)1,2,3,4: led <= 8'b00000001;5,6,7,8: led <= 8'b00000100;9,10,11,12: led <= 8'b00010000;13,14,15,16: led <= 8'b01000000;17,18,19,20: led <= 8'b00000001;21,22,23,24: led <= 8'b00000100;25,26,27,28: led <= 8'b00010000;29,30,31,32: led <= 8'b01000000;33: led <= 8'b11111111;34,35: led <= 8'b00000010;36,37: led <= 8'b00001000;38,39: led <= 8'b00100000;40,41: led <= 8'b10000000;42,43: led <= 8'b00000010;44,45: led <= 8'b00001000;46,47: led <= 8'b00100000;48,49: led <= 8'b10000000;50,51: led <= 8'b00000010;52,53: led <= 8'b00001000;54,55: led <= 8'b00100000;56,57: led <= 8'b10000000;58,59: led <= 8'b00000010;60,61: led <= 8'b00001000;62,63: led <= 8'b00100000;64,65: led <= 8'b10000000;66: led <= 8'b11111111;67:begin led <= 8'b00000000;state2=0;enddefault: state2 = 0; // default,8'b11111110endcaseendEndmodule分频器部分:module clk_div(clk_out,clk_in);input clk_in;output clk_out;reg clk_out;reg[25:0] counter; //50_000_000=1011_1110_1011_1100_0010_0000_00parameter cnt=25_000_000; /// 50MHz is the sys clk,50_000_000=2FAF080 always @(posedge clk_in)begincounter<=counter+1;if(counter==cnt/2-1)beginclk_out<=!clk_out;counter<=0;endendendmodule七、心得体会通过这次课程设计,我拓宽了知识面,锻炼了能力,综合素质得到较大提高。
多功能流水灯设计实验报告
多功能流水灯的设计一.设计要求:1.设计一8盏彩灯控制电路,使彩灯可以向左,向右流动、全亮、全灭四种功能。
功能变换可以手控也可以自控。
2.自动功能变换时间10秒。
二.总体方案构思:用Verilog语言来为单片机编程,通过编程来控制单片机各引脚在不同时间输出的不同的电平,进而控制个发光二级管的亮灭,以及控制流水灯的流速和流动方向。
1.使用按钮(auto)来控制手动或自动。
2.因为需要向左,向右,全亮,全灭四种功能,所以需要两个开关(btn1和btn2),分别用开和关两种状态表示,即(00,01,10,11)。
3.使用clk时钟来记时和触发事件。
三.实验器材:电脑和LED设备四.程序如下:module LED(clk,auto,btn1,btn2,led);input clk;input auto;input btn1;input btn2;output reg [7:0] led;reg [29:0] count;//1ns的计数器reg [3:0] count_10;//10秒的计数器reg [1:0] status;//记录当前LED灯流动的情况:"00左到右,01右到左,10全亮,11全灭"reg [1:0] type;reg second_1;//1秒的标志reg second_10;//10秒的标志initialbeginstatus<=2'b00;type<=2'b00;count<=30'b0;count_10<=4'b0;second_1<=1'b0;second_10<=1'b0;endalways@(posedge clk)//给出1s的标志和10s的标志beginif(count<25000000)//等待1s的到来begincount<=count+1;second_1<=0;second_10<=0;endelsebegincount<=0;second_1<=1;count_10<=count_10+1;if(count_10>=4'd10)beginsecond_10<=1;endendendalways@(posedge clk)//当自动的情况时,每10s变化一次流动状态beginif(auto==1 && second_1==1)beginif(second_10==1)beginif(status==2'b11)beginstatus<=2'b00;endelsebeginstatus<=status+1;endendendendalways@(posedge clk)//设置总变化状态等于手动或自动的状态beginif(second_1==1)beginif(auto==1)//自动begintype<=status;endelse//手动begintype<={btn1,btn2};endendendalways@(posedge clk)//根据type设置LED灯情况beginif(second_1==1)beginif(type==00)//左到右beginif(led==8'b00000000 || led==8'b11111111)beginled<=8'b10000000;endelsebeginled<=led>>1;endendelse if(type==01)//右到左beginif(led==8'b00000000 || led==8'b11111111)beginled<=8'b00000001;endelsebeginled<=led<<1;endendelse if(type==10)//全亮beginled<=8'b11111111;endelse//全灭beginled<=8'b00000000;endendendendmodule五.测试图如下:六.个人体会:在这次实验中收货颇丰,我学会了使用简单的Verilog语言,更加深入的学习了数字逻辑,还有更多的,我学会和同学们合作,讨论,去解决问题。
时序流水灯实验报告
一、实验目的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灯的亮灭顺序是否符合预期。
流水灯实验报告
扬州大学广陵学院课程设计报告设计题目:流水灯设计姓名:z t y学号:100036137班级:微电81001时间:2013年7月4日目录一.设计任务与要求 (3)二.实验目的 (3)三.实验思路 (3)1系统逻辑设计 (3)2源程序代码 (3)⑴LED流水灯控制模块 (4)⑵分频器 (5)⑶四位选择器 (5)⑷六位计数器 (6)⑸2位计数器 (6)3实验原理调用 (7)4仿真结果与分析 (7)四.心得体会 (8)一.设计任务与要求随着大规模集成电路技术和EDA技术的迅速发展,使得数字系统的硬件设计如同软件设计那样方便快捷,而Verilog HDL 是当前应用最广泛的并成为IEEE 标准的一种硬件描述语言。
Verilog HDL是在C语言的基础上演化而来,具有结构清晰、文法简明、功能强大、高速模拟和多库支持等优点。
此次课程设计通过使用Verilog HDL硬件描述语言设计了一个程序,使得流水灯可以根据自己所期望的方式点亮,并能在、MAX+plusⅡ进行仿真测试,得出出仿真结果。
通过课程设计深入理解VHDL语言的精髓,加深对数字电路和VHDL基本单元的理解,理论联系实际,提高设计能力,提高分析、解决计算机技术实际问题的独立工作能力。
二、实验目的1、熟悉利用MAX+plusⅡ开发数字电路的基本流程和MAX+plusⅡ软件的相关操作。
2、掌握基本的设计思路、软件环境参数配置和仿真。
3、了解VerilogHDL语言设计或原理图设计方法。
4、通过本知识点的学习,了解流水灯的工作原理,掌握其逻辑功能设计方法。
三、实验思路根据时钟信号的脉冲输入,我们以改变每个LED点亮状态的保持的时间来改变LED的变换间隔时间,根据LED的循环点亮和时间间隔的改变设计成为一个直观的LED流水灯自动循环系统,由此思路我们就可以很容易的着手流水灯控制程序的设计。
1.系统逻辑设计:根据以上的设计要求,运用模块化的设计思路,我们在MAX+plusⅡ软件系统中设计了LED流水灯控制模块、分频器模块、4位选择器、6位计数器、2位计数器,并通过各个模块程序之间的端口合理连接和协调,成功设计出LED流水灯灯控制电路,得到逻辑结构原理图,即为整个流水灯控制电路的逻辑结构。
Verilog流水灯设计_SegLed
SEGLED详细设计方案1.SEGLED简介:数码管由七个条状和一个点状发光二极管管芯制成,称为七段数码管。
数码管是一类价格便宜、使用简单,通过对其不同的管脚输入相对的电流,使其发亮,从而显示出数字能够显示时间、日期、温度等所有可用数字表示的参数的器件。
在电器特别是家电领域应用极为广泛,如显示屏、空调、热水器、冰箱等等。
绝大多数热水器用的都是数码管,其他家电也用液晶屏与荧光屏。
2.SEGLED规格:编写逻辑使七段数码管计数从0-9循环计数。
3.SEGLED方案目的:1、使学生掌握数码管的原理和使用方法。
2、使学生掌握利用FPGA的I/O口控制数码管原理和使用方法。
4.SEGLED硬件方案:5.实现原理七段数码管实物图片:七段数码管原理:拿显示8举例子;1 1 1 0 1 1 1 1 对应:e gf dp c d b a数码管类型:根据其结构的不同,可分为共阳极数码管和共阴极数码管两种。
共阳共阴,是针对数码管的公共脚而说的。
典型的一位数码管,一般有10个脚,8个段码(7段加1个小数点),剩下两个脚接在一起。
各个段码实际上是一个发光二极管,既然是发光二极管,就有正负极。
共阳,也就是说公共脚是正极(阳极),所有的段码实际上是负极,当某一个或某几个段码位接低电平,公共脚接高电平时,对应的段码位就能点亮,进而组合成数字或字母。
共阴是公共脚是负极(阴极),段码位是阳极,当公共脚接地,段码位接高电平时,对应段码位点亮。
一位数码管就是这样,多位的数码管原理类似。
LED数码管中各段发光二极管的伏安特性和普通二极管类似,只是正向压降较大,正向电阻也较大。
在一定范围内,其正向电流与发光亮度成正比。
由于常规的数码管起辉电流只有1~2 mA,最大极限电流也只有10~30 m A。
共阴共阳与电路接线密切相关,决定了驱动电路的接法,因此在电路设计前要考虑好数码管的类型,否则就不能实现显示的效果了。
共阳极的比较容易驱动,共阴极的比较好编程。
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(离线方式)。
FPGA流水灯实验
编写代码的首要任务是管理复杂度,研究表明人能同时关注的智 力模型为 7+2,而嵌套关注通常不超过 5 层。编写一段代码的同时关 注点很容易会超过 9 个。通过智力训练提供关注智力模型数的效果微 乎其微。所以为了能编写任意大规模的代码,把同一时间关注的智力 模型数降低的方法是很有效的。而且软件工程也是在制定相关的编程 规范,对编程限制的基础上发展起来的。VerilogHDL 虽然是硬件描述 语言,但它已经摆脱了原始的电路图输入的方式,具有更高的抽象性, 所以它应该可以应该软件开发中的类似的结论来提高开发效率。就像 高级语言相对于 01 机器码编程一样。我觉得在 verilogHDL 在模仿顺 序操作上更像汇编语言,因为它没有实现顺序,选择,循环结构的相
10
了对 Led_Driver 更高层次的操作,使得操作每个 LED 站在了抽象层, 而不是是底层。
在底层你需要考虑定时器翻转多少次才能到这个时间,然后还要 用这个时间打开或关闭 LED,这样需要考虑的问题很复杂也容易出错。 在抽象层你只需要给什么时候打开或关闭 LED 就够了,它就会自动的 完成翻转工作。抽象性也是人脑处理信息的方式,例如自己的家你甚 至说不清门是什么颜色的,门的把手是什么样式的。人脑对门的处理 是抽象的,它是一个可以开和关的门。你只需要知道这个就可以进入 家中,根本不需要记得门的颜色是什么。
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,计数器也为0 else 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/1nsmodule 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,计数器也为0 else 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实现双向流⽔灯 实现⼀个双向流⽔灯,从右往左流动,到最左边时,再从左边往右流动,然后再从右边开始流动,如此不断反复。
灯亮、间隔时间都为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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
流水灯实验报告
实验二 流水灯
一、 实验目的
学会编写一个简单的流水灯程序并掌握分频的方法。
熟悉Modelsim 仿真软件的使用。
二、 实验要求
用Quartus 编写流水灯程序,在Modelsim 软件中进行仿真。
三、 实验仪器和设备
1、 硬件:计算机
2、 软件:Quartus 、Modelsim 、(UE )
四、 实验内容
1、 将时钟周期进行分频。
2、 编写Verilog 程序实现LED 等依次亮灭,用Modelsim 进行仿真,绘制波形图。
五、 实验设计
(一)分频原理
已知时钟周期f 为50MHz ,周期T 为1/f ,即20ns 。
若想得到四分频计数器,即周期为80ns 的时钟,需要把时钟进行分频。
即每四个时钟周期合并为一个周期。
原理图如图1所示。
rst_n
clk
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、利用位拼接,实现循环。
(三)设计框图
FPGA
clk
cnt
LED 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。
流水灯
4'b0001
4'b0010
4'b0100
4'b1000
相当于把低三位左移,并最高位放在最低位。
用位拼接可写为:
led<={led[2:0], led[3]};
低三位 最高位
六、 实验方法和步骤
(一)时钟分频
1、 编写分频程序。
2、 编写测试程序。
3、 进行仿真,波形如图3所示。
图3 分频仿真结果
(二)流水灯
1、编写分频程序。
3、编写测试程序。
3、进行仿真,为了节约时间和方便观察波形,将计数器值分别改为2
4、49跳转。
波形如图4所示。
图4流水灯仿真结果
七、实验参考程序
(一)时钟分频
1、程序文件
module div_clk( lk(clk),
.rst_n(rst_n),
.clk_4(clk_4)
);
endmodule
(二)流水灯
1、程序文件
module LSD( lk(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) ,即可解决问题,成功绘制波形图。