-
Notifications
You must be signed in to change notification settings - Fork 0
/
downcounter.vhd
72 lines (56 loc) · 1.66 KB
/
downcounter.vhd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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
62
63
64
65
66
67
68
69
70
71
72
-------------------------------------------
-- Delivery #14
-- Fabrício da Costa Guimarães - 21950515
-- Engenharia da Computação - FT UFAM
-- ED2 e LED - 2021/01 - Equipe 06
-------------------------------------------
-- Bibliotecas e pacotes
use work.dsf_std.all;
-- Entidade
entity downcounter is
port(
-- Controles assíncronos
enable: in bit;
areset: in bit;
-- Controles síncronos
count_en: in bit;
clk: in bit;
-- Resultado da contagem: 4 bits
q: buffer integer range (2**4 - 1) downto 0 := 9
);
end entity downcounter;
-- Arquitetura
architecture downcounter_a of downcounter is
constant len_module: integer := 10;
constant max_count: integer := q'high;
constant max_module: integer := len_module-1;
-- Função de reset da contagem quando enable='1'
function reset_q (enable: bit; q: integer) return integer is
variable cnt: integer range max_module downto 0 := max_module;
begin
-- Modo limpa e colocar o valor máximo.
if (enable = '1') then
cnt := max_module;
-- Modo memória.
else
cnt := q;
end if;
return cnt;
end reset_q;
-- Função para ativação do decremento da contagem
function decre_q (enable, count_en: bit; q: integer) return integer is
variable cnt: integer range max_count downto 0;
begin
-- Modo contagem decrescente
if (enable = '1') and (count_en = '1') then
cnt := decrement(q, max_module);
-- Modo memória
else
cnt := q;
end if;
return cnt;
end decre_q;
begin
q <= reset_q(enable, q) when areset='1' else
decre_q(enable, count_en, q) when low2high(clk);
end architecture downcounter_a;