数码管静态显示程序,上板验证成功

该博客介绍了如何使用VHDL设计数码管的静态显示,包括共阴极和共阳极数码管的工作原理。文中提到了位选和段选信号的概念,并展示了如何通过计数模块实现每0.5秒更新数码管显示的计时功能。源代码包含顶层模块、计数模块和数码管显示模块,通过这三个模块协同工作,实现了数码管的动态变化效果。
摘要由CSDN通过智能技术生成

数码管静态显示

 按照连接方式不同可分为共阴极与共阳极数码管
数码管共十个引脚,除了a,b,c,d,e,f,g,dp,两个公共端,共阴极数码管公共端连接到gnd,共阳极数码管阳极公共端连接到+5V,共阴极需要在端口给低电平,共阳极需要在端口给高电平。
数码管分为位选与段选信号,位选给高电平。
六个数码管显示0-f,同时数码管每隔0.5s变化一次。
由于每隔0.5s变化一次,所以需要一个计时器。

 如下图是源代码
分为顶层模块,计数模块数码管显示模块

> module seg_led_static_top(clk,rst_n,sel,sel_led); 
>  input clk,rst_n;
>  output  [5:0] sel;               //数码管位选 
>  output [7:0] sel_led;            //数码管段选 
>  parameter  TIME=25'd25000_000;   //0.5s变化间隔  
>  wire add_flag;                   //数码管变化通知信号 
>  //参数传递
>  //控制模块 
>  time_count #(.MAX_NUM(TIME)) time_count_inst(
>                 .clk(clk),
>                 .rst_n(rst_n),
>                 .add_flag(add_flag)
>                 );  
>      //计数模块
> 					 
> seg_led_static  u_seg_led_static(
>                            .clk(clk),
>                            .rst_n(rst_n),
>                            .add_flag(add_flag),
>                            .sel(sel),
>                            .sel_led(sel_led)
>                                 );
> 	//数码管显示模块			
> endmodule

计数模块

> module time_count(clk,rst_n,add_flag);  
> input clk,rst_n;  
> output reg  add_flag; 
> parameter MAX_NUM=25000_000;
> reg [24:0] cnt; 
>  always  @(posedge clk or negedge rst_n)  
>    begin  if(!rst_n)    
>      cnt<=25'd0;   
>    else if(cnt==MAX_NUM)   
>      cnt<=25'd0;
>       else    
>     cnt<=cnt+1;   
>   end 
>    always @(posedge clk or negedge rst_n) 
>     begin      
>        if(!rst_n)    
>         add_flag<=0;   
>       else 
>     begin 	
>        if(cnt==MAX_NUM)
> 	        add_flag<=1; 	   	
>        else
> 	        add_flag<=0;
>         end   
>      end
 endmodule

数码管显示模块

>  module seg_led_static
>  (clk,rst_n,add_flag,sel,sel_led);   
>   input clk,rst_n;  
>   input add_flag;  
>   output reg [5:0] sel;    
>   output reg  [7:0] sel_led;  
>   reg [3:0] cnt;
> //加法器
>  always @(posedge clk or negedge rst_n)  
>   begin
>      if(!rst_n)   
>          sel<=6'b111_111;   
>       else  
>          sel<=6'b000_000;    
>     end
> 
> always @(posedge clk or negedge rst_n)  
>  begin 
>     if(!rst_n)  
>        cnt<=0; 
>     else if(add_flag)   
>      begin 	
>        if(cnt==4'd15)
> 	        cnt<=0;  	
>       else
> 	       cnt<=cnt+1; 	 	
>          end    	
>      else     	 
>         cnt<=cnt;  
>       end
> 
>  always @(posedge clk or negedge rst_n)
>   begin 
>    if(!rst_n)  
>       sel_led<=8'b0; 
>    else  
>     case(cnt)
>      4'h0: sel_led<=8'b1100_0000;
>      4'h1: sel_led<=8'b1111_1001;
>      4'h2: sel_led<=8'b1010_0100;
>      4'h3: sel_led<=8'b1011_0000;
>      4'h4: sel_led<=8'b1001_1001;
>      4'h5: sel_led<=8'b1001_0010;
>      4'h6: sel_led<=8'b1000_0010;
>      4'h7: sel_led<=8'b1111_1000;
>      4'h8: sel_led<=8'b1000_0000; 	
>      4'h9: sel_led<=8'b1001_0000; 	
>      4'ha: sel_led<=8'b1000_1000; 	 
>      4'hb: sel_led<=8'b1000_0011; 	
>      4'hc: sel_led<=8'b1100_0110; 	
>      4'hd: sel_led<=8'b1010_0001; 	
>      4'he: sel_led<=8'b1000_0110; 	 
>      4'hf: sel_led<=8'b1000_1110; 	
>       default: 
> 	        sel_led<=8'b1100_0000;    	
>      endcase 
>      end
>    endmodule
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值