数码管静态显示
按照连接方式不同可分为共阴极与共阳极数码管
数码管共十个引脚,除了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