Advertisement
madegoff

Transmitter

Jun 3rd, 2024
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 23.50 KB | None | 0 0
  1. library ieee;
  2. use ieee.std_logic_1164.all;
  3.  
  4. library work;
  5. use work.ArmTypes.all;
  6. use work.ArmConfiguration.all;
  7.  
  8. --------------------------------------------------------------------------------
  9. -- Funktionsweise der Schnittstellenkomponente zum Datenbus:
  10. -- Das Interface verfuegt ueber 4 sichbare Register:
  11. -- Senderegister (RS232_TRM_REG)
  12. -- Empfangsregister (RS232_RCV_REG)
  13. -- Statusregister (RS232_STAT_REG)
  14. -- Steuerregister (RS232_CTRL_REG)
  15. --------------------------------------------------------------------------------
  16. -- Das Ansprechen der Register erfolgt entweder Wort- oder Byteweise,
  17. -- tatsaechlich wird aber immer nur das nur das niederwertigste Byte eines
  18. -- Zugriffs beruecksichtigt.
  19. -- In das Sendregegister sollte nur geschrieben werden, beim Lesen werden
  20. -- Nullen ausgegeben. Empfangs- und Statusregister koennen nur gelesen
  21. -- werden, Schreiboperationen sind wirkungslos.
  22. -- Das Schreiben eines Datums vom Datenbus ins Senderegister wird als
  23. -- Sendebefehl interpretiert, das Lesen eines Datums aus dem Empfangs-
  24. -- register als Leseoperation.
  25. --------------------------------------------------------------------------------
  26. -- Interpretation des Statusregister:
  27. -- Bit 0 zeigt an, dass ein neues Datum gelesen wurde und im Empfangs-
  28. -- register liegt. Eine Leseoperation auf dem Empfangsregister setzt das
  29. -- Bit zurueck. Bit 4 zeigt an, dass das Sendemodul mit der aktuellen
  30. -- Uebertragung beschaeftigt ist, eine Schreiboperation auf das Sende-
  31. -- register bleibt waehrenddessen wirkungslos. Ist das Bit = 0 und erfolgt
  32. -- ein Schreibzugriff auf das Senderegister, wird das Bit im gleichen Takt
  33. -- neu gesetzt.
  34. --
  35. -- Das Steuerregister hat vorlaeufig keine besondere Wirkung, kann aber
  36. -- beschrieben werden.
  37. --------------------------------------------------------------------------------
  38.  
  39. entity ArmRS232Interface is
  40. port(
  41. SYS_CLK : in std_logic;
  42. SYS_RST : in std_logic;
  43. -- Schnittstelle zum Datenbus
  44. RS232_CS : in std_logic;
  45. RS232_DnRW : in std_logic;
  46. RS232_DMAS : IN std_logic_vector(1 downto 0);
  47. RS232_DA : in std_logic_vector(3 downto 0);
  48. RS232_DDIN : in std_logic_vector(31 downto 0);
  49. RS232_DDOUT : out std_logic_vector(31 downto 0);
  50. RS232_DABORT : out std_logic;
  51. RS232_IRQ : out std_logic;
  52. -- Serielle Empfangs- und Sendeleitungen
  53. RS232_RXD : in std_logic;
  54. RS232_TXD : out std_logic
  55. );
  56. end entity ArmRS232Interface;
  57.  
  58. architecture behave of ArmRS232Interface is
  59. --------------------------------------------------------------------------------
  60. -- Lokale Schnittstellensignale zum Datenbus zur Realisierung der
  61. -- Tristate-Ausgaenge.
  62. --------------------------------------------------------------------------------
  63. signal DABORT_INTERNAL : std_logic;
  64. signal DDOUT_INTERNAL : std_logic_vector(31 downto 0);
  65.  
  66. --------------------------------------------------------------------------------
  67. -- Definition der lokalen, am Datenbus adressierbaren Register der
  68. -- seriellen Schnittstelle. Sie werden Ausschliesslich im Block
  69. -- INTERFACE_COMMUNICATION beschrieben!
  70. --------------------------------------------------------------------------------
  71. type RS232_REGISTER_SET_LOCAL_TYPE is array ( 0 to 2 ) of std_logic_vector(7 downto 0);
  72. signal REGISTER_SET : RS232_REGISTER_SET_LOCAL_TYPE := (others => (others => '0'));
  73.  
  74. --------------------------------------------------------------------------------
  75. -- Aliase fuer den Zugriff auf die 4 Register der RS232-Schnittstelle.
  76. -- RS232_CTRL_REG ist aktuell funktionslos, liefert beim Lesen immer
  77. -- 0 und Schreibzugriff haben keine Wirkung -> Beschreibung als Konstante.
  78. --------------------------------------------------------------------------------
  79. alias RS232_RCV_REG : std_logic_vector(7 downto 0) is REGISTER_SET(0);
  80. alias RS232_TRM_REG : std_logic_vector(7 downto 0) is REGISTER_SET(1);
  81. alias RS232_STAT_REG : std_logic_vector(7 downto 0) is REGISTER_SET(2);
  82. constant RS232_CTRL_REG : std_logic_vector(7 downto 0) := (others => '0');
  83.  
  84. --------------------------------------------------------------------------------
  85. -- Signale fuer die Kommunikation zwischen den 3 Bloecken im Modul.
  86. --------------------------------------------------------------------------------
  87. -- Signale vom RS232-Receiver zur Busschnittstelle INTERFACE_COMMUNICATION
  88. signal DATA_RECEIVED : std_logic;
  89. signal RECEIVER_DATA : std_logic_vector(7 downto 0);
  90. --------------------------------------------------------------------------------
  91. -- Steuer- und Statussignale zwischen RS232-Transmitter und
  92. -- Busschnittstelle. Der Transmitter liest zusaetzlich Daten aus dem
  93. -- lokalen Register RS232_TRM_REG.
  94. --------------------------------------------------------------------------------
  95. signal START_TRANSMISSION : std_logic;
  96. signal TRANSMITTER_BUSY : std_logic;
  97. --------------------------------------------------------------------------------
  98. begin
  99. --------------------------------------------------------------------------------
  100. -- Kommunikationsschnittstelle, stellt die Verbindung zwischen Datenbus
  101. -- und den RS232-Komponenten her.
  102. --------------------------------------------------------------------------------
  103.  
  104. INTERFACE_COMMUNICATION : block is
  105. begin
  106. --------------------------------------------------------------------------------
  107. -- Data Abort, wenn eine Wortzugriff mit nicht ausgerichteter Adresse
  108. -- erfolgt oder ein Bytezugriff auf die nicht verwendeten hochwertigen
  109. -- 24 Registerbits erfolgt.
  110. --------------------------------------------------------------------------------
  111. DABORT_INTERNAL <= '1' when ((RS232_DMAS /= DMAS_BYTE) and (RS232_DMAS /= DMAS_WORD)) or RS232_DA(1 downto 0) /= "00" else '0';
  112. -- Daten- und Abortsignale werden nur getrieben, wenn das Modul tatsaechlich aktiv sein soll
  113. RS232_DABORT <= DABORT_INTERNAL when RS232_CS = '1' else 'Z';
  114. RS232_DDOUT <= DDOUT_INTERNAL when RS232_CS = '1' and RS232_DnRW = '0' else (others => 'Z');
  115.  
  116. --------------------------------------------------------------------------------
  117. -- Interrupt ist bis auf weiteres direkt Bit 0 des Statusregistes, maskiert
  118. -- wird ausschliesslich in Software durch das CPSR-IRQ-Maskenbit
  119. --------------------------------------------------------------------------------
  120. RS232_IRQ <= RS232_STAT_REG(0);
  121.  
  122. --------------------------------------------------------------------------------
  123. -- Die vier Register der RS232-Schnittstelle liegen an 4 Adressen
  124. -- hintereinander. Die Adressbits (3:2) waehlen das Register aus.
  125. --------------------------------------------------------------------------------
  126. GET_REGISTER : process(RS232_DA(3 downto 2), REGISTER_SET)
  127. begin
  128. case RS232_DA(3 downto 2) IS
  129. when "00" =>
  130. DDOUT_INTERNAL <= X"000000" & RS232_RCV_REG;
  131. when "01" =>
  132. DDOUT_INTERNAL <= (others => '0');
  133.  
  134. when "10" =>
  135. DDOUT_INTERNAL <= X"000000" & RS232_STAT_REG;
  136. when others =>
  137. DDOUT_INTERNAL <= (others => '0');
  138. end case;
  139. end process GET_REGISTER;
  140.  
  141. --------------------------------------------------------------------------------
  142. -- Schreibzugriffe vom Datenbus auf das Register RS232_TRM_REG setzen
  143. -- dessen Inhalt und veranlassen das Senden des neuen Datums ueber die
  144. -- TXD-Leitung.
  145. --------------------------------------------------------------------------------
  146. SET_REGISTER : process(SYS_CLK, REGISTER_SET, START_TRANSMISSION)
  147. begin
  148. REGISTER_SET <= REGISTER_SET;
  149. START_TRANSMISSION <= START_TRANSMISSION;
  150.  
  151. if SYS_CLK'event and SYS_CLK = '1' then
  152. if(SYS_RST = '1') then
  153. REGISTER_SET <= (others => (others => '0'));
  154. START_TRANSMISSION <= '0';
  155. else
  156. START_TRANSMISSION <= '0';
  157. RS232_STAT_REG(7 downto 5) <= "000";
  158. RS232_STAT_REG(3 downto 1) <= "000";
  159. RS232_STAT_REG(4) <= TRANSMITTER_BUSY or START_TRANSMISSION;
  160. -- Gueltiger Schreibzugriff auf das Transmissionsregister loest die Uebertragung aus
  161. if(RS232_DnRW = '1' and RS232_CS = '1' and DABORT_INTERNAL = '0' and RS232_DA(3 downto 2) = "01" and START_TRANSMISSION = '0')then
  162. if(TRANSMITTER_BUSY = '0')then
  163. RS232_TRM_REG <= RS232_DDIN(7 downto 0);
  164. START_TRANSMISSION <= '1';
  165. RS232_STAT_REG(4) <= '1';
  166. end if;
  167. end if;
  168. --------------------------------------------------------------------------------
  169. -- Gueltiger Lesezugriff auf das Empfangsregister, setzt die Anzeige fuer
  170. -- ein empfangenes Datum zurueck. Sollte im gleichen Takt erneut ein Datum
  171. -- empfangen worden sein, bleibt das Bit gesetzt (naechster Abschnitt).
  172. --------------------------------------------------------------------------------
  173. if(RS232_DnRW = '0' and RS232_CS = '1' and DABORT_INTERNAL = '0' and RS232_DA(3 downto 2) = "00")then
  174. RS232_STAT_REG(0) <= '0';
  175. end if;
  176. --------------------------------------------------------------------------------
  177. -- Empfaenger zeigt an, dass ein neues Datum empfangen wurde, das
  178. -- entsprechende Statusbit wird gesetzt.
  179. --------------------------------------------------------------------------------
  180. if(DATA_RECEIVED = '1')then
  181. RS232_RCV_REG <= RECEIVER_DATA;
  182. RS232_STAT_REG(0) <= '1';
  183. end if;
  184. end if;
  185. end if;
  186. end process SET_REGISTER;
  187. end block INTERFACE_COMMUNICATION;
  188.  
  189.  
  190. --------------------------------------------------------------------------------
  191. -- Block, der das Verhalten eines RS232-Empfaengers beschreibt.
  192. --------------------------------------------------------------------------------
  193. RS232_RECEIVER : block is
  194. --------------------------------------------------------------------------------
  195. -- Exklusive Typen und Signale des Empfaengers. Alle Ausgangssignale, die
  196. -- die Statemachine setzt, werden durch einen zusaetzlichen Prozess
  197. -- registriert.
  198. -- Die Statemachine liest ein von ihr direkt oder indirekt gesetztes Signal
  199. -- ausschliesslich auf dem Umweg ueber das Register wieder ein, um
  200. -- asynchrone Rueckkopplungen zu vermeiden.
  201. --------------------------------------------------------------------------------
  202. type RS232_RCV_STATE_TYPE is (RCV_IDLE, RCV_READ_BIT, RCV_STOPP);
  203. signal RCV_STATE, RCV_NEXT_STATE : RS232_RCV_STATE_TYPE := RCV_IDLE;
  204. constant DATA_REG_INIT_VALUE : std_logic_vector(7 downto 0) := "10000000";
  205. signal RCV_DATA, RCV_DATA_REG : std_logic_vector(7 downto 0) := DATA_REG_INIT_VALUE;
  206. -- Flipflop zum Aufsynchronisieren des Eingangssignals
  207. signal DATA_IN_BIT_REG : std_logic := '1';
  208. signal SET_DATA, SET_DATA_REG : std_logic;
  209. signal DATA_RECEIVED_REG : std_logic := '1';
  210. signal WSG_DELAY, WSG_DELAY_REG : std_logic_vector(31 downto 0);
  211. signal WSG_START, WSG_START_REG : std_logic := '0';
  212. -- WSG_WAIT wird von der Statemachine nur gelesen
  213. signal WSG_WAIT : std_logic;
  214. begin
  215. WSG : entity work.ArmWaitStateGenAsync(BEHAVE)
  216. generic map(
  217. COUNT_VALUE_WIDTH => 32
  218. )
  219. port map(
  220. SYS_CLK => SYS_CLK,
  221. SYS_RST => SYS_RST,
  222. WSG_COUNT_INIT => WSG_DELAY_REG,
  223. WSG_START => WSG_START_REG,
  224. WSG_WAIT => WSG_WAIT
  225. );
  226.  
  227. -- Setzen des Zustandsregisters
  228. SET_RCV_STATE_REG : process(SYS_CLK) is
  229. begin
  230. if SYS_CLK'event and SYS_CLK = '1' then
  231. if SYS_RST = '1' then
  232. RCV_STATE <= RCV_IDLE;
  233. else
  234. RCV_STATE <= RCV_NEXT_STATE;
  235. end if;
  236. end if;
  237. end process SET_RCV_STATE_REG;
  238.  
  239. --------------------------------------------------------------------------------
  240. -- Setzen der Synchronisationsregister, nur aus formalen Gruenden geschieht
  241. -- dies nicht in einem Prozess mit dem Zustandsregister.
  242. --------------------------------------------------------------------------------
  243. SET_DATA_REGISTERS : process(SYS_CLK) is
  244. begin
  245. if SYS_CLK'event and SYS_CLK = '1' then
  246. if SYS_RST = '1' then
  247. DATA_IN_BIT_REG <= '1';
  248. WSG_DELAY_REG <= std_logic_vector(RS232_START_DELAY);
  249. RCV_DATA_REG <= (others => '0');
  250. DATA_RECEIVED_REG <= '0';
  251. WSG_START_REG <= '0';
  252. SET_DATA_REG <= '0';
  253.  
  254. else
  255. DATA_IN_BIT_REG <= RS232_RXD;
  256. WSG_DELAY_REG <= WSG_DELAY;
  257. RCV_DATA_REG <= RCV_DATA;
  258. DATA_RECEIVED_REG <= '0';
  259. WSG_START_REG <= WSG_START;
  260. SET_DATA_REG <= SET_DATA;
  261. if SET_DATA_REG = '1' then
  262. RECEIVER_DATA <= RCV_DATA_REG(7 downto 0);
  263. DATA_RECEIVED_REG <= '1';
  264. end if;
  265.  
  266. end if;
  267. end if;
  268. end process SET_DATA_REGISTERS;
  269.  
  270. --------------------------------------------------------------------------------
  271. -- DATA_RECEIVED zeigt der Kommunkationsschnittstelle an, dass ein neues
  272. -- Datum empfangen wurde.
  273. --------------------------------------------------------------------------------
  274. DATA_RECEIVED <= DATA_RECEIVED_REG;
  275.  
  276. --------------------------------------------------------------------------------
  277. -- Kern der FSM: Ermittlung des Nachfolgezustandes und Setzen der
  278. -- Ausgangssignale, die dann in SET_DATA_REGISTERS in Register geschrieben
  279. -- werden.
  280. --------------------------------------------------------------------------------
  281. SET_OUTPUTS_AND_NEXT_STATE : process(RCV_STATE,DATA_IN_BIT_REG,WSG_WAIT, RCV_DATA_REG) IS
  282. begin
  283. --------------------------------------------------------------------------------
  284. -- Ausgangssignale die durch die FSM gesetzt und in jedem Zustand definiert
  285. -- werden muessen:
  286. -- RCV_NEXT_STATE
  287. -- WSG_START
  288. -- RCV_DATA
  289. -- WSG_DELAY
  290. -- SET_DATA
  291. --------------------------------------------------------------------------------
  292.  
  293. -- Defaultwerte:
  294. RCV_NEXT_STATE <= RCV_STATE;
  295. WSG_START <= '0';
  296. RCV_DATA <= RCV_DATA_REG;
  297. WSG_DELAY <= std_logic_vector(RS232_DELAY);
  298. SET_DATA <= '0';
  299.  
  300. case RCV_STATE is
  301. when RCV_IDLE =>
  302. if( DATA_IN_BIT_REG = '1' )then
  303. RCV_NEXT_STATE <= RCV_IDLE;
  304. WSG_START <= '0';
  305. else
  306. -- Beginn eines Startbits erkannt -> Beginn des Lesevorgangs
  307. RCV_NEXT_STATE <= RCV_READ_BIT;
  308. WSG_START <= '1';
  309. end if;
  310. RCV_DATA <= DATA_REG_INIT_VALUE;
  311. --------------------------------------------------------------------------------
  312. -- START_DELAY entspricht der 1,5-fachen Zeichendauer, sodass die
  313. -- Empfangsleitung ca. in der Mitte des ersten Datenbits wieder abgetastet
  314. -- wird.
  315. --------------------------------------------------------------------------------
  316. WSG_DELAY <= std_logic_vector(RS232_START_DELAY);
  317. SET_DATA <= '0';
  318.  
  319. when RCV_READ_BIT =>
  320. if( WSG_WAIT = '1' )then
  321. RCV_NEXT_STATE <= RCV_READ_BIT;
  322. WSG_START <= '0';
  323. RCV_DATA <= RCV_DATA_REG;
  324. else
  325. RCV_DATA(7 downto 0) <= DATA_IN_BIT_REG & RCV_DATA_REG(7 downto 1);
  326. WSG_START <= '1';
  327. --------------------------------------------------------------------------------
  328. -- RCV_DATA_REG wurde mit einer 1 im MSB initialisiert, die jetzt ganz
  329. -- nach rechts geschoben wurde -> Schieberegister als Zaehler.
  330. --------------------------------------------------------------------------------
  331. if RCV_DATA_REG(0) = '1' then
  332. RCV_NEXT_STATE <= RCV_STOPP;
  333. else
  334. RCV_NEXT_STATE <= RCV_READ_BIT;
  335. end if;
  336. end if;
  337. WSG_DELAY <= std_logic_vector(RS232_DELAY);
  338. SET_DATA <= '0';
  339.  
  340. when RCV_STOPP =>
  341. RCV_DATA <= RCV_DATA_REG;
  342. if( WSG_WAIT = '1' ) then
  343. RCV_NEXT_STATE <= RCV_STOPP;
  344. WSG_START <= '0';
  345. SET_DATA <= '0';
  346. RCV_DATA <= RCV_DATA_REG;
  347. else
  348. if(DATA_IN_BIT_REG = '1')then
  349. RCV_NEXT_STATE <= RCV_IDLE;
  350. WSG_START <= '0';
  351. SET_DATA <= '1';
  352. else
  353. --------------------------------------------------------------------------------
  354. -- 0 wird als Startsignal des naechsten Datensatzes interpretiert,
  355. -- das aktuelle Datum aber nicht in der Kommunikationsschnittstelle
  356. -- bekannt gemacht da ein korrektes Stoppbit fehlt.
  357. --------------------------------------------------------------------------------
  358. RCV_NEXT_STATE <= RCV_READ_BIT;
  359. WSG_START <= '1';
  360. SET_DATA <= '0';
  361. end if;
  362. end if;
  363. WSG_DELAY <= std_logic_vector(RS232_DELAY);
  364.  
  365. when others =>
  366. RCV_NEXT_STATE <= RCV_IDLE;
  367. WSG_START <= '0';
  368. RCV_DATA <= DATA_REG_INIT_VALUE;
  369. WSG_DELAY <= std_logic_vector(RS232_START_DELAY);
  370. SET_DATA <= '0';
  371. end case;
  372. end process SET_OUTPUTS_AND_NEXT_STATE;
  373. end block RS232_RECEIVER;
  374.  
  375. -------------------------------------------------------------------------------
  376. -------------------------------------------------------------------------------
  377. -- Block, der einen RS232-Sender beschreibt und von Ihnen zu ergaenzen
  378. -- ist. Veraendern Sie die Vorgaben ausserhalb des Blocks _nicht_.
  379. -------------------------------------------------------------------------------
  380. -------------------------------------------------------------------------------
  381.  
  382. -- RS232_TRM_REG ist 8 Bit gross
  383. RS232_TRANSMITTER : block is
  384.  
  385. --Zustaende des Transmitters--
  386. type RS232_TRM_STATE_TYPE is (TRM_IDLE, TRM_START, TRM_READ_BIT, TRM_STOPP);
  387. --am anfang Zustand IDLE (untaetig)--
  388. signal TRM_STATE, TRM_NEXT_STATE : RS232_TRM_STATE_TYPE := TRM_IDLE;
  389.  
  390. --Signale fuer Zustandsuebergaenge--
  391. signal first_bit_sent, data_sent, last_bit_sent : std_logic;
  392.  
  393. --shift Signale
  394. signal bit_last, load : std_logic;
  395.  
  396.  
  397. --WaitState Signale
  398. signal wsg_wait, WSG_START : std_logic;
  399. signal WSG_DELAY : std_logic_vector(31 downto 0);
  400.  
  401. begin
  402.  
  403. --Zustandsuebergang--
  404. SET_TRM_STATE : process(SYS_CLK) is
  405. begin
  406. if SYS_CLK'event and SYS_CLK = '1' then --die Zeilen sind aus dem SET_RCV_STATE_REG entnommen
  407. if SYS_RST = '1' then
  408. TRM_STATE <= TRM_IDLE;
  409. else
  410. TRM_STATE <= TRM_NEXT_STATE;
  411. end if;
  412. end if;
  413. end process SET_TRM_STATE;
  414.  
  415. --Zustandsberechnung und Ausgaben setzen--
  416. SET_OUTPUTS_AND_NEXT_STATE: process(TRM_STATE, START_TRANSMISSION, wsg_wait, bit_last) is
  417. begin
  418.  
  419. --default werte--
  420. TRM_NEXT_STATE <= TRM_STATE;
  421. WSG_START <= '0';
  422. WSG_DELAY <= std_logic_vector(RS232_DELAY); --start_delay?
  423.  
  424. TRANSMITTER_BUSY <= '0';
  425.  
  426. data_sent <= '0';
  427.  
  428.  
  429. case TRM_STATE is
  430.  
  431. when TRM_IDLE =>
  432. if( START_TRANSMISSION = '1') then
  433.  
  434. TRANSMITTER_BUSY <= '1';
  435.  
  436. RS232_TXD <= '1'; --das Senden geht los, startbit auf der Leitung
  437.  
  438. WSG_START <= '1'; -- beginnen zu zählen
  439. TRM_NEXT_STATE <= TRM_START;
  440.  
  441. end if;
  442.  
  443. when TRM_START =>
  444.  
  445. if (wsg_wait = '1') then
  446.  
  447. TRM_NEXT_STATE <= TRM_START;
  448. WSG_START <= '0';
  449.  
  450. else -- es wird nicht mehr gewartet, das Startbit ist also gesendet
  451.  
  452. load <= '1'; --beginnen mit laden vom nutzdatum
  453. TRM_NEXT_STATE <= TRM_READ_BIT;
  454.  
  455. end if;
  456.  
  457. when TRM_READ_BIT =>
  458.  
  459. if (wsg_wait = '1') then
  460. TRM_NEXT_STATE <= TRM_READ_BIT;
  461. WSG_START <= '0';
  462. else
  463. if (data_sent = '1') then --wenn nicht mehr gewartet wird
  464. TRM_NEXT_STATE <= TRM_STOPP;
  465.  
  466. else --wenn noch nicht gewartet wird
  467.  
  468. load <= '0'; --schieberegister aktivieren
  469. WSG_START <= '1'; --beginnen mit warten
  470.  
  471. end if;
  472. end if;
  473.  
  474. if (bit_last = '1') then --lastbit von schieberegister
  475. data_sent <= '1'; -- nutzdatum gesendet
  476. end if;
  477.  
  478. when TRM_STOPP =>
  479. if (wsg_wait = '1') then
  480. TRM_NEXT_STATE <= TRM_STOPP;
  481. WSG_START <= '0';
  482. else
  483. if (TRANSMITTER_BUSY = '0') then --nicht mehr gewartet
  484. TRM_NEXT_STATE <= TRM_IDLE;
  485.  
  486. else --noch nicht gewartet
  487.  
  488. RS232_TXD <= '0'; --senden Stoppbit
  489. WSG_START <= '1'; --beginnen zu warten
  490. TRANSMITTER_BUSY <= '0';
  491. START_TRANSMISSION <= '0'; --damit wir von IDLE nicht in start zustand uebergehen
  492.  
  493. end if;
  494.  
  495. end if;
  496.  
  497. end case;
  498.  
  499.  
  500. end process SET_OUTPUTS_AND_NEXT_STATE;
  501.  
  502. ----set_next_state and set_outputs wegschtreichen--
  503.  
  504. schieben : entity work.PISOShiftReg(behavioral)
  505. generic map(WIDTH => 8)
  506. port map(CLK => SYS_CLK,
  507. CLK_EN => '1',
  508. LOAD => load,
  509. D_IN => RS232_TRM_REG(7 downto 0),
  510. D_OUT => RS232_TXD,
  511. LAST_BIT => bit_last);
  512.  
  513. warten : entity work.ArmWaitStateGenAsync(behave)
  514. generic map(COUNT_VALUE_WIDTH => 32)
  515. port map(SYS_CLK => SYS_CLK,
  516. SYS_RST => SYS_RST,
  517. WSG_COUNT_INIT => std_logic_vector(RS232_START_DELAY),--const aus arm configuration
  518. WSG_START => wsg_start,
  519. WSG_WAIT => wsg_wait);
  520.  
  521. end block RS232_TRANSMITTER;
  522.  
  523. end architecture behave;
  524.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement