-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathultrasonic.vhd
145 lines (119 loc) · 3.96 KB
/
ultrasonic.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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use work.my_components_ultrasonic.all;
entity ultrasonic is
generic (width: natural := 16;
MAX_WIDTH_PULSE: natural :=38000);
port(signal reset_n : in std_logic;
signal clk : in std_logic;
signal echo: in std_logic;
signal trigger : out std_logic;
signal distance: out std_logic_vector(width -1 downto 0);
signal units_h: out std_logic_vector(6 downto 0);
signal tens_h: out std_logic_vector(6 downto 0);
signal hundreds_h: out std_logic_vector(6 downto 0));
end ultrasonic;
architecture structural of ultrasonic is
signal rst_sync_trigger : std_logic:='0';
signal rst_sync_up : std_logic:='1';
signal count_trigger : std_logic_vector(width -1 downto 0);
signal count_up : std_logic_vector(width -1 downto 0);
signal distance_std_logic : std_logic_vector(width -1 downto 0);
signal distance_display_cut : std_logic_vector(9 downto 0);
signal count_trigger_u : unsigned(width -1 downto 0);
signal count_up_u : unsigned(width -1 downto 0);
signal distance_count : unsigned(width -1 downto 0):= (others => '0');
signal distance_hold : unsigned(width -1 downto 0):= (others => '0');
signal distance_hold2 : unsigned(width -1 downto 0):= (others => '0');
signal enable: std_logic;
signal hexa_distance : std_logic_vector(11 downto 0);
signal enable_bcd: std_logic;
begin
B1: divisor_freq
generic map( N => 5,
BUS_WIDTH => 26)
port map (reset_n => reset_n,
clk => clk,
clk_o => enable);
B2: counter
generic map( width => 16)
port map (reset_n => reset_n,
rst_sync => rst_sync_trigger,
clk => clk,
en => enable,
q => count_trigger);
B3: counter
generic map( width => 16)
port map (reset_n => reset_n,
rst_sync => rst_sync_up,
clk => clk,
en => enable,
q => count_up);
B4: bintobcd
port map (a => distance_display_cut,
f => hexa_distance);
B5: hexa
port map (a => hexa_distance(11 downto 8),
f => hundreds_h);
B6: hexa
port map (a => hexa_distance(7 downto 4),
f => tens_h);
B7: hexa
port map (a => hexa_distance(3 downto 0),
f => units_h);
B8: divisor_freq
generic map( N => 50,
BUS_WIDTH => 26)
port map (reset_n => reset_n,
clk => clk,
clk_o => enable_bcd);
process(count_trigger_u)
begin
if (count_trigger_u > 9 and count_trigger_u <= 21) then
trigger <= '1';
else
trigger <= '0';
end if;
if count_trigger_u > MAX_WIDTH_PULSE then
rst_sync_trigger <= '1';
else
rst_sync_trigger <= '0';
end if;
end process;
process(echo, count_trigger_u, count_up_u, distance_hold)
begin
if (echo = '1') then --(echo = '1')
rst_sync_up <= '0';
distance_count <= distance_hold; --count_up_u
else
rst_sync_up <= '1';
if count_trigger_u > 21 then
distance_count <= count_up_u;--distance_hold
else
distance_count <= distance_hold;
end if;
end if;
end process;
process(reset_n, clk)
begin
if (reset_n = '0') then
distance_hold <=(others => '0');
elsif rising_edge(Clk) then
if (enable_bcd= '1') then
if (distance_count > 0) then
distance_hold <= distance_count;
else
distance_hold <= distance_hold2;
end if;
end if;
end if;
end process;
--distance_hold <= distance_count;
distance_hold2 <= distance_hold;
distance_std_logic <= std_logic_vector(distance_hold/580); --58
distance <= distance_std_logic;
distance_display_cut <= distance_std_logic(9 downto 0);
count_trigger_u <= unsigned(count_trigger);
count_up_u <= unsigned(count_up);
end structural;