一、数码管显示原理
数码管由多个发光二极管组成,分为共阳型和共阴型两种。什么型的数码管就在公共端加什么电平(例如,共阳型数码管在公共端加高电平),然后在字码端加字型代码就可以驱动显示了。
数码管动态显示工作原理:利用人眼视觉惰性,只要数码管显示刷新的速度足够快,人眼就无法分辨出来。
本实验是在EGO1开发板上利用数码管显示数字1234。数码管原理图如下。
由图可知,开发板上的数码管为共阴型数码管,公共端需要加高电平才能使NPN三极管导通。
二、代码
module seg_dtxs(clk,rst,seg,com);
input clk,rst;
output [7:0]seg;
output [3:0]com;
reg [7:0]seg;
reg [3:0]com;
reg [1:0]dm;
reg [16:0]counter;
//产生1ms延时
always @(posedge clk or negedge rst)
begin
if(!rst)
counter <= 0;
else if(counter == 99_999)
counter <= 0;
else
counter <= counter + 1;
end
//每隔1ms计数加1,加到4自动归0
always @(posedge clk or negedge rst)
begin
if(!rst)
dm <= 0;
else if((counter == 99_999) && (dm == 3))
dm <= 0;
else if(counter == 99_999)
dm <= dm + 1;
else
dm <= dm;
end
//根据计数的值来选择哪一个数码管公共端被导通
always @(*)
begin
case(dm)
0:com <= 4'b0001;
1:com <= 4'b0010;
2:com <= 4'b0100;
3:com <= 4'b1000;
default:com <= 4'b0001;
endcase
end
//根据被导通时,该位置需要显示什么就送什么字型代码
always @(*)
begin
case(dm)
0:seg <= 8'h66; // 4
1:seg <= 8'h4f; // 3
2:seg <= 8'h5b; // 2
3:seg <= 8'h06; // 1
endcase
end
endmodule