reception.Vhd
3.89 KB
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
----------------------------------------------------------------------------
-- horloge fonctionnement clock_fpga=50MHz
----------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity reception_RS232 is
port(
clock_fpga : in std_logic;
RX : in std_logic;
data_ok : out std_logic;
data_recu : out std_logic_vector(7 downto 0));
end entity reception_RS232;
architecture Behavioral of reception_RS232 is
------------------------------------------------------------------------
-- SIGNALS
------------------------------------------------------------------------
signal horloge_prelevement : std_logic :='0';
signal mot_complet : std_logic_vector(9 downto 0) :="0000000000";
signal compteur: std_logic_vector(3 downto 0):="0000";
signal compteur_baud: integer:=0;
signal prelevement_enable : std_logic :='0';
begin
----------------------------------------------------------------------------
--reorganisation de la data recu; bit poid faible en premier------------
data_presente: process(prelevement_enable)
begin
if (prelevement_enable ='0') then
data_recu(7) <= mot_complet(1);
data_recu(6) <= mot_complet(2);
data_recu(5) <= mot_complet(3);
data_recu(4) <= mot_complet(4);
data_recu(3) <= mot_complet(5);
data_recu(2) <= mot_complet(6);
data_recu(1) <= mot_complet(7);
data_recu(0) <= mot_complet(8);
end if;
end process data_presente;
-----------------------------------------------------------------------------
--reception des bits dans un registre à decalage----------------
---------------------------------------------------
mot_entier_recu: process(horloge_prelevement,compteur)
begin
if horloge_prelevement'event and horloge_prelevement='1' then
compteur <= compteur + 1;
mot_complet <= mot_complet(8 downto 0) & RX;
data_ok <= '0';
end if;
if compteur ="1010" then
compteur<="0000";
data_ok <= '1';
end if;
end process mot_entier_recu;
-----------------------------------------------------------------------------
------------------------------------------------------------------------
--horloge permettant de prelever au bon moment la data présente sur RX--
------------------------------------------------------------------------
generation_horloge_prelevement: process(clock_fpga)
begin
if clock_fpga'event and clock_fpga='1' then
if prelevement_enable = '1' then
compteur_baud<=compteur_baud+1;
if (compteur_baud =2604 and compteur ="0000") then --Frequence/(baud/2)
horloge_prelevement<='1';
compteur_baud<=0;
else
if (compteur_baud =5208 and compteur /="0000") then --Frequence/(baud)
horloge_prelevement<='1';
compteur_baud<=0;
else
horloge_prelevement<='0';
end if;
end if;
end if;
end if;
end process generation_horloge_prelevement;
-----------------------------------------------------------------------------
-----------------------------------------------
--mise à 1 lorsque detection bit start--
--repasse à 0 à la fin de la reception du mot--
-----------------------------------------------
generation_prelevement_enable: process(RX,compteur)
begin
if (RX'event and RX='0') then
if compteur="0000" then
prelevement_enable<='1';
end if;
end if;
if (compteur="1010") then
prelevement_enable<='0';
end if;
end process generation_prelevement_enable;
-----------------------------------------------------------------------------
end behavioral;