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

Subversion Repositories manchesterencoderdecoder

[/] [manchesterencoderdecoder/] [web_uploads/] [ME2.vhd] - Blame information for rev 6

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 6 root
 
2
library ieee ;
3
use ieee.std_logic_1164.all ;
4
use ieee.std_logic_arith.all ;
5
 
6
entity me is
7
port (
8
       rst : in std_logic;  -- Power On Reset Active High
9
       rts : in std_logic;  -- Request To Send Active Low
10
       txd : in std_logic; -- Data To Be Transmitted
11
       clkin : in std_logic ; -- Clk Input
12
       cts : out std_logic ;  -- Clear to Sen Output Active Low
13
       txcout : out std_logic;  -- TX CLK = just clkin /16
14
       txlen : out std_logic;  -- TX Enable Active High
15
       mdo   : out std_logic -- Manchester Encoded Data Output (TX "01" for 1 and "10" for 0)
16
) ;
17
end me ;
18
 
19
-------------------------------------------------------------------------------
20
architecture rtl of me is
21
-------------------------------------------------------------------------------
22
 
23
-------------------------------------------------------------------------------
24
begin -- architecture rtl
25
-------------------------------------------------------------------------------
26
 
27
-------------------------------------------------------------------------------
28
 main : process (rst, clkin)
29
-------------------------------------------------------------------------------
30
   type state_t is (
31
     idle,
32
     preamble,
33
     postpreamble,
34
     sending,
35
     eom
36
   );
37
   variable state : state_t;
38
   variable PrCounter : integer range 0 to 31;
39
   variable TxCounter : integer range 0 to 15;
40
   -- variables to hold the internal value of the output ports:
41
   variable TXCOUT_i : std_logic;
42
   variable CTS_i    : std_logic;
43
   variable MDO_i    : std_logic;
44
   variable MDO_i1    : std_logic;
45
   variable TXLEN_i  : std_logic;
46
-------------------------------------------------------------------------------
47
 begin
48
-------------------------------------------------------------------------------
49
   if rst='1' then
50
-------------------------------------------------------------------------------
51
     --asynchronously reset all internal variables
52
     state     := idle;
53
     PrCounter :=  30 ; -- adjunt to length of your preamble
54
     TxCounter :=  0 ;
55
     TXCOUT_i  := '0';
56
     CTS_i     := '1';
57
     MDO_i     := '0';
58
     MDO_i1     := '0';
59
     TXLEN_i   := '0';
60
-------------------------------------------------------------------------------
61
   elsif clkin'event and clkin='1' then
62
-------------------------------------------------------------------------------
63
     --counter for clkin/16
64
     --must txcout have a 50% duty cycle?
65
     TxCounter := (TxCounter + 1) mod 16;
66
     if TxCounter = 0 then
67
       TXCOUT_i := '0';
68
     end if;
69
     if TxCounter = 8 then
70
       TXCOUT_i := '1';
71
     end if;
72
-------------------------------------------------------------------------------
73
     case state is
74
-------------------------------------------------------------------------------
75
       when idle =>
76
         if rts = '0' then
77
           state := preamble;
78
           PrCounter :=  30 ;
79
           MDO_i := '0';
80
         end if;
81
-------------------------------------------------------------------------------
82
       when preamble =>
83
 
84
         if TxCounter = 8 then  --when to mark?  2? 3? ..7? 8?
85
           TXLEN_i := '1';      --when will it be turned off ?  never?
86
         end if;
87
         if TxCounter = 8 then  --when to toggle? 2? 3? .. 6?
88
 
89
           MDO_i := not(MDO_i); --preamble 15 times '10'
90
 
91
           PrCounter := PrCounter - 1;
92
           if PrCounter = 0 then
93
              state := postpreamble;
94
              PrCounter := 2; -- adjunt to length of your post-preamble.
95
           end if;
96
 
97
         end if;
98
 
99
-------------------------------------------------------------------------------
100
       when postpreamble =>
101
         if TxCounter = 8 then  --when to toggle? 2? 3? .. 6?
102
           MDO_i := '1';        -- post preamble: '11'
103
           PrCounter := PrCounter - 1;
104
           if PrCounter = 0 then
105
              --MDO_i := txd;
106
              state := sending;
107
              CTS_i := '0';      --when will it be turned off ?  never? 
108
           end if;
109
         end if;
110
 
111
-------------------------------------------------------------------------------
112
       when sending =>
113
         if TxCounter = 8 then
114
           --this samples the date with clkin, not with txcout..
115
           --what is actually needed ?
116
           MDO_i := txd;
117
           if (rts = '1') then
118
                state := eom;
119
                PrCounter := 2;
120
                CTS_i := '1';
121
                MDO_i := '1';
122
                end if;
123
 
124
 
125
         end if;
126
 
127
        when eom =>
128
 
129
        if TxCounter = 8 then
130
                MDO_i := '1';
131
                PrCounter := PrCounter - 1;
132
                if PrCounter = 0 then
133
 
134
                        state := idle;
135
                end if;
136
 
137
 
138
        end if;
139
 
140
 
141
       --manchester encoding not yet implemented, too many open questions..
142
       --to many unspecified specifications ;)!
143
 
144
       --how to return to idle?
145
 
146
-------------------------------------------------------------------------------
147
       when others =>
148
 
149
       state := idle;
150
-------------------------------------------------------------------------------
151
 
152
-------------------------------------------------------------------------------
153
     end case;
154
 
155
     if state /= idle then
156
 
157
       if state = eom then
158
         MDO_i1 := MDO_i;
159
 
160
       elsif TxCounter = 8 then
161
 
162
          TXLEN_i := '1';
163
          MDO_i1 := not MDO_i;
164
       elsif TxCounter = 0 then
165
 
166
          MDO_i1 := MDO_i;
167
       end if;
168
      elsif TXCounter = 8 then
169
        TXLEN_i := '0';
170
     end if;
171
-------------------------------------------------------------------------------
172
 
173
-------------------------------------------------------------------------------
174
   end if;
175
-------------------------------------------------------------------------------
176
   --assign output ports:
177
   txcout <= TXCOUT_i;
178
   cts    <= CTS_i;
179
   mdo    <= MDO_i1;
180
   txlen  <= TXLEN_i;
181
-------------------------------------------------------------------------------
182
 end process main;
183
-------------------------------------------------------------------------------
184
 
185
-------------------------------------------------------------------------------
186
end ; -- architecture rtl
187
------------------------------------------
188
-- ME2.vhd

powered by: WebSVN 2.1.0

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