流水灯基于Verilog语言实现及测试代码

合集下载

verilog- HDL实现流水灯

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。

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。

[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的数字电路实验7:流水灯的实现

基于FPGA的数字电路实验7:流水灯的实现

基于FPGA的数字电路实验7:流水灯的实现原创 Daniel继年前介绍的时序逻辑电路之时钟分频后,今天我们来介绍第7讲:流水灯。

流水灯,有时候也叫跑马灯,是一个简单、有趣又经典的实验,基本所有单片机的玩家们在初期学习的阶段都做过。

本次我们也来介绍一下如何通过小脚丫FPGA实现一个流水灯。

流水灯就是让一连串的灯在一定时间内先后点亮并循环往复,所以其中的关键要领就在于控制每两个相邻LED亮灭的时间差,以及所有LED灯完成一组亮灭动作后的循环。

很久都没有用过小脚丫的朋友可以再回顾一下,这上面有8个LED灯,且低电平点亮。

实现流水灯的方法绝不止一种,在这里我们采用模块化的设计思路,因为模块化设计对于之后构建大型电路系统非常有帮助,并且我们还可以借机温习一下以前学过的内容。

现在我们的目标是每过1秒后点亮下一个LED灯并且熄灭当前灯,且在第8个灯熄灭之后循环整个流程,该如何设计整个模块?我们先上图后解释。

毫无疑问,第一步需要做的就是通过分频来生成一个周期为1秒的时钟信号,不了解时钟分频童鞋可以读一下本系列的第6篇内容。

有了一个1秒钟嘀嗒一次的时钟后,我们还要考虑到循环问题,因为在第8个LED灯熄灭之后还需要再返回到第1个。

那么这个时候我们就需要一个计数器,它的作用就是数羊,一只,两只…...数到第八只后重头再来。

数8只羊需要一个3位宽的变量(23=8)。

最后,由于我们是要依次点亮,也就是说8位的输出中每次只有1位是低电平,其余均为高电平(小脚丫LED灯为低电平点亮)。

这个特性正好对应了我们之前学过的3-8译码器。

现在我们再来捋一遍。

首先,通过分频在小脚丫上生成一个周期为1秒的慢速时钟信号,这个时钟信号传送到计数器之中;这个计数器是3位宽的,因此最多可以计八次慢速时钟的嘀嗒,并且计数每增加1时,都对应着3-8译码器的下一种输出,也就对应着流水灯的下一个状态。

现在我们上代码:•••••••••••••••••••••••module runningled (clk,led); input clk,rst; output[7:0] le d; reg [2:0] cnt ; / /定义了一个3位的计数器,输出可以作为3-8译码器的输入 wire clk1hz; //定义一个中间变量,表示分频得到的时钟,用作计数器的触发 //例化分频模块,产生一个1Hz时钟信号 divide #(.WIDTH(24),.N(12000000)) u2 ( //除数为12,000,000,因此频率为1Hz .clk(clk), .rst_n(rst), .clkout(clk1hz) ); //生成计数器,上沿触发并循环计数 always@(posedge clk1hz) cnt <=< span=""> cnt +1; // 达到位宽上限后可自动溢出清零 //例化3-8译码器模块 decode38 u1 ( .X(cnt), //例化的输入端口连接到cnt,输出端口连接到led .D(led) );endmodule在第四篇讲译码器的文章里,我们介绍过,如果需要调用/例化子模块时,需要将各子模块与大模块放入同一个工程文件下进行编译。

Verilog流水灯设计_SegLed

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设计代码

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

流水灯基于Verilog语言实现及测试代码

流水灯基于Verilog语言实现及测试代码

流水灯实验的Testbench报告一、设计源码(顺序方法)module led(input clk,input rstn,output reg[3:0]led);parameter T1s = 4'd10;reg[3:0]cnt_1s;always@(posedge clk or negedge rstn)if(!rstn)begincnt_1s <= 0;endelse if(cnt_1s == T1s)begincnt_1s <= 0;endelse begincnt_1s <= cnt_1s + 1'b1;endalways@(posedge clk or negedge rstn)if(!rstn)beginled <= 4'hf;endelse if(led == 4'hf) beginled <= 4'he;endelse if(cnt_1s == T1s)beginled <= {led[2:0],1'b1};endendmodule二、测试代码`timescale 1 ns/1 nsmodule led_tb();reg clk ;reg rstn;wire[3:0] led;parameter CYCLE = 20;parameter RST_TIME = 3 ;led u( .clk (clk ),.rstn (rstn ),.led (led ));initial beginclk = 0;forever#(CYCLE/2)clk=~clk;endinitial beginrstn = 1;#CYCLE;rstn = 0;#(CYCLE*RST_TIME);rstn = 1;endendmoduleTestbench设计的几个步骤:1、设定时间标尺、timescale;2、定义信号类型,与输入对接的reg,与输出对接的wire;3、对待测设计的顶层模块进行例化,即将testbench与待测设计接口对接;4、给输入接口产生激励。

用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流水灯实验报告

流水灯试验陈述试验二流水灯一、试验目标学会编写一个简略的流水灯程序并控制分频的办法.熟习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) ,即可解决问题,成功绘制波形图.。

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

流水灯实验的Testbench报告
一、设计源码(顺序方法)
module led(
input clk,
input rstn,
output reg[3:0]led
);
parameter T1s = 4'd10;
reg[3:0]cnt_1s;
always@(posedge clk or negedge rstn)
if(!rstn)begin
cnt_1s <= 0;
end
else if(cnt_1s == T1s)begin
cnt_1s <= 0;
end
else begin
cnt_1s <= cnt_1s + 1'b1;
end
always@(posedge clk or negedge rstn)
if(!rstn)begin
led <= 4'hf;
end
else if(led == 4'hf) begin
led <= 4'he;
end
else if(cnt_1s == T1s)begin
led <= {led[2:0],1'b1};
end
endmodule
二、测试代码
`timescale 1 ns/1 ns
module led_tb();
reg clk ;
reg rstn;
wire[3:0] led;
parameter CYCLE = 20;
parameter RST_TIME = 3 ;
led u( .clk (clk ),
.rstn (rstn ),
.led (led )
);
initial begin
clk = 0;
forever
#(CYCLE/2)
clk=~clk;
end
initial begin
rstn = 1;
#CYCLE;
rstn = 0;
#(CYCLE*RST_TIME);
rstn = 1;
end
endmodule
Testbench设计的几个步骤:
1、设定时间标尺、timescale;
2、定义信号类型,与输入对接的reg,与输出对接的wire;
3、对待测设计的顶层模块进行例化,即将testbench与待测设计接口对接;
4、给输入接口产生激励。

三、结果分析
老师的源代码中设置的流水灯跳转周期是1S钟,但是在仿真的过程中,1S 实在是太漫长了,所以我将跳转周期改为10个时钟周期了。

根据testbench可知,第一个时间周期结束,拉低复位信号。

复位信号产生低电平,always块得到反应,led=4’hf(即1111);每次clk上升沿的时候always都会响应,但是rstn为低电平时,计数的变量cnt_1s会一直清零,led 一直处于全灭状态。

我在TESTBENCH中设置的rstn拉低持续3时钟周期,3时钟周期后,rstn会变成高电平,在下一个clk上升沿,always又开始响应,根据设计当led原状态为1111,触发后会跳转为1110,即第一个led亮。

之后,按设计初衷应该是每过10个时钟周期,led产生一次流水式变化,但实际情况并非如此。

我们可以看到上图中黄线位置,led由0111经过10个时钟周期后变成1111,但是1111只持续了一个周期就变成了1110.原来,在第二个always
中有这么一句
else if(led == 4'hf) begin
led <= 4'he;
end
虽然计时变量cnt_1s未满足条件,但是led==1111,仍然会使led发生改变。

而且led==1111时,led是处于全灭状态,作为流水灯应该是不希望全灭状态的出现,第四个灯亮完,应该马上跳转到第一个灯。

即便如此在实
物电路中,这并不会影响功能的实现,因为多出的这一个时钟周期仅为20ns,人的肉眼根本无法识别。

四、程序优化
试想如果这不是一个流水灯实验,而是一个对精度有很高要求的电路,不允许出现这么一段全1的状态,那么程序该如何修改?
其实led全为1的状态,主要是由于第二个always模块产生,所以只用修改第二个always的内容,下面是我修改后的代码,和运行结果。

这段代码主要的关键就在于阻塞赋值。

修改后:
运行结果:
对比运行结果,我们很容易发现,led没有再出现全1的状态,而是标准的按照10个时钟周期跳转一次,达到预期效果。

相关文档
最新文档