-- -----------------------------------------------------------------------------
--  STRING2TXD - a string to RS232 signal generator                           -- 
-- -----------------------------------------------------------------------------
--
--  File        : 'string2txd.vhd'
--  Author      :  Lars Larsson 
-- 
--  Date        :  February 15, 1999
--
--  Description :  This converts a string S of 8 bit characters into a RS232 
--                 signal TxD with one stop bit and no parity (8n1). The baud
--                 rate is adjusted by the bit time parameter T.
--
-- -----------------------------------------------------------------------------
--
-- Copyright (C) 1999 Lars Larsson, Dept. of Computer Science
--                                  University of Hamburg
--                                  Vogt-Koelln-Str. 30
--                                  D - 22041 Hamburg, Germany
--                                  larsson@informatik.uni-hamburg.de
--                                  http://tech-www.informatik.uni-hamburg.de/~larsson
--
-- This program is free software; you can redistribute it and/or modify it
-- under the terms of the GNU General Public License as published by the
-- Free Software Foundation; either version 2 of the License, or (at your
-- option) any later version.
--
-- This program is distributed in the hope that it will be useful, but
-- WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
-- for more details.
--
-- You should have received a copy of the GNU General Public License along
-- with this program; if not, write to the Free Software Foundation, Inc.,
-- 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
--
-- -----------------------------------------------------------------------------

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;

entity string2txd is
  port(         
            t :  in time;             -- T_BAUD = 1/(baud rate)
            s :  in string;           -- text string to send
          txd : out std_ulogic        -- RS232 TxD signal of the string 's'
       );
end string2txd;

architecture simulate of string2txd is

  type unsigned_indexed_by_char is array (character) of unsigned (7 downto 0);
  constant char_to_unsigned : unsigned_indexed_by_char :=
  (
    "00000000","00000001","00000010","00000011","00000100","00000101","00000110","00000111",
    "00001000","00001001","00001010","00001011","00001100","00001101","00001110","00001111",
    "00010000","00010001","00010010","00010011","00010100","00010101","00010110","00010111",
    "00011000","00011001","00011010","00011011","00011100","00011101","00011110","00011111",
    "00100000","00100001","00100010","00100011","00100100","00100101","00100110","00100111",
    "00101000","00101001","00101010","00101011","00101100","00101101","00101110","00101111",
    "00110000","00110001","00110010","00110011","00110100","00110101","00110110","00110111",
    "00111000","00111001","00111010","00111011","00111100","00111101","00111110","00111111",
    "01000000","01000001","01000010","01000011","01000100","01000101","01000110","01000111",
    "01001000","01001001","01001010","01001011","01001100","01001101","01001110","01001111",
    "01010000","01010001","01010010","01010011","01010100","01010101","01010110","01010111",
    "01011000","01011001","01011010","01011011","01011100","01011101","01011110","01011111",
    "01100000","01100001","01100010","01100011","01100100","01100101","01100110","01100111",
    "01101000","01101001","01101010","01101011","01101100","01101101","01101110","01101111",
    "01110000","01110001","01110010","01110011","01110100","01110101","01110110","01110111",
    "01111000","01111001","01111010","01111011","01111100","01111101","01111110","01111111"  --  ,
    --    "10000000","10000001","10000010","10000011","10000100","10000101","10000110","10000111",
    --    "10001000","10001001","10001010","10001011","10001100","10001101","10001110","10001111",
    --    "10010000","10010001","10010010","10010011","10010100","10010101","10010110","10010111",
    --    "10011000","10011001","10011010","10011011","10011100","10011101","10011110","10011111",
    --    "10100000","10100001","10100010","10100011","10100100","10100101","10100110","10100111",
    --    "10101000","10101001","10101010","10101011","10101100","10101101","10101110","10101111",
    --    "10110000","10110001","10110010","10110011","10110100","10110101","10110110","10110111",
    --    "10111000","10111001","10111010","10111011","10111100","10111101","10111110","10111111",
    --    "11000000","11000001","11000010","11000011","11000100","11000101","11000110","11000111",
    --    "11001000","11001001","11001010","11001011","11001100","11001101","11001110","11001111",
    --    "11010000","11010001","11010010","11010011","11010100","11010101","11010110","11010111",
    --    "11011000","11011001","11011010","11011011","11011100","11011101","11011110","11011111",
    --    "11100000","11100001","11100010","11100011","11100100","11100101","11100110","11100111",
    --    "11101000","11101001","11101010","11101011","11101100","11101101","11101110","11101111",
    --    "11110000","11110001","11110010","11110011","11110100","11110101","11110110","11110111",
    --    "11111000","11111001","11111010","11111011","11111100","11111101","11111110","11111111"
  );

   signal txd_s : std_ulogic;

   begin

       txd_p : process  -- converts ASCII string 's' to 8n1 RS232 TxD-Signal
                  variable chr_v : unsigned (7 downto 0);
                  variable reg_v : unsigned (9 downto 0);
                  variable txd_v : std_ulogic;
                  alias    str   : string ( 1 to s'length ) is s;
               begin
                  txd_s <= '1'; wait for 20 * t;  -- idle for two characters
                  for i in str'range loop
                      chr_v := char_to_unsigned(str(i)); 
                      reg_v := '1' & chr_v & '0';
                      for j in reg_v'range loop
                          txd_s <= reg_v(9-j);
                          wait for t;
                      end loop;
                      -- wait for t;     -- uncomment wait statement for 8n2
                  end loop;
                  txd_s <= '1';
                  wait;
              end process;

	   txd <= txd_s;

   end simulate;

-- -----------------------------------------------------------------------------

<div align="center"><br /><script type="text/javascript"><!--
google_ad_client = "pub-7293844627074885";
//468x60, Created at 07. 11. 25
google_ad_slot = "8619794253";
google_ad_width = 468;
google_ad_height = 60;
//--></script>
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script><br />&nbsp;</div>