001.
library
IEEE
;
002.
use
IEEE.STD_LOGIC_1164.
all
;
003.
004.
package
UART_RxController
is
005.
006.
component
RxController
is
007.
port
(
008.
AClr
:
in
std_logic
;
009.
Ck
:
in
std_logic
;
010.
011.
DRd
:
in
std_logic
;
012.
DAv
:
out
std_logic
;
013.
014.
BRd
:
in
std_logic
;
015.
BAv
:
out
std_logic
;
016.
017.
Start
:
in
std_logic
;
018.
Stop
:
in
std_logic
;
019.
BitBnd
:
in
std_logic
;
020.
KeyDet
:
in
std_logic
;
021.
022.
ShiftData
:
out
std_logic
;
023.
SampClr
:
out
std_logic
;
024.
SampCnt
:
out
std_logic
;
025.
BitClr
:
out
std_logic
;
026.
BitCnt
:
out
std_logic
;
027.
BdHalf
:
out
std_logic
;
028.
BdLd
:
out
std_logic
029.
)
;
030.
end
component
;
031.
032.
end
package
;
033.
034.
library
IEEE
;
035.
use
IEEE.STD_LOGIC_1164.
all
;
036.
037.
entity
RxController
is
038.
port
(
039.
AClr
:
in
std_logic
;
040.
Ck
:
in
std_logic
;
041.
042.
DRd
:
in
std_logic
;
043.
DAv
:
out
std_logic
;
044.
045.
BRd
:
in
std_logic
;
046.
BAv
:
out
std_logic
;
047.
048.
Start
:
in
std_logic
;
049.
Stop
:
in
std_logic
;
050.
BitBnd
:
in
std_logic
;
051.
KeyDet
:
in
std_logic
;
052.
053.
ShiftData
:
out
std_logic
;
054.
SampClr
:
out
std_logic
;
055.
SampCnt
:
out
std_logic
;
056.
BitClr
:
out
std_logic
;
057.
BitCnt
:
out
std_logic
;
058.
BdHalf
:
out
std_logic
;
059.
BdLd
:
out
std_logic
060.
)
;
061.
end
entity
;
062.
063.
architecture
RxController_A1
of
RxController
is
064.
type
StateType
is
(
Ready
,
StartBit
,
Run1
,
RunN
,
StopBit
)
;
065.
066.
signal
State
:
StateType
;
067.
signal
BaudAvailable
:
std_logic
;
068.
signal
DataAvailable
:
std_logic
;
069.
070.
signal
BitStartOverride
:
std_Logic
;
071.
signal
NoBaudStart
:
std_logic
;
072.
signal
BaudStart
:
std_Logic
;
073.
signal
SampCntEn
:
std_logic
;
074.
075.
signal
BitCntEn
:
std_logic
;
076.
signal
ShiftEn
:
std_logic
;
077.
078.
signal
DataCaptured
:
std_logic
;
079.
signal
BaudCaptured
:
std_logic
;
080.
081.
begin
082.
083.
process
(
AClr
,
Ck
)
084.
variable
NextState
:
StateType
;
085.
begin
086.
087.
if
(
AClr
=
'
0
'
)
then
088.
089.
BitStartOverride
<
=
'
0
'
;
090.
NoBaudStart
<
=
'
0
'
;
091.
BaudStart
<
=
'
0
'
;
092.
SampCntEn
<
=
'
0
'
;
093.
BitCntEn
<
=
'
0
'
;
094.
ShiftEn
<
=
'
0
'
;
095.
BdHalf
<
=
'
0
'
;
096.
NextState
:
=
Ready
;
097.
098.
BaudAvailable
<
=
'
0
'
;
099.
DataAvailable
<
=
'
0
'
;
100.
101.
elsif
(
rising_edge
(
CK
)
)
then
102.
103.
case
State
is
104.
105.
when
Ready
=
>
106.
107.
if
(
BaudAvailable
=
'
0
'
)
then
108.
109.
if
(
Start
=
'
0
'
)
then
110.
111.
BitStartOverride
<
=
'
1
'
;
112.
NoBaudStart
<
=
'
1
'
;
113.
BaudStart
<
=
'
0
'
;
114.
SampCntEn
<
=
'
0
'
;
115.
BitCntEn
<
=
'
0
'
;
116.
ShiftEn
<
=
'
0
'
;
117.
BdHalf
<
=
'
0
'
;
118.
NextState
:
=
StartBit
;
119.
120.
DataAvailable
<
=
'
0
'
;
121.
122.
else
123.
124.
BitStartOverride
<
=
'
0
'
;
125.
NoBaudStart
<
=
'
0
'
;
126.
BaudStart
<
=
'
0
'
;
127.
SampCntEn
<
=
'
0
'
;
128.
BitCntEn
<
=
'
0
'
;
129.
ShiftEn
<
=
'
0
'
;
130.
BdHalf
<
=
'
0
'
;
131.
NextState
:
=
Ready
;
132.
133.
end
if
;
134.
135.
else
136.
137.
if
(
Start
=
'
0
'
)
then
138.
139.
BitStartOverride
<
=
'
0
'
;
140.
NoBaudStart
<
=
'
0
'
;
141.
BaudStart
<
=
'
1
'
;
142.
SampCntEn
<
=
'
0
'
;
143.
BitCntEn
<
=
'
1
'
;
144.
ShiftEn
<
=
'
0
'
;
145.
BdHalf
<
=
'
0
'
;
146.
NextState
:
=
StartBit
;
147.
148.
DataAvailable
<
=
'
0
'
;
149.
150.
else
151.
152.
BitStartOverride
<
=
'
0
'
;
153.
NoBaudStart
<
=
'
0
'
;
154.
BaudStart
<
=
'
0
'
;
155.
SampCntEn
<
=
'
0
'
;
156.
BitCntEn
<
=
'
0
'
;
157.
ShiftEn
<
=
'
0
'
;
158.
BdHalf
<
=
'
0
'
;
159.
NextState
:
=
Ready
;
160.
161.
end
if
;
162.
163.
164.
end
if
;
165.
166.
when
StartBit
=
>
167.
168.
if
(
BaudAvailable
=
'
0
'
)
then
169.
170.
if
(
Start
=
'
1
'
)
then
171.
172.
BitStartOverride
<
=
'
0
'
;
173.
NoBaudStart
<
=
'
0
'
;
174.
BaudStart
<
=
'
0
'
;
175.
SampCntEn
<
=
'
1
'
;
176.
BitCntEn
<
=
'
1
'
;
177.
ShiftEn
<
=
'
1
'
;
178.
BdHalf
<
=
'
1
'
;
179.
NextState
:
=
Run1
;
180.
181.
else
182.
183.
BitStartOverride
<
=
'
1
'
;
184.
NoBaudStart
<
=
'
1
'
;
185.
BaudStart
<
=
'
0
'
;
186.
SampCntEn
<
=
'
0
'
;
187.
BitCntEn
<
=
'
0
'
;
188.
ShiftEn
<
=
'
0
'
;
189.
BdHalf
<
=
'
0
'
;
190.
NextState
:
=
StartBit
;
191.
192.
end
if
;
193.
194.
else
195.
196.
if
(
BitBnd
=
'
1
'
)
then
197.
198.
BitStartOverride
<
=
'
0
'
;
199.
NoBaudStart
<
=
'
0
'
;
200.
BaudStart
<
=
'
0
'
;
201.
SampCntEn
<
=
'
1
'
;
202.
BitCntEn
<
=
'
1
'
;
203.
ShiftEn
<
=
'
1
'
;
204.
BdHalf
<
=
'
1
'
;
205.
NextState
:
=
Run1
;
206.
207.
else
208.
209.
BitStartOverride
<
=
'
0
'
;
210.
NoBaudStart
<
=
'
0
'
;
211.
BaudStart
<
=
'
1
'
;
212.
SampCntEn
<
=
'
0
'
;
213.
BitCntEn
<
=
'
1
'
;
214.
ShiftEn
<
=
'
0
'
;
215.
BdHalf
<
=
'
0
'
;
216.
NextState
:
=
StartBit
;
217.
218.
end
if
;
219.
220.
end
if
;
221.
222.
when
Run1
=
>
223.
224.
if
(
BitBnd
=
'
1
'
)
then
225.
226.
if
(
Stop
=
'
1
'
)
then
227.
228.
BitStartOverride
<
=
'
0
'
;
229.
NoBaudStart
<
=
'
0
'
;
230.
BaudStart
<
=
'
0
'
;
231.
SampCntEn
<
=
'
1
'
;
232.
BitCntEn
<
=
'
0
'
;
233.
ShiftEn
<
=
'
0
'
;
234.
BdHalf
<
=
'
0
'
;
235.
NextState
:
=
StopBit
;
236.
237.
else
238.
239.
BitStartOverride
<
=
'
0
'
;
240.
NoBaudStart
<
=
'
0
'
;
241.
BaudStart
<
=
'
0
'
;
242.
SampCntEn
<
=
'
1
'
;
243.
BitCntEn
<
=
'
1
'
;
244.
ShiftEn
<
=
'
1
'
;
245.
BdHalf
<
=
'
0
'
;
246.
NextState
:
=
RunN
;
247.
248.
end
if
;
249.
250.
else
251.
252.
BitStartOverride
<
=
'
0
'
;
253.
NoBaudStart
<
=
'
0
'
;
254.
BaudStart
<
=
'
0
'
;
255.
SampCntEn
<
=
'
1
'
;
256.
BitCntEn
<
=
'
1
'
;
257.
ShiftEn
<
=
'
1
'
;
258.
BdHalf
<
=
'
1
'
;
259.
NextState
:
=
Run1
;
260.
261.
end
if
;
262.
263.
when
RunN
=
>
264.
265.
if
(
BitBnd
=
'
1
'
)
then
266.
267.
if
(
Stop
=
'
1
'
)
then
268.
269.
BitStartOverride
<
=
'
0
'
;
270.
NoBaudStart
<
=
'
0
'
;
271.
BaudStart
<
=
'
0
'
;
272.
SampCntEn
<
=
'
1
'
;
273.
BitCntEn
<
=
'
0
'
;
274.
ShiftEn
<
=
'
0
'
;
275.
BdHalf
<
=
'
0
'
;
276.
NextState
:
=
StopBit
;
277.
278.
else
279.
280.
BitStartOverride
<
=
'
0
'
;
281.
NoBaudStart
<
=
'
0
'
;
282.
BaudStart
<
=
'
0
'
;
283.
SampCntEn
<
=
'
1
'
;
284.
BitCntEn
<
=
'
1
'
;
285.
ShiftEn
<
=
'
1
'
;
286.
BdHalf
<
=
'
0
'
;
287.
NextState
:
=
RunN
;
288.
289.
end
if
;
290.
291.
else
292.
293.
BitStartOverride
<
=
'
0
'
;
294.
NoBaudStart
<
=
'
0
'
;
295.
BaudStart
<
=
'
0
'
;
296.
SampCntEn
<
=
'
1
'
;
297.
BitCntEn
<
=
'
1
'
;
298.
ShiftEn
<
=
'
1
'
;
299.
BdHalf
<
=
'
0
'
;
300.
NextState
:
=
RunN
;
301.
302.
end
if
;
303.
304.
when
StopBit
=
>
305.
306.
if
(
BaudAvailable
=
'
0
'
)
then
307.
308.
if
(
BitBnd
=
'
1
'
)
then
309.
310.
if
(
KeyDet
=
'
1
'
)
then
311.
312.
BitStartOverride
<
=
'
0
'
;
313.
NoBaudStart
<
=
'
0
'
;
314.
BaudStart
<
=
'
1
'
;
315.
SampCntEn
<
=
'
0
'
;
316.
BitCntEn
<
=
'
0
'
;
317.
ShiftEn
<
=
'
0
'
;
318.
BdHalf
<
=
'
0
'
;
319.
NextState
:
=
Ready
;
320.
321.
BaudAvailable
<
=
'
1
'
;
322.
DataAvailable
<
=
'
1
'
;
323.
324.
else
325.
326.
BitStartOverride
<
=
'
0
'
;
327.
NoBaudStart
<
=
'
1
'
;
328.
BaudStart
<
=
'
0
'
;
329.
SampCntEn
<
=
'
0
'
;
330.
BitCntEn
<
=
'
0
'
;
331.
ShiftEn
<
=
'
0
'
;
332.
BdHalf
<
=
'
0
'
;
333.
NextState
:
=
Ready
;
334.
335.
end
if
;
336.
337.
else
338.
339.
BitStartOverride
<
=
'
0
'
;
340.
NoBaudStart
<
=
'
0
'
;
341.
BaudStart
<
=
'
0
'
;
342.
SampCntEn
<
=
'
1
'
;
343.
BitCntEn
<
=
'
0
'
;
344.
ShiftEn
<
=
'
0
'
;
345.
BdHalf
<
=
'
0
'
;
346.
NextState
:
=
StopBit
;
347.
348.
end
if
;
349.
350.
else
351.
352.
if
(
BitBnd
=
'
1
'
)
then
353.
354.
BitStartOverride
<
=
'
0
'
;
355.
NoBaudStart
<
=
'
0
'
;
356.
BaudStart
<
=
'
1
'
;
357.
SampCntEn
<
=
'
0
'
;
358.
BitCntEn
<
=
'
0
'
;
359.
ShiftEn
<
=
'
0
'
;
360.
BdHalf
<
=
'
0
'
;
361.
NextState
:
=
Ready
;
362.
363.
DataAvailable
<
=
'
1
'
;
364.
365.
else
366.
367.
BitStartOverride
<
=
'
0
'
;
368.
NoBaudStart
<
=
'
0
'
;
369.
BaudStart
<
=
'
0
'
;
370.
SampCntEn
<
=
'
1
'
;
371.
BitCntEn
<
=
'
0
'
;
372.
ShiftEn
<
=
'
0
'
;
373.
BdHalf
<
=
'
0
'
;
374.
NextState
:
=
StopBit
;
375.
376.
end
if
;
377.
378.
end
if
;
379.
380.
end
case
;
381.
382.
end
if
;
383.
384.
State
<
=
NextState
;
385.
386.
end
process
;
387.
388.
SampCnt
<
=
(
not
(
Start
)
and
(
NoBaudStart
or
BaudStart
)
)
or
SampCntEn
;
389.
SampClr
<
=
(
Start
and
NoBaudStart
)
or
(
BitBnd
and
not
(
NoBaudStart
)
)
;
390.
BdLd
<
=
Start
and
NoBaudStart
;
391.
392.
BitClr
<
=
BitBnd
and
Stop
;
393.
BitCnt
<
=
(
BitBnd
and
BitCntEn
)
or
(
start
and
BitStartOverride
)
;
394.
ShiftData
<
=
BitBnd
and
ShiftEn
;
395.
396.
397.
process
(
AClr
,
Ck
)
398.
begin
399.
400.
if
(
AClr
=
'
0
'
)
then
401.
402.
DataCaptured
<
=
'
0
'
;
403.
BaudCaptured
<
=
'
0
'
;
404.
405.
elsif
(
rising_edge
(
Ck
)
)
then
406.
407.
if
(
DataAvailable
=
'
0
'
)
then
408.
409.
DataCaptured
<
=
'
0
'
;
410.
411.
elsif
(
DRd
=
'
1
'
)
then
412.
413.
DataCaptured
<
=
'
1
'
;
414.
415.
end
if
;
416.
417.
if
(
BaudAvailable
=
'
0
'
)
then
418.
419.
BaudCaptured
<
=
'
0
'
;
420.
421.
elsif
(
BRd
=
'
1
'
)
then
422.
423.
BaudCaptured
<
=
'
1
'
;
424.
425.
end
if
;
426.
427.
end
if
;
428.
429.
end
process
;
430.
431.
DAv
<
=
(
DataAvailable
and
not
(
DataCaptured
)
)
;
432.
BAv
<
=
(
BaudAvailable
and
not
(
BaudCaptured
)
)
;
433.
434.
end
architecture
;