-
Notifications
You must be signed in to change notification settings - Fork 1
/
taptempo.vhd
111 lines (91 loc) · 2.46 KB
/
taptempo.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
73
74
75
76
77
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
111
-- The TapTempo Project
-- Created on : 28/11/2020
-- Author : Fabien Marteau <mail@fabienm.eu>
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.numeric_std.all;
library work;
use work.taptempo_pkg.all;
Entity taptempo is
port(
clk_i : in std_logic;
btn_i : in std_logic;
pwm_o : out std_logic);
end entity taptempo;
architecture taptempo_1 of taptempo is
-- generate reset internally
signal rst : std_logic;
-- TimePulse generation
signal tp : std_logic;
-- Synchronize btn_i to avoid metastability
signal btn_old : std_logic;
signal btn_s : std_logic;
-- debounce
signal btn_d : std_logic;
-- count tap period
signal btn_per : std_logic_vector(BTN_PER_SIZE -1 downto 0);
signal btn_per_valid : std_logic;
-- convert period in bpm
signal bpm : std_logic_vector(BPM_SIZE - 1 downto 0);
signal bpm_valid : std_logic;
begin
-- generate reset internally
rstgen_connect : entity work.rstgen
port map (
clk_i => clk_i,
rst_o => rst);
-- TimePulse generation
timepulse_connect : entity work.timepulse
port map (
clk_i => clk_i,
rst_i => rst,
tp_o => tp);
-- Synchronize btn
btn_sync_p : process(clk_i, rst)
begin
if (rst = '1') then
btn_old <= '0';
btn_s <= '0';
elsif rising_edge(clk_i) then
btn_s <= btn_old;
btn_old <= btn_i;
end if;
end process btn_sync_p;
-- debounce
debounce_connect : entity work.debounce
port map (
clk_i => clk_i,
rst_i => rst,
tp_i => tp,
btn_i => btn_s,
btn_o => btn_d);
-- count tap period
percount_connect : entity work.percount
port map (
clk_i => clk_i,
rst_i => rst,
tp_i => tp,
btn_i => btn_d,
btn_per_o => btn_per,
btn_per_valid => btn_per_valid);
-- convert period in bpm
per2bpm_connect : entity work.per2bpm
port map (
clk_i => clk_i,
rst_i => rst,
btn_per_i => btn_per,
btn_per_valid => btn_per_valid,
bpm_o => bpm,
bpm_valid => bpm_valid);
-- generate pwm
pwmgen_connect : entity work.pwmgen
port map (
clk_i => clk_i,
rst_i => rst,
tp_i => tp,
bpm_i => bpm,
bpm_valid => bpm_valid,
-- pwm_o => open);
pwm_o => pwm_o);
-- pwm_o <= btn_d;
end architecture taptempo_1;