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

Subversion Repositories System09

[/] [System09/] [tags/] [V10/] [rtl/] [vhdl/] [txunit2.vhd] - Blame information for rev 66

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 dilbert57
--===========================================================================--
2
--
3
--  S Y N T H E Z I A B L E    miniUART   C O R E
4
--
5
--  www.OpenCores.Org - January 2000
6
--  This core adheres to the GNU public license  
7
--
8
-- Design units   : miniUART core for the System68
9
--
10
-- File name      : txunit2.vhd
11
--
12
-- Purpose        : Implements an miniUART device for communication purposes 
13
--                  between the CPU68 processor and the Host computer through
14
--                  an RS-232 communication protocol.
15
--                  
16
-- Dependencies   : IEEE.Std_Logic_1164
17
--
18
--===========================================================================--
19
-------------------------------------------------------------------------------
20
-- Revision list
21
-- Version   Author                 Date                        Changes
22
--
23
-- 0.1      Ovidiu Lupas       15 January 2000                 New model
24
-- 2.0      Ovidiu Lupas       17 April   2000    unnecessary variable removed
25
--  olupas@opencores.org
26
--
27
-- 3.0      John Kent           5 January 2003    added 6850 word format control
28
-- 3.1      John Kent          12 January 2003    Rearranged state machine code
29
-- 3.2      John Kent          30 March 2003      Revamped State machine
30
-- 3.3      John Kent           6 September 2003  Changed Clock Edge.
31
--
32
--  dilbert57@opencores.org
33
--
34
-------------------------------------------------------------------------------
35
-- Description    : 
36
-------------------------------------------------------------------------------
37
-- Entity for the Tx Unit                                                    --
38
-------------------------------------------------------------------------------
39
library ieee;
40
use ieee.std_logic_1164.all;
41
use ieee.numeric_std.all;
42
use ieee.std_logic_unsigned.all;
43
 
44
-------------------------------------------------------------------------------
45
-- Transmitter unit
46
-------------------------------------------------------------------------------
47
entity TxUnit is
48
  port (
49
     Clk    : in  Std_Logic;  -- Clock signal
50
     Reset  : in  Std_Logic;  -- Reset input
51
     Enable : in  Std_Logic;  -- Enable input
52
     LoadD  : in  Std_Logic;  -- Load transmit data
53
          Format : in  Std_Logic_Vector(2 downto 0); -- word format
54
     TxD    : out Std_Logic;  -- RS-232 data output
55
     TBE    : out Std_Logic;  -- Tx buffer empty
56
     DataO  : in  Std_Logic_Vector(7 downto 0));
57
end; --================== End of entity ==============================--
58
-------------------------------------------------------------------------------
59
-- Architecture for TxUnit
60
-------------------------------------------------------------------------------
61
architecture Behaviour of TxUnit is
62
  type TxStateType is (TxReset_State, TxIdle_State, Start_State, Data_State, Parity_State, Stop_State );
63
  -----------------------------------------------------------------------------
64
  -- Signals
65
  -----------------------------------------------------------------------------
66
  signal TBuff    : Std_Logic_Vector(7 downto 0); -- transmit buffer
67
  signal tmpTBufE : Std_Logic;                    -- Transmit Buffer Empty
68
 
69
  signal TReg     : Std_Logic_Vector(7 downto 0); -- transmit register
70
  signal TxParity : Std_logic;                    -- Parity Bit
71
  signal DataCnt  : Std_Logic_Vector(3 downto 0); -- Data Bit Counter
72
  signal tmpTRegE : Std_Logic;                    --  Transmit Register empty
73
  signal TxState  : TxStateType;
74
 
75
  signal NextTReg     : Std_Logic_Vector(7 downto 0); -- transmit register
76
  signal NextTxParity : Std_logic;                    -- Parity Bit
77
  signal NextDataCnt  : Std_Logic_Vector(3 downto 0); -- Data Bit Counter
78
  signal NextTRegE    : Std_Logic;                    --  Transmit Register empty
79
  signal NextTxState  : TxStateType;
80
begin
81
  ---------------------------------------------------------------------
82
  -- Transmitter activation process
83
  ---------------------------------------------------------------------
84
  TxSync : process(Clk, Reset, Enable, LoadD, DataO, tmpTBufE, tmpTRegE, TBuff )
85
  begin
86
     if Clk'event and Clk = '0' then
87
        if Reset = '1' then
88
           tmpTBufE <= '1';
89
                          TBuff    <= "00000000";
90
        else
91
                     if LoadD = '1' then
92
                            TBuff <= DataO;
93
             tmpTBufE <= '0';
94
                          else
95
                            TBuff <= TBuff;
96
             if (Enable = '1') and (tmpTBufE = '0') and (tmpTRegE = '1') then
97
               tmpTBufE <= '1';
98
                                 else
99
               tmpTBufE <= tmpTBufE;
100
                                 end if;
101
                          end if;
102
        end if; -- reset
103
    end if; -- clk
104
    TBE <= tmpTBufE;
105
 
106
  end process;
107
 
108
  -----------------------------------------------------------------------------
109
  -- Implements the Tx unit
110
  -----------------------------------------------------------------------------
111
 TxProc :  process(TxState, TBuff, TReg, TxParity, DataCnt, Format, tmpTRegE, tmpTBufE)
112
  begin
113
    case TxState is
114
         when TxReset_State =>
115
      TxD          <= '1';
116
           NextTReg     <= "00000000";
117
           NextTxParity <= '0';
118
                NextDataCnt  <= "0000";
119
                NextTRegE    <= '1';
120
      NextTxState  <= TxIdle_State;
121
 
122
    when Start_State =>
123
      TxD          <= '0';           -- Start bit
124
                NextTReg     <= TReg;
125
           NextTxParity <= '0';
126
                if Format(2) = '0' then
127
                  NextDataCnt <= "0110";       -- 7 data + parity
128
           else
129
        NextDataCnt <= "0111";       -- 8 data
130
           end if;
131
      NextTRegE    <= '0';
132
      NextTxState  <= Data_State;
133
 
134
    when Data_State =>
135
      TxD          <= TReg(0);
136
      NextTReg     <= '1' & TReg(7 downto 1);
137
      NextTxParity <= TxParity xor TReg(0);
138
      NextTRegE    <= '0';
139
                NextDataCnt  <= DataCnt - "0001";
140
                if DataCnt = "0000" then
141
             if (Format(2) = '1') and (Format(1) = '0') then
142
                         if Format(0) = '0' then            -- 8 data bits
143
            NextTxState <= Stop_State;       -- 2 stops
144
                         else
145
                                NextTxState <= TxIdle_State;     -- 1 stop
146
                    end if;
147
                  else
148
                         NextTxState <= Parity_State;       -- parity
149
                  end if;
150
                else
151
        NextTxState  <= Data_State;
152
                end if;
153
 
154
    when Parity_State =>           -- 7/8 data + parity bit
155
           if Format(0) = '0' then
156
                        TxD <= not( TxParity );   -- even parity
157
                else
158
                        TXD <= TxParity;          -- odd parity
159
           end if;
160
                NextTreg   <= Treg;
161
                NextTxParity <= '0';
162
      NextTRegE <= '0';
163
                NextDataCnt <= "0000";
164
                if Format(1) = '0' then
165
                        NextTxState <= Stop_State; -- 2 stops
166
                else
167
                        NextTxState <= TxIdle_State; -- 1 stop
168
                end if;
169
 
170
    when Stop_State => -- first stop bit
171
      TxD          <= '1';           -- 2 stop bits
172
           NextTreg     <= Treg;
173
                NextTxParity <= '0';
174
                NextDataCnt  <= "0000";
175
      NextTRegE    <= '0';
176
                NextTxState  <= TxIdle_State;
177
 
178
    when others =>  -- TxIdle_State (2nd Stop bit)
179
      TxD          <= '1';
180
           NextTreg     <= TBuff;
181
                NextTxParity <= '0';
182
                NextDataCnt  <= "0000";
183
                if (tmpTBufE = '0') and (tmpTRegE = '1') then
184
         NextTRegE   <= '0';
185
         NextTxState <= Start_State;
186
           else
187
         NextTRegE   <= '1';
188
         NextTxState <= TxIdle_State;
189
                end if;
190
 
191
    end case; -- TxState
192
 
193
  end process;
194
 
195
  --
196
  -- Tx State Machine
197
  -- Slowed down by "Enable"
198
  --
199
  TX_State_Machine: process( Clk, Reset, Enable,
200
                             Treg,     NextTReg,
201
                             TxParity, NextTxParity,
202
                                                                          DataCnt,  NextDataCnt,
203
                                                                          tmpTRegE, NextTRegE,
204
                                                                     TxState,  NextTxState )
205
  begin
206
    if Clk'event and Clk = '0' then
207
           if Reset = '1' then
208
              Treg     <= "00000000";
209
                   TxParity <= '0';
210
                   DataCnt  <= "0000";
211
         tmpTRegE <= '1';
212
                   TxState  <= TxReset_State;
213
                else
214
                   if Enable = '1' then
215
                Treg     <= NextTreg;
216
                     TxParity <= NextTxParity;
217
                     DataCnt  <= NextDataCnt;
218
           tmpTRegE <= NextTRegE;
219
                     TxState  <= NextTxState;
220
                        else
221
                Treg     <= Treg;
222
                     TxParity <= TxParity;
223
                     DataCnt  <= DataCnt;
224
           tmpTRegE <= tmpTRegE;
225
                          TxState  <= TxState;
226
                        end if;
227
                end if;
228
         end if;
229
 
230
  end process;
231
 
232
end Behaviour; --=================== End of architecture ====================--

powered by: WebSVN 2.1.0

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