001.library IEEE;
002.use IEEE.STD_LOGIC_1164.all;
003.
004.package UART_RxController is
005.
006. component RxController is007. 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;