OpenCores
URL https://opencores.org/ocsvn/uart_block/uart_block/trunk

Subversion Repositories uart_block

[/] [uart_block/] [trunk/] [hdl/] [iseProject/] [serial_receiver.vhd] - Blame information for rev 3

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 leonardoar
--! Data receiver
2
--! http://www.fpga4fun.com/SerialInterface.html
3
library IEEE;
4
use IEEE.STD_LOGIC_1164.ALL;
5
 
6
--! Use CPU Definitions package
7
use work.pkgDefinitions.all;
8
 
9
entity serial_receiver is
10
    Port (
11
                          rst : in STD_LOGIC;
12
                          baudClk : in  STD_LOGIC;
13
                          baudOverSampleClk : in  STD_LOGIC;
14
           serial_in : in  STD_LOGIC;
15
           data_ready : out  STD_LOGIC;
16
           data_byte : out  STD_LOGIC_VECTOR ((nBits-1) downto 0));
17
end serial_receiver;
18
 
19
architecture Behavioral of serial_receiver is
20
signal current_s,next_s: rxStates;
21
signal filterRx : rxFilterStates;
22
signal syncDetected : std_logic;
23
 
24
begin
25
        -- First we need to oversample(8x baud rate) out serial channel to syncronize with the PC
26
        process (rst, baudOverSampleClk, serial_in)
27
        begin
28
                if rst = '1' then
29
                        filterRx <= s0;
30
                        syncDetected <= '0';
31
                elsif rising_edge(baudOverSampleClk) then
32
                        case filterRx is
33
                                when s0 =>
34
                                        syncDetected <= '0';
35
                                        -- Spike down detected, verify if it's valid for at least 3 cycles
36
                                        if serial_in = '0' then
37
                                                filterRx <= s1;
38
                                        else
39
                                                filterRx <= s0;
40
                                        end if;
41
 
42
                                when s1 =>
43
                                        syncDetected <= '0';
44
                                        if serial_in = '0' then
45
                                                filterRx <= s2;
46
                                                syncDetected <= '0';
47
                                        else
48
                                                filterRx <= s0;
49
                                        end if;
50
 
51
                                when s2 =>
52
                                        -- Real Beginning of start bit detected 
53
                                        if serial_in = '0' then
54
                                                filterRx <= s2;
55 3 leonardoar
                                                syncDetected <= '1';
56 2 leonardoar
                                        else
57
                                                -- Start bit end detected
58 3 leonardoar
                                                --filterRx <= s2;
59
                                                --syncDetected <= '1';
60 2 leonardoar
                                        end if;
61
                        end case;
62
                end if;
63
        end process;
64
 
65
        -- Next state logic for rx Receiver (On this case our reset is the syncDetected signal
66
        process (syncDetected, baudClk, serial_in)
67
        begin
68
                if syncDetected = '0' then
69
                        current_s <= rx_idle;
70
                elsif rising_edge(baudClk) then
71
                        current_s <= next_s;
72
                end if;
73
        end process;
74
 
75
        -- Process to handle the serial receive
76
        process (current_s)
77
        begin
78
                case current_s is
79
                        when rx_idle =>
80
                                data_ready <= '0';
81
                                --data_byte <= (others => 'Z');
82
                                next_s <=  bit0;
83
 
84
                        when bit0 =>
85
                                data_ready <= '0';
86
                                data_byte(0) <= serial_in;
87
                                next_s <=  bit1;
88
 
89
                        when bit1 =>
90
                                data_ready <= '0';
91
                                data_byte(1) <= serial_in;
92
                                next_s <=  bit2;
93
 
94
                        when bit2 =>
95
                                data_ready <= '0';
96
                                data_byte(2) <= serial_in;
97
                                next_s <=  bit3;
98
 
99
                        when bit3 =>
100
                                data_ready <= '0';
101
                                data_byte(3) <= serial_in;
102
                                next_s <=  bit4;
103
 
104
                        when bit4 =>
105
                                data_ready <= '0';
106
                                data_byte(4) <= serial_in;
107
                                next_s <=  bit5;
108
 
109
                        when bit5 =>
110
                                data_ready <= '0';
111
                                data_byte(5) <= serial_in;
112
                                next_s <=  bit6;
113
 
114
                        when bit6 =>
115
                                data_ready <= '0';
116
                                data_byte(6) <= serial_in;
117
                                next_s <=  bit7;
118
 
119
                        when bit7 =>
120
                                data_ready <= '0';
121
                                data_byte(7) <= serial_in;
122
                                next_s <=  rx_stop;
123
 
124
                        when rx_stop =>
125
                                data_ready <= '1';
126
                                next_s <=  rx_idle;
127
 
128
                end case;
129
        end process;
130
 
131
end Behavioral;
132
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.