baf5e4b6
rduhr
7Segment_display ...
|
1
2
3
4
|
# 7 Segment display
1. But du projet
1. I/O utilisées
|
45802ae2
rduhr
7Segment_display ...
|
5
6
|
1. Explication de l'algorithme
1. Résultats
|
baf5e4b6
rduhr
7Segment_display ...
|
7
8
9
10
11
12
13
|
> L'ensemble des codes, images et vidéos sont compris dans ce répertoire.
## But du projet
Nous avons décider de nous intéresser à l'affichage 7 segments grâce au but suivant:
|
e3f42ce5
rduhr
7Segment_display ...
|
14
|
- Créer un compteur de 0 à 9999 à l'aide des 4 afficheurs. En cas de dépassement ou d'appuye sur un bouton reset le compteur redémarrera à 0.
|
baf5e4b6
rduhr
7Segment_display ...
|
15
16
17
18
|
## I/O utilisées
Tout d'abord, voyons les entrées/sortie que nous avons utilisé.
|
122d531c
rduhr
7Segment_display ...
|
19
20
21
22
23
24
25
|
```vhdl
entity display is
port {
clk_fpga : in STD_LOGIC;
reset : in STD_LOGIC;
aff : out STD_LOGIC_VECTOR{7 downto 0};
|
baf5e4b6
rduhr
7Segment_display ...
|
26
|
an : out STD_LOGIC_VECTOR{3 downto 0}
|
122d531c
rduhr
7Segment_display ...
|
27
28
29
|
};
end display;
```
|
baf5e4b6
rduhr
7Segment_display ...
|
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
- clk_fpga : le signal de clock du fpga
Dans le fichier de contrainte :
```
## Clock signal
set_property -dict { PACKAGE_PIN W5 IOSTANDARD LVCMOS33 } [get_ports clk_fpga]
create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports clk]
```
- reset : le signal permettant de remettre le compteur à zéro grâce à un bouton
Dans le fichier de contrainte :
```
## Switches
set_property -dict { PACKAGE_PIN R2 IOSTANDARD LVCMOS33 } [get_ports reset]
```
- aff : un tableau de 8 bits relier à chaque led d'un segment à afficher (en ajoutant le point de l'afficheur)
Dans le fichier de contrainte :
```
##7 Segment Display
set_property -dict { PACKAGE_PIN W7 IOSTANDARD LVCMOS33 } [get_ports {aff[0]}]
set_property -dict { PACKAGE_PIN W6 IOSTANDARD LVCMOS33 } [get_ports {aff[1]}]
set_property -dict { PACKAGE_PIN U8 IOSTANDARD LVCMOS33 } [get_ports {aff[2]}]
set_property -dict { PACKAGE_PIN V8 IOSTANDARD LVCMOS33 } [get_ports {aff[3]}]
set_property -dict { PACKAGE_PIN U5 IOSTANDARD LVCMOS33 } [get_ports {aff[4]}]
set_property -dict { PACKAGE_PIN V5 IOSTANDARD LVCMOS33 } [get_ports {aff[5]}]
set_property -dict { PACKAGE_PIN U7 IOSTANDARD LVCMOS33 } [get_ports {aff[6]}]
set_property -dict { PACKAGE_PIN V7 IOSTANDARD LVCMOS33 } [get_ports {aff[7]}]
```
|
33423a82
rduhr
7Segment_display ...
|
62
|
> exemple : aff à "11111110" allumera la led du point de l'afficheur séléctionné.
|
baf5e4b6
rduhr
7Segment_display ...
|
63
64
65
66
67
68
69
70
71
72
73
|
- an : un tableau comprenant 4 bits permettant de sélectionner l'un des 4 afficheurs 7 segments
Dans le fichier de contrainte :
```
set_property -dict { PACKAGE_PIN U2 IOSTANDARD LVCMOS33 } [get_ports {an[0]}]
set_property -dict { PACKAGE_PIN U4 IOSTANDARD LVCMOS33 } [get_ports {an[1]}]
set_property -dict { PACKAGE_PIN V4 IOSTANDARD LVCMOS33 } [get_ports {an[2]}]
set_property -dict { PACKAGE_PIN W4 IOSTANDARD LVCMOS33 } [get_ports {an[3]}]
```
|
33423a82
rduhr
7Segment_display ...
|
74
75
|
> exemple : an à "1110" sélectionnera l'afficheur le plus à droite.
|
45802ae2
rduhr
7Segment_display ...
|
76
77
|
## Explication de l'algorithme
|
ccc0875f
rduhr
7Segment_display ...
|
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
### Les signaux
les signaux utilisés vont nous permettre d'avoir un code clean et plus ou moins factorié.
```
architecture Behavioral of display is
signal count_int : integer range 3 downto 0 := 0;
signal clk_enable : integer range 4999 downto 0 := 0;
signal clk_counter : integer range 2999999 downto 0 := 0;
constant nb0 : std_logic_vector(7 downto 0) := "11000000";
constant nb1 : std_logic_vector(7 downto 0) := "11111001";
constant nb2 : std_logic_vector(7 downto 0) := "10100100";
constant nb3 : std_logic_vector(7 downto 0) := "10110000";
constant nb4 : std_logic_vector(7 downto 0) := "10011001";
constant nb5 : std_logic_vector(7 downto 0) := "10010010";
constant nb6 : std_logic_vector(7 downto 0) := "10000010";
constant nb7 : std_logic_vector(7 downto 0) := "11111000";
constant nb8 : std_logic_vector(7 downto 0) := "10000000";
constant nb9 : std_logic_vector(7 downto 0) := "10010000";
constant seg0 : std_logic_vector(3 downto 0) := "1110";
constant seg1 : std_logic_vector(3 downto 0) := "1101";
constant seg2 : std_logic_vector(3 downto 0) := "1011";
constant seg3 : std_logic_vector(3 downto 0) := "0111";
signal chiffre4 : integer range 9 downto 0 := 0;
signal chiffre3 : integer range 9 downto 0 := 0;
signal chiffre2 : integer range 9 downto 0 := 0;
signal chiffre1 : integer range 9 downto 0 := 0;
type mynumbers is array(9 downto 0) of std_logic_vector(7 downto 0);
signal numbers : mynumbers := (nb9,nb8,nb7,nb6,nb5,nb4,nb3,nb2,nb1,nb0);
```
|
45802ae2
rduhr
7Segment_display ...
|
111
112
|
## Résultats
|
78d80e83
rduhr
7Segment_display ...
|
113
|
- Nous avons dans un premier temps essayer d'afficher sur les 4 afficheurs sans recouvrement. C'est pour cela qu'il a fallu baisser la clock.
|
45802ae2
rduhr
7Segment_display ...
|
114
|
|
9b8bb3da
rduhr
7Segment_display ...
|
115
116
|
![img1](img1.jpg)
|
78d80e83
rduhr
7Segment_display ...
|
117
|
- Ensuite il a fallu donner du sens à ce que nous affichions. C'est pourquoi nous avons tenté d'afficher 1 2 3 4.
|
9b8bb3da
rduhr
7Segment_display ...
|
118
|
|
3d1a916a
rduhr
7Segment_display ...
|
119
120
121
122
|
![img2](img2.jpg)
- Enfin il a fallu implémanter un simple algorithme pour le compteur.
|
d8ca565d
rduhr
7Segment_display ...
|
123
|
![counter](counter.gif)
|