Verilog流水灯设计_SegLed
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。
基于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文档写而已的。
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七、心得体会通过这次课程设计,我拓宽了知识面,锻炼了能力,综合素质得到较大提高。
最新verilog语言的FPGA变速花样流水灯设计
v e r i l o g语言的F PG A变速花样流水灯设计基于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实验报告流水灯数码管秒表交通灯
流水灯实验目的:在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开发板一块,计算机一台。
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输出与预期吻合。
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。
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。
共阴共阳与电路接线密切相关,决定了驱动电路的接法,因此在电路设计前要考虑好数码管的类型,否则就不能实现显示的效果了。
共阳极的比较容易驱动,共阴极的比较好编程。
流水灯verilog设计代码
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 ;
verilogCPLD流水灯课程设计
verilogCPLD流水灯课程设计一、课程目标知识目标:1. 学生理解Verilog HDL基本语法和结构,掌握CPLD的基本原理和使用方法。
2. 学生能够描述流水灯的工作原理,并运用Verilog HDL编写程序实现流水灯的功能。
3. 学生了解数字电路设计中时序控制的重要性,并掌握基本时序电路的设计方法。
技能目标:1. 学生能够使用Verilog HDL进行基本程序编写,具备CPLD程序烧录和调试的能力。
2. 学生通过课程实践,培养动手操作能力,提高问题解决能力。
3. 学生能够运用所学知识,进行小组合作,完成流水灯课程的综合性设计。
情感态度价值观目标:1. 学生培养对电子设计的兴趣,增强学习主动性和积极性。
2. 学生在课程实践中,培养团队合作精神,提高沟通与协作能力。
3. 学生认识到电子技术在日常生活中的应用,激发创新意识和实践欲望。
课程性质:本课程为电子技术实践课程,以培养学生的实际操作能力和综合设计能力为主。
学生特点:学生已具备一定的电子技术基础知识,对Verilog HDL和CPLD有一定了解,但实际操作能力有待提高。
教学要求:结合学生特点,注重理论与实践相结合,提高学生的动手能力和创新意识。
在教学过程中,强调团队合作,培养学生沟通协作能力。
通过课程目标的实现,使学生能够独立完成流水灯的设计与实现。
二、教学内容1. Verilog HDL基础语法与结构复习:重点回顾数据类型、运算符、控制语句等基本概念,确保学生能够熟练运用Verilog进行编程。
教材章节:第二章Verilog HDL基础2. CPLD基本原理与使用方法:介绍CPLD的内部结构、工作原理以及编程方法,使学生了解并掌握CPLD的基本使用。
教材章节:第三章CPLD/FPGA原理与应用3. 流水灯工作原理与设计:详细讲解流水灯的工作原理,分析设计思路,指导学生进行Verilog程序编写。
教材章节:第四章数字电路设计实例4. 时序控制与基本时序电路设计:探讨时序控制的重要性,教授基本时序电路的设计方法,为流水灯设计提供技术支持。
verilog流水灯(注释版)
else
begin
count<=count+1; //开始计数
if(count==41'hff_ff_ff) //计数41 ’hff_ff_ff的时间结束,这时间是灯亮的持续时间
begin
led<=led>>1; //led移位输出
count<=0; //一个灯亮完归零,下一个灯重新计数
if(led==8'h0) //8个灯亮了个遍
led<=8'h80;//重新回到第一个灯
end
end
end
endmodule
// testbench.v
`timescale 1ns/1ns
module testbench();
reg clk;
reg rst;
wire [7:0] led;
parameter period = 20;//测试时钟频率
重新回到第一个灯endendendendmodule
verilog流水灯(注释版)
八个流水灯
/*功能描述:是八个led灯呈流水灯形式闪烁*/
module led(
clk48M, //48M时钟输入
RSTn, //复位信号,高电平复位?
led //led输出
);
input clk48M;
input RSTn;
always #(period/2) clk = ~c = 0;
rst = 0;
#10 rst = 1;
end
led led_0(.clk48M(clk),.RSTn(rst),.led(led)); endmodule
output[7:0] led;
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流水灯实验报告
流水灯实验报告实验二 流水灯一、 实验目的学会编写一个简单的流水灯程序并掌握分频的方法。
熟悉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、利用位拼接,实现循环。
(三)设计框图FPGA clkcntLED 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'b00014'b00104'b01004'b1000相当于把低三位左移,并最高位放在最低位。
用位拼接可写为:led<={led[2:0], led[3]};低三位 最高位六、 实验方法和步骤(一)时钟分频1、 编写分频程序。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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。
共阴共阳与电路接线密切相关,决定了驱动电路的接法,因此在电路设计前要考虑好数码管的类型,否则就不能实现显示的效果了。
共阳极的比较容易驱动,共阴极的比较好编程。
LED数码管引脚图:驱动方式:静态驱动是指每个数码管的每一个段码都由一个FPGA的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。
优点是编程简单,显示亮度高,缺点是占用I/O端口多。
动态显示驱动是将所有数码管通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示。
将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当FPGA输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于FPGA对位选通C OM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。
本次试验采用静态驱动方式。
6.Verilog HDL源代码Verilog HDL代码为:module SegLed_V2 (//inputinput sys_clk ,input sys_rst_n ,//outputoutput wire seg_c1 ,output wire seg_c2 ,output wire seg_c3 ,output wire seg_c4 ,output reg seg_a ,output reg seg_b ,output reg seg_c ,output reg seg_e ,output reg seg_d ,output reg seg_f ,output reg seg_g ,output reg seg_h);//parameter defineparameter WIDTH2 = 26;parameter WIDTH = 5;parameter SIZE = 8;//reg definereg [3:0] counter ;reg [WIDTH2-1:0] count ;reg [SIZE-1:0] disp_data ;reg [SIZE-1:0] dat ;reg disp_clk ;reg [25:0] clk_cnt ;reg segled_a ;reg segled_b ;reg segled_c ;reg segled_e ;reg segled_d ;reg segled_f ;reg segled_g ;reg segled_h ;//wire define/******************************************************************** ************************************* Main Program**********************************************************************************************************/// gen a counter for SEGLED counter, 1S = 50000000 * 20ns always @(posedge sys_clk or negedge sys_rst_n) begin if (sys_rst_n ==1'b0)clk_cnt <= 26'b0;else if ( clk_cnt == 26'd5******* )clk_cnt <= 26'b0;elseclk_cnt <= clk_cnt + 26'b1;end// gen a SEGLED counter for control SEGLED disp speed always @(posedge sys_clk or negedge sys_rst_n) begin if (sys_rst_n ==1'b0)counter <= 4'd0;else if ( clk_cnt == 26'd5******* && counter == 4'd9 ) counter <= 4'b0;else if ( clk_cnt == 26'd5******* )counter <= counter + 4'b1;else ;end// control SEGLED disp 0-9always @(*) begincase (counter)9 :beginsegled_a = 1 ;segled_b = 1 ;segled_c = 1 ;segled_e = 0 ;segled_d = 0 ;segled_f = 1 ;segled_g = 1 ;segled_h = 0 ;end8 :beginsegled_a = 1 ;segled_b = 1 ;segled_c = 1 ;segled_e = 1 ;segled_d = 1 ;segled_g = 1 ;segled_h = 1 ;end7 :beginsegled_a = 1 ;segled_b = 1 ;segled_c = 1 ;segled_e = 0 ;segled_d = 0 ;segled_f = 0 ;segled_g = 0 ;segled_h = 0 ;end6 :beginsegled_a = 1 ;segled_b = 0 ;segled_c = 1 ;segled_e = 1 ;segled_d = 1 ;segled_f = 1 ;segled_g = 1 ;segled_h = 0 ;end5 :beginsegled_a = 1 ;segled_b = 0 ;segled_c = 1 ;segled_e = 0 ;segled_d = 1 ;segled_f = 1 ;segled_g = 1 ;segled_h = 0 ;end4 :beginsegled_a = 0 ;segled_b = 1 ;segled_c = 1 ;segled_e = 0 ;segled_d = 0 ;segled_g = 1 ;segled_h = 0 ;end3 :beginsegled_a = 1 ;segled_b = 1 ;segled_c = 1 ;segled_e = 0 ;segled_d = 1 ;segled_f = 0 ;segled_g = 1 ;segled_h = 0 ;end2 :beginsegled_a = 1 ;segled_b = 1 ;segled_c = 0 ;segled_e = 1 ;segled_d = 1 ;segled_f = 0 ;segled_g = 1 ;segled_h = 0 ;end1 :beginsegled_a = 0 ;segled_b = 1 ;segled_c = 1 ;segled_e = 0 ;segled_d = 0 ;segled_f = 0 ;segled_g = 0 ;segled_h = 0 ;end0 :beginsegled_a = 1 ;segled_b = 1 ;segled_c = 1 ;segled_e = 1 ;segled_d = 1 ;segled_g = 0 ;segled_h = 1 ;enddefault :beginsegled_a = 0 ;segled_b = 0 ;segled_c = 0 ;segled_e = 0 ;segled_d = 0 ;segled_f = 0 ;segled_g = 0 ;segled_h = 0 ;endendcaseend// SEGLED is low activealways @(*) beginseg_a = ~segled_a ;seg_b = ~segled_b ;seg_c = ~segled_c ;seg_e = ~segled_e ;seg_d = ~segled_d ;seg_f = ~segled_f ;seg_g = ~segled_g ;seg_h = ~segled_h ;end// four bit SEGLED disp at the same timeassign seg_c1 = 1'b0;assign seg_c2 = 1'b0;assign seg_c3 = 1'b0;assign seg_c4 = 1'b0;endmodule//end of RTL code7.日积月累同学们思考下数码管的动态扫描该如何实现呢?8.综合出的电路SegLed代码综合出的电路如下:版本:2013-06-12 更新方案说明和视频讲解。