前言
按照要求,应该实现如下功能:
实验目的:
掌握数码管显示原理,实现数码管动态显示
实验要求:
实现四个数码管可以显示不同的数字,按键 K1 控制第一个数码管,按一下数字加 1,显示从 0 到 9,按键 K2 控制第二个数码管,按一下数字加 1,显示从 0 到 9,类似的,按键 K3 控制第三个数码管,按键 K4 控制第四个数码管
依然使用官方提供的Demo,再次基础上学习实现功能。
1 数码管原理图
数码管原理图如下,从图中可以看出数码管的8个LED是共阳的,即正极连接在VCC,需要控制负极的电平就可以控制LED的亮灭:
其中a,b,c,d,e,f,dp分别对应的是数码管上的不同LED:
2 查看引脚分布
我们在“Pre Synthesize UCE”中可以看到demo示例中的引脚分布,如下:
结合原理图,我们可以知道,数码管LED对应关系如下:
数码管定义 |
引脚 |
数码管 |
---|
smg[0] |
1 |
g |
smg[1] |
88 |
f |
smg[2] |
96 |
e |
smg[3] |
99 |
d |
smg[4] |
98 |
c |
smg[5] |
3 |
b |
smg[6] |
2 |
a |
smg[7] |
84 |
dp |
由此可以知道,我们要输出不同的数字和字母,需要对每个LED进行开关控制,如下:
- 0:a,b,c,d,e,f亮:10000001
- 1:b,c亮:11001111
- 2:a,b,g,e,d亮:10010010
- 3:a,b,c,d,g亮:10000110
- 4:b,c,f,g亮:11001100
- 5:a,f,g,c,d亮:10100100
- 6:a,f,e,d,c,g亮:10100000
- 7:a,b,c亮:10001111
- 8:a,b,c,d,e,f亮:10000000
- 9:a,b,c,d,f亮:10000100
- A: a,b,c,e,f,g亮:10001000
- b: b,g,c,d,e亮:11000010
- C: a,f,e,d亮:10110001
- d: b,g,e,d,c亮:11000010
- e: a,f,g,e,d亮:10110000
- F: a,f,g,e亮:10111000
3 代码实现
官方代码已经实现了数码管 0~9 通过按键切换,我再次基础上增加了A,b,C,d,E,F这几个字母的显示,修改部分代码实现如下:
修改key_cnt.v如下:
begin
if(key_reg&&~key&&key_times==4
key_times <=`UD 4
else if(key_reg&&~key)
key_times <=`UD key_times + 1
end
修改seq_control.v如下:
begin
case(key)
4'd0:smg = 8'b1000_0001;//"0"
4'd1:smg = 8'b1100_1111;//"1"
4'd2:smg = 8'b1001_0010;//"2"
4'd3:smg = 8'b1000_0110;//"3"
4'd4:smg = 8'b1100_1100;//"4"
4'd5:smg = 8'b1010_0100;//"5"
4'd6:smg = 8'b1010_0000;//"6"
4'd7:smg = 8'b1000_1111;//"7"
4'd8:smg = 8'b1000_0000;//"8"
4'd9:smg = 8'b1000_0100;//"9"
4'd10:smg = 8'b1000_1000;//"A"
4'd11:smg = 8'b1100_0010;//"b"
4'd12:smg = 8'b1011_0001;//"C"
4'd13:smg = 8'b1100_0010;//"d"
4'd14:smg = 8'b1011_0000;//"E"
4'd15:smg = 8'b1011_1000;//"F"
default:smg = 8'b1111_1111;
endcase
end
4 实现效果
实现效果见末尾视频
按键控制数码管演示
|