001.library IEEE;
002.use IEEE.STD_LOGIC_1164.all;
003.
004.package UART_TxController is
005.
006. component TxController is007. port(
008. AClr : in std_logic;
009. Ck : in std_logic;
010.
011. DWr : in std_logic;
012. DEn : out std_logic;
013.
014. BWr : in std_logic;
015. BEn : out std_logic;
016.
017. Stop : in std_logic;
018. BitBnd : in std_logic;
019.
020. SampClr : out std_logic;
021. SampCnt : out std_logic;
022.
023. BitClr : out std_logic;
024. BitCnt : out std_logic;
025.
026. ShiftData : out std_logic;
027. Output_Ctl : out std_logic_vector(1 downto 0);
028.
029. Busy : out std_logic
030. );
031. end component;
032.
033.end package;
034.
035.library IEEE;
036.use IEEE.STD_LOGIC_1164.all;
037.
038.entity TxController is
039.port(
040. AClr : in std_logic;
041. Ck : in std_logic;
042.
043. DWr : in std_logic;
044. DEn : out std_logic;
045.
046. BWr : in std_logic;
047. BEn : out std_logic;
048.
049. Stop : in std_logic;
050. BitBnd : in std_logic;
051.
052. SampClr : out std_logic;
053. SampCnt : out std_logic;
054.
055. BitClr : out std_logic;
056. BitCnt : out std_logic;
057.
058. ShiftData : out std_logic;
059. Output_Ctl : out std_logic_vector(1 downto 0);
060.
061. Busy : out std_logic
062. );
063.end entity;
064.
065.architecture TxController_A1 of TxController is
066.type StateType is (Reset,Ready,StartBit,Running,StopBit);
067.constant OutData : std_logic_vector(1 downto 0) := "00";
068.constant OutIdle : std_logic_vector(1 downto 0) := "01";
069.constant OutStop : std_logic_vector(1 downto 0) := "10";
070.constant OutStart : std_logic_vector(1 downto 0) := "11";
071.
072.signal State : StateType;
073.signal SampCntEn : std_logic;
074.signal BitCntEn : std_logic;
075.signal ShiftEn : std_logic;
076.
077.begin
078.
079. process(AClr,Ck)
080. variable NextState : StateType;
081. begin
082.
083. if(AClr = '0')then
084.
085. DEn <= '0';
086. BEn <= '1';
087. SampCntEn <= '0';
088. BitCntEn <= '0';
089. ShiftEn <= '0';
090. Output_Ctl <= OutIdle;
091. Busy <= '0';
092. NextState := Reset;
093.
094. elsif(rising_edge(Ck))then
095.
096. case State is
097.
098. when Reset =>
099.
100. if(BWr = '1')then
101.
102. DEn <= '1';
103. BEn <= '0';
104. SampCntEn <= '0';
105. BitCntEn <= '0';
106. ShiftEn <= '0';
107. Output_Ctl <= OutIdle;
108. Busy <= '0';
109. NextState := Ready;
110.
111. else
112.
113. DEn <= '0';
114. BEn <= '1';
115. SampCntEn <= '0';
116. BitCntEn <= '0';
117. ShiftEn <= '0';
118. Output_Ctl <= OutIdle;
119. Busy <= '0';
120. NextState := Reset;
121.
122. end if;
123.
124. when Ready =>
125.
126. if(DWr = '1')then
127.
128. DEn <= '0';
129. BEn <= '0';
130. SampCntEn <= '1';
131. BitCntEn <= '1';
132. ShiftEn <= '0';
133. Output_Ctl <= OutStart;
134. Busy <= '1';
135. NextState := StartBit;
136.
137. else
138.
139. DEn <= '1';
140. BEn <= '0';
141. SampCntEn <= '0';
142. BitCntEn <= '0';
143. ShiftEn <= '0';
144. Output_Ctl <= OutIdle;
145. Busy <= '0';
146. NextState := Ready;
147.
148. end if;
149.
150. when StartBit =>
151.
152. if(BitBnd = '1')then
153.
154. DEn <= '0';
155. BEn <= '0';
156. SampCntEn <= '1';
157. BitCntEn <= '1';
158. ShiftEn <= '1';
159. Output_Ctl <= OutData;
160. Busy <= '1';
161. NextState := Running;
162.
163. else
164.
165. DEn <= '0';
166. BEn <= '0';
167. SampCntEn <= '1';
168. BitCntEn <= '1';
169. ShiftEn <= '0';
170. Output_Ctl <= OutStart;
171. Busy <= '1';
172. NextState := StartBit;
173.
174. end if;
175.
176. when Running =>
177.
178. if(BitBnd = '1')then
179.
180. if(Stop = '1')then
181.
182. DEn <= '0';
183. BEn <= '0';
184. SampCntEn <= '1';
185. BitCntEn <= '0';
186. ShiftEn <= '0';
187. Output_Ctl <= OutStop;
188. Busy <= '1';
189. NextState := StopBit;
190.
191. else
192.
193. DEn <= '0';
194. BEn <= '0';
195. SampCntEn <= '1';
196. BitCntEn <= '1';
197. ShiftEn <= '1';
198. Output_Ctl <= OutData;
199. Busy <= '1';
200. NextState := Running;
201.
202. end if;
203.
204. else
205.
206. DEn <= '0';
207. BEn <= '0';
208. SampCntEn <= '1';
209. BitCntEn <= '1';
210. ShiftEn <= '1';
211. Output_Ctl <= OutData;
212. Busy <= '1';
213. NextState := Running;
214.
215. end if;
216.
217. when StopBit =>
218.
219. if(BitBnd = '1')then
220.
221. DEn <= '1';
222. BEn <= '0';
223. SampCntEn <= '0';
224. BitCntEn <= '0';
225. ShiftEn <= '0';
226. Output_Ctl <= OutIdle;
227. Busy <= '0';
228. NextState := Ready;
229.
230. else
231.
232. DEn <= '0';
233. BEn <= '0';
234. SampCntEn <= '1';
235. BitCntEn <= '0';
236. ShiftEn <= '0';
237. Output_Ctl <= OutStop;
238. Busy <= '1';
239. NextState := StopBit;
240.
241. end if;
242.
243. end case;
244.
245. end if;
246.
247. State <= NextState;
248.
249. end process;
250.
251. SampClr <= BitBnd;
252. SampCnt <= SampCntEn;
253. BitClr <= BitBnd and Stop;
254. BitCnt <= BitBnd and BitCntEn;
255. ShiftData <= BitBnd and ShiftEn;
256.
257.end architecture;