FPGAer:动态数码管显示实战

实战任务:在6位数码管上计数,循环计数0到999999,数字是每隔100ms增加1。

动态数码管显示原理:

如下图所示,6个数码管的八位段码都连接在一起,如果6个数码管都点亮,段码一定显示相同的数字。但是又想6个数码管显示不同的数字,那么只能动态地显示数码管,如何动态显示呢?需要利用人眼的视觉暂留,假设如果a数码管点亮数字1,接着a数码管熄灭,b数码管点亮数字2。但是在人眼看来,有12数字出现,从而达到不同数码管有不同的数字。

所以代码中顶层模块包括计数、显示模块。

计数模块代码如下:

每隔0.1s数字加1,实现data从0加到999999。

always @ (posedge clk or negedge rst_n) begin
if (!rst_n) begin
cnt <= 23'b0;
flag<= 1'b0;
end
else if (cnt < 5000000 - 1'b1) begin
cnt <= cnt + 1'b1;
flag<= 1'b0;
end
else begin
cnt <= 23'b0;
flag <= 1'b1;
end
end

always @ (posedge clk or negedge rst_n) begin
if (!rst_n)begin
data <= 20'b0;
point <=6'b000000;
en <= 1'b0;
sign <= 1'b0;
end
else begin
point <= 6'b000000; 
en <= 1'b1; 
sign <= 1'b0; 
if (flag) begin 
if(data < 20'd999999)
data <= data +1'b1;
else
data <= 20'b0;
end
end
end

显示模块:

数码管的工作时钟在5MHZ,所以要时钟分频。

设置一个24位的寄存器把六位数码管的值存下来。

(关键部分)设置一个1ms的时钟,使得六位数码管依次显示,但是人眼看不出来的。

上一步的很快显示附带有传数值给每一位的段码,比如数字12,尽管其他位的数码管会点亮,但是只有个位、十位被给予了1和2,接着个位和十位的段码能够点亮。但是其他位的段码没有点亮,不能显示数字。

段码点亮是共阳极低电平点亮。

猜你喜欢

转载自www.cnblogs.com/FPGAer/p/13033155.html