-
Notifications
You must be signed in to change notification settings - Fork 0
/
sampler_generator.vhd
121 lines (111 loc) · 3.3 KB
/
sampler_generator.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
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity sampler_generator is
port (
clock : in std_logic;
uart_rx : in std_logic;
baudrate_out : out std_logic);
end entity sampler_generator;
architecture rtl of sampler_generator is
type state_t is (idle_s, start_s, bit0_s, bit1_s, bit2_s, bit3_s, bit4_s, bit5_s, bit6_s, bit7_s, bit8_s, stop_s);
signal state : state_t := idle_s;
signal counter : unsigned(10 downto 0) := (others => '0');
signal delay_counter : unsigned(10 downto 0) := (others => '0');
constant divisor : unsigned(10 downto 0) := to_unsigned(867, 11);
constant half_divisor : unsigned(10 downto 0) := to_unsigned(433, 11);
signal busy : std_logic := '0';
signal pulse_out : std_logic;
signal enable_counter : std_logic := '0';
signal enable_delay : std_logic := '0';
begin
--
pulse_generator : process (clock) is
begin -- process main
if rising_edge(clock) then -- rising clock edge
if enable_counter = '1' then
counter <= counter + 1;
if counter = divisor then
pulse_out <= '1';
counter <= (others => '0');
else
pulse_out <= '0';
end if;
else
counter <= (others => '0');
end if;
end if;
end process pulse_generator;
state_machine : process (clock) is
begin -- process state_machine
if rising_edge(clock) then -- rising clock edge
case state is
when idle_s =>
enable_counter <= '0';
if uart_rx = '0' then
state <= start_s;
end if;
when start_s =>
-- enable baudrate_generator
enable_counter <= '1';
if pulse_out = '1' then
state <= bit0_s;
end if;
when bit0_s =>
if pulse_out = '1' then
state <= bit1_s;
end if;
when bit1_s =>
if pulse_out = '1' then
state <= bit2_s;
end if;
when bit2_s =>
if pulse_out = '1' then
state <= bit3_s;
end if;
when bit3_s =>
if pulse_out = '1' then
state <= bit4_s;
end if;
when bit4_s =>
if pulse_out = '1' then
state <= bit5_s;
end if;
when bit5_s =>
if pulse_out = '1' then
state <= bit6_s;
end if;
when bit6_s =>
if pulse_out = '1' then
state <= bit7_s;
end if;
when bit7_s =>
if pulse_out = '1' then
state <= idle_s;
end if;
when others => null;
end case;
end if;
end process state_machine;
delay_line : process (clock) is
begin -- process delay_line
if rising_edge(clock) then -- rising clock edge
if pulse_out = '1' then
--start_count
enable_delay <= '1';
end if;
if delay_counter = half_divisor then
enable_delay <= '0';
baudrate_out <= '1';
--end count
else
baudrate_out <= '0';
end if;
if enable_delay = '1' then
delay_counter <= delay_counter + 1;
else
delay_counter <= (others => '0');
end if;
end if;
end process delay_line;
end architecture rtl;