OpenCores
URL https://opencores.org/ocsvn/System09/System09/trunk

Subversion Repositories System09

[/] [System09/] [tags/] [V10/] [rtl/] [vhdl/] [txunit2.vhd] - Diff between revs 3 and 66

Only display areas with differences | Details | Blame | View Log

Rev 3 Rev 66
--===========================================================================--
--===========================================================================--
--
--
--  S Y N T H E Z I A B L E    miniUART   C O R E
--  S Y N T H E Z I A B L E    miniUART   C O R E
--
--
--  www.OpenCores.Org - January 2000
--  www.OpenCores.Org - January 2000
--  This core adheres to the GNU public license  
--  This core adheres to the GNU public license  
--
--
-- Design units   : miniUART core for the System68
-- Design units   : miniUART core for the System68
--
--
-- File name      : txunit2.vhd
-- File name      : txunit2.vhd
--
--
-- Purpose        : Implements an miniUART device for communication purposes 
-- Purpose        : Implements an miniUART device for communication purposes 
--                  between the CPU68 processor and the Host computer through
--                  between the CPU68 processor and the Host computer through
--                  an RS-232 communication protocol.
--                  an RS-232 communication protocol.
--                  
--                  
-- Dependencies   : IEEE.Std_Logic_1164
-- Dependencies   : IEEE.Std_Logic_1164
--
--
--===========================================================================--
--===========================================================================--
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
-- Revision list
-- Revision list
-- Version   Author                 Date                        Changes
-- Version   Author                 Date                        Changes
--
--
-- 0.1      Ovidiu Lupas       15 January 2000                 New model
-- 0.1      Ovidiu Lupas       15 January 2000                 New model
-- 2.0      Ovidiu Lupas       17 April   2000    unnecessary variable removed
-- 2.0      Ovidiu Lupas       17 April   2000    unnecessary variable removed
--  olupas@opencores.org
--  olupas@opencores.org
--
--
-- 3.0      John Kent           5 January 2003    added 6850 word format control
-- 3.0      John Kent           5 January 2003    added 6850 word format control
-- 3.1      John Kent          12 January 2003    Rearranged state machine code
-- 3.1      John Kent          12 January 2003    Rearranged state machine code
-- 3.2      John Kent          30 March 2003      Revamped State machine
-- 3.2      John Kent          30 March 2003      Revamped State machine
-- 3.3      John Kent           6 September 2003  Changed Clock Edge.
-- 3.3      John Kent           6 September 2003  Changed Clock Edge.
--
--
--  dilbert57@opencores.org
--  dilbert57@opencores.org
--
--
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
-- Description    : 
-- Description    : 
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
-- Entity for the Tx Unit                                                    --
-- Entity for the Tx Unit                                                    --
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
library ieee;
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.numeric_std.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_unsigned.all;
 
 
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
-- Transmitter unit
-- Transmitter unit
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
entity TxUnit is
entity TxUnit is
  port (
  port (
     Clk    : in  Std_Logic;  -- Clock signal
     Clk    : in  Std_Logic;  -- Clock signal
     Reset  : in  Std_Logic;  -- Reset input
     Reset  : in  Std_Logic;  -- Reset input
     Enable : in  Std_Logic;  -- Enable input
     Enable : in  Std_Logic;  -- Enable input
     LoadD  : in  Std_Logic;  -- Load transmit data
     LoadD  : in  Std_Logic;  -- Load transmit data
          Format : in  Std_Logic_Vector(2 downto 0); -- word format
          Format : in  Std_Logic_Vector(2 downto 0); -- word format
     TxD    : out Std_Logic;  -- RS-232 data output
     TxD    : out Std_Logic;  -- RS-232 data output
     TBE    : out Std_Logic;  -- Tx buffer empty
     TBE    : out Std_Logic;  -- Tx buffer empty
     DataO  : in  Std_Logic_Vector(7 downto 0));
     DataO  : in  Std_Logic_Vector(7 downto 0));
end; --================== End of entity ==============================--
end; --================== End of entity ==============================--
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
-- Architecture for TxUnit
-- Architecture for TxUnit
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
architecture Behaviour of TxUnit is
architecture Behaviour of TxUnit is
  type TxStateType is (TxReset_State, TxIdle_State, Start_State, Data_State, Parity_State, Stop_State );
  type TxStateType is (TxReset_State, TxIdle_State, Start_State, Data_State, Parity_State, Stop_State );
  -----------------------------------------------------------------------------
  -----------------------------------------------------------------------------
  -- Signals
  -- Signals
  -----------------------------------------------------------------------------
  -----------------------------------------------------------------------------
  signal TBuff    : Std_Logic_Vector(7 downto 0); -- transmit buffer
  signal TBuff    : Std_Logic_Vector(7 downto 0); -- transmit buffer
  signal tmpTBufE : Std_Logic;                    -- Transmit Buffer Empty
  signal tmpTBufE : Std_Logic;                    -- Transmit Buffer Empty
 
 
  signal TReg     : Std_Logic_Vector(7 downto 0); -- transmit register
  signal TReg     : Std_Logic_Vector(7 downto 0); -- transmit register
  signal TxParity : Std_logic;                    -- Parity Bit
  signal TxParity : Std_logic;                    -- Parity Bit
  signal DataCnt  : Std_Logic_Vector(3 downto 0); -- Data Bit Counter
  signal DataCnt  : Std_Logic_Vector(3 downto 0); -- Data Bit Counter
  signal tmpTRegE : Std_Logic;                    --  Transmit Register empty
  signal tmpTRegE : Std_Logic;                    --  Transmit Register empty
  signal TxState  : TxStateType;
  signal TxState  : TxStateType;
 
 
  signal NextTReg     : Std_Logic_Vector(7 downto 0); -- transmit register
  signal NextTReg     : Std_Logic_Vector(7 downto 0); -- transmit register
  signal NextTxParity : Std_logic;                    -- Parity Bit
  signal NextTxParity : Std_logic;                    -- Parity Bit
  signal NextDataCnt  : Std_Logic_Vector(3 downto 0); -- Data Bit Counter
  signal NextDataCnt  : Std_Logic_Vector(3 downto 0); -- Data Bit Counter
  signal NextTRegE    : Std_Logic;                    --  Transmit Register empty
  signal NextTRegE    : Std_Logic;                    --  Transmit Register empty
  signal NextTxState  : TxStateType;
  signal NextTxState  : TxStateType;
begin
begin
  ---------------------------------------------------------------------
  ---------------------------------------------------------------------
  -- Transmitter activation process
  -- Transmitter activation process
  ---------------------------------------------------------------------
  ---------------------------------------------------------------------
  TxSync : process(Clk, Reset, Enable, LoadD, DataO, tmpTBufE, tmpTRegE, TBuff )
  TxSync : process(Clk, Reset, Enable, LoadD, DataO, tmpTBufE, tmpTRegE, TBuff )
  begin
  begin
     if Clk'event and Clk = '0' then
     if Clk'event and Clk = '0' then
        if Reset = '1' then
        if Reset = '1' then
           tmpTBufE <= '1';
           tmpTBufE <= '1';
                          TBuff    <= "00000000";
                          TBuff    <= "00000000";
        else
        else
                     if LoadD = '1' then
                     if LoadD = '1' then
                            TBuff <= DataO;
                            TBuff <= DataO;
             tmpTBufE <= '0';
             tmpTBufE <= '0';
                          else
                          else
                            TBuff <= TBuff;
                            TBuff <= TBuff;
             if (Enable = '1') and (tmpTBufE = '0') and (tmpTRegE = '1') then
             if (Enable = '1') and (tmpTBufE = '0') and (tmpTRegE = '1') then
               tmpTBufE <= '1';
               tmpTBufE <= '1';
                                 else
                                 else
               tmpTBufE <= tmpTBufE;
               tmpTBufE <= tmpTBufE;
                                 end if;
                                 end if;
                          end if;
                          end if;
        end if; -- reset
        end if; -- reset
    end if; -- clk
    end if; -- clk
    TBE <= tmpTBufE;
    TBE <= tmpTBufE;
 
 
  end process;
  end process;
 
 
  -----------------------------------------------------------------------------
  -----------------------------------------------------------------------------
  -- Implements the Tx unit
  -- Implements the Tx unit
  -----------------------------------------------------------------------------
  -----------------------------------------------------------------------------
 TxProc :  process(TxState, TBuff, TReg, TxParity, DataCnt, Format, tmpTRegE, tmpTBufE)
 TxProc :  process(TxState, TBuff, TReg, TxParity, DataCnt, Format, tmpTRegE, tmpTBufE)
  begin
  begin
    case TxState is
    case TxState is
         when TxReset_State =>
         when TxReset_State =>
      TxD          <= '1';
      TxD          <= '1';
           NextTReg     <= "00000000";
           NextTReg     <= "00000000";
           NextTxParity <= '0';
           NextTxParity <= '0';
                NextDataCnt  <= "0000";
                NextDataCnt  <= "0000";
                NextTRegE    <= '1';
                NextTRegE    <= '1';
      NextTxState  <= TxIdle_State;
      NextTxState  <= TxIdle_State;
 
 
    when Start_State =>
    when Start_State =>
      TxD          <= '0';           -- Start bit
      TxD          <= '0';           -- Start bit
                NextTReg     <= TReg;
                NextTReg     <= TReg;
           NextTxParity <= '0';
           NextTxParity <= '0';
                if Format(2) = '0' then
                if Format(2) = '0' then
                  NextDataCnt <= "0110";       -- 7 data + parity
                  NextDataCnt <= "0110";       -- 7 data + parity
           else
           else
        NextDataCnt <= "0111";       -- 8 data
        NextDataCnt <= "0111";       -- 8 data
           end if;
           end if;
      NextTRegE    <= '0';
      NextTRegE    <= '0';
      NextTxState  <= Data_State;
      NextTxState  <= Data_State;
 
 
    when Data_State =>
    when Data_State =>
      TxD          <= TReg(0);
      TxD          <= TReg(0);
      NextTReg     <= '1' & TReg(7 downto 1);
      NextTReg     <= '1' & TReg(7 downto 1);
      NextTxParity <= TxParity xor TReg(0);
      NextTxParity <= TxParity xor TReg(0);
      NextTRegE    <= '0';
      NextTRegE    <= '0';
                NextDataCnt  <= DataCnt - "0001";
                NextDataCnt  <= DataCnt - "0001";
                if DataCnt = "0000" then
                if DataCnt = "0000" then
             if (Format(2) = '1') and (Format(1) = '0') then
             if (Format(2) = '1') and (Format(1) = '0') then
                         if Format(0) = '0' then            -- 8 data bits
                         if Format(0) = '0' then            -- 8 data bits
            NextTxState <= Stop_State;       -- 2 stops
            NextTxState <= Stop_State;       -- 2 stops
                         else
                         else
                                NextTxState <= TxIdle_State;     -- 1 stop
                                NextTxState <= TxIdle_State;     -- 1 stop
                    end if;
                    end if;
                  else
                  else
                         NextTxState <= Parity_State;       -- parity
                         NextTxState <= Parity_State;       -- parity
                  end if;
                  end if;
                else
                else
        NextTxState  <= Data_State;
        NextTxState  <= Data_State;
                end if;
                end if;
 
 
    when Parity_State =>           -- 7/8 data + parity bit
    when Parity_State =>           -- 7/8 data + parity bit
           if Format(0) = '0' then
           if Format(0) = '0' then
                        TxD <= not( TxParity );   -- even parity
                        TxD <= not( TxParity );   -- even parity
                else
                else
                        TXD <= TxParity;          -- odd parity
                        TXD <= TxParity;          -- odd parity
           end if;
           end if;
                NextTreg   <= Treg;
                NextTreg   <= Treg;
                NextTxParity <= '0';
                NextTxParity <= '0';
      NextTRegE <= '0';
      NextTRegE <= '0';
                NextDataCnt <= "0000";
                NextDataCnt <= "0000";
                if Format(1) = '0' then
                if Format(1) = '0' then
                        NextTxState <= Stop_State; -- 2 stops
                        NextTxState <= Stop_State; -- 2 stops
                else
                else
                        NextTxState <= TxIdle_State; -- 1 stop
                        NextTxState <= TxIdle_State; -- 1 stop
                end if;
                end if;
 
 
    when Stop_State => -- first stop bit
    when Stop_State => -- first stop bit
      TxD          <= '1';           -- 2 stop bits
      TxD          <= '1';           -- 2 stop bits
           NextTreg     <= Treg;
           NextTreg     <= Treg;
                NextTxParity <= '0';
                NextTxParity <= '0';
                NextDataCnt  <= "0000";
                NextDataCnt  <= "0000";
      NextTRegE    <= '0';
      NextTRegE    <= '0';
                NextTxState  <= TxIdle_State;
                NextTxState  <= TxIdle_State;
 
 
    when others =>  -- TxIdle_State (2nd Stop bit)
    when others =>  -- TxIdle_State (2nd Stop bit)
      TxD          <= '1';
      TxD          <= '1';
           NextTreg     <= TBuff;
           NextTreg     <= TBuff;
                NextTxParity <= '0';
                NextTxParity <= '0';
                NextDataCnt  <= "0000";
                NextDataCnt  <= "0000";
                if (tmpTBufE = '0') and (tmpTRegE = '1') then
                if (tmpTBufE = '0') and (tmpTRegE = '1') then
         NextTRegE   <= '0';
         NextTRegE   <= '0';
         NextTxState <= Start_State;
         NextTxState <= Start_State;
           else
           else
         NextTRegE   <= '1';
         NextTRegE   <= '1';
         NextTxState <= TxIdle_State;
         NextTxState <= TxIdle_State;
                end if;
                end if;
 
 
    end case; -- TxState
    end case; -- TxState
 
 
  end process;
  end process;
 
 
  --
  --
  -- Tx State Machine
  -- Tx State Machine
  -- Slowed down by "Enable"
  -- Slowed down by "Enable"
  --
  --
  TX_State_Machine: process( Clk, Reset, Enable,
  TX_State_Machine: process( Clk, Reset, Enable,
                             Treg,     NextTReg,
                             Treg,     NextTReg,
                             TxParity, NextTxParity,
                             TxParity, NextTxParity,
                                                                          DataCnt,  NextDataCnt,
                                                                          DataCnt,  NextDataCnt,
                                                                          tmpTRegE, NextTRegE,
                                                                          tmpTRegE, NextTRegE,
                                                                     TxState,  NextTxState )
                                                                     TxState,  NextTxState )
  begin
  begin
    if Clk'event and Clk = '0' then
    if Clk'event and Clk = '0' then
           if Reset = '1' then
           if Reset = '1' then
              Treg     <= "00000000";
              Treg     <= "00000000";
                   TxParity <= '0';
                   TxParity <= '0';
                   DataCnt  <= "0000";
                   DataCnt  <= "0000";
         tmpTRegE <= '1';
         tmpTRegE <= '1';
                   TxState  <= TxReset_State;
                   TxState  <= TxReset_State;
                else
                else
                   if Enable = '1' then
                   if Enable = '1' then
                Treg     <= NextTreg;
                Treg     <= NextTreg;
                     TxParity <= NextTxParity;
                     TxParity <= NextTxParity;
                     DataCnt  <= NextDataCnt;
                     DataCnt  <= NextDataCnt;
           tmpTRegE <= NextTRegE;
           tmpTRegE <= NextTRegE;
                     TxState  <= NextTxState;
                     TxState  <= NextTxState;
                        else
                        else
                Treg     <= Treg;
                Treg     <= Treg;
                     TxParity <= TxParity;
                     TxParity <= TxParity;
                     DataCnt  <= DataCnt;
                     DataCnt  <= DataCnt;
           tmpTRegE <= tmpTRegE;
           tmpTRegE <= tmpTRegE;
                          TxState  <= TxState;
                          TxState  <= TxState;
                        end if;
                        end if;
                end if;
                end if;
         end if;
         end if;
 
 
  end process;
  end process;
 
 
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.