按照要求,应该实现如下功能:
实验目的:
掌握数码管显示原理,实现数码管动态显示
实验要求:
实现四个数码管可以显示不同的数字,按键 K1 控制第一个数码管,按一下数字加 1,显示从 0 到 9,按键 K2 控制第二个数码管,按一下数字加 1,显示从 0 到 9,类似的,按键 K3 控制第三个数码管,按键 K4 控制第四个数码管
依然使用官方提供的Demo,再次基础上学习实现功能。
数码管原理图如下,从图中可以看出数码管的8个LED是共阳的,即正极连接在VCC,需要控制负极的电平就可以控制LED的亮灭:
其中a,b,c,d,e,f,dp分别对应的是数码管上的不同LED:
我们在“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~9
通过按键切换,我再次基础上增加了A,b,C,d,E,F这几个字母的显示,修改部分代码实现如下:
修改key_cnt.v如下:
begin
if(key_reg&&~key&&key_times==4'd15)
key_times <=`UD 4'd0;
else if(key_reg&&~key)
key_times <=`UD key_times + 1'b1;
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
实现效果见末尾视频
更多回帖