Solid Fluid System Solutions  
Home Software About Hardware Firmware
Document Icon Test Harness Schematic
Document Icon Transmitter Schematic
Document Icon Receiver Schematic
Document Icon UART Timing Diagram
Document Icon UART VHDL
Document Icon Test Harness VHDL
Document Icon Tx Controller VHDL
Current Document Icon Rx Controller VHDL
Document Icon Components VHDL
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; -- Used to start with no valid baud divisor
072.signal BaudStart: std_Logic;    -- Used to start with previous baud divisor
073.signal SampCntEn : std_logic;   -- Enables the sample counter once running
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.    -- A couple of ff's to clear the available outputs once data is captured
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;
Copyright © Solid Fluid 2007-2022
Last modified: SolFlu  Mon, 19 Oct 2009 17:58:09 GMT