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

Subversion Repositories System68

[/] [System68/] [tags/] [arelease/] [vhdl/] [miniUART.vhd] - Blame information for rev 8

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 4 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 OCRP-1
9
--
10
-- File name      : miniuart.vhd
11
--
12
-- Purpose        : Implements an miniUART device for communication purposes 
13
--                  between the OR1K processor and the Host computer through
14
--                  an RS-232 communication protocol.
15
--                  
16
-- Library        : uart_lib.vhd
17
--
18
-- Dependencies   : IEEE.Std_Logic_1164
19
--
20
-- Simulator      : ModelSim PE/PLUS version 4.7b on a Windows95 PC
21
--===========================================================================--
22
-------------------------------------------------------------------------------
23
-- Revision list
24
-- Version   Author                 Date           Changes
25
--
26
-- 0.1      Ovidiu Lupas     15 January 2000       New model
27
-- 1.0      Ovidiu Lupas     January  2000         Synthesis optimizations
28
-- 2.0      Ovidiu Lupas     April    2000         Bugs removed - RSBusCtrl
29
--          the RSBusCtrl did not process all possible situations
30
--
31
--        olupas@opencores.org
32
--
33
-- 3.0      John Kent        October  2002         Changed Status bits to match mc6805
34
--          Added CTS, RTS, Baud rate control & Software Reset
35
-------------------------------------------------------------------------------
36
-- Entity for miniUART Unit - 9600 baudrate                                  --
37
-------------------------------------------------------------------------------
38
library ieee;
39
   use ieee.std_logic_1164.all;
40
   use ieee.numeric_std.all;
41
 
42
entity miniUART is
43
  port (
44
     SysClk   : in  Std_Logic;  -- System Clock
45
     rst      : in  Std_Logic;  -- Reset input (active high)
46
     cs       : in  Std_Logic;
47
     rw       : in  Std_Logic;
48
     RxD      : in  Std_Logic;
49
     TxD      : out Std_Logic;
50
     CTS_n    : in  Std_Logic;
51
     RTS_n    : out Std_Logic;
52
     Irq      : out Std_Logic;  -- interrupt
53
     Addr     : in  Std_Logic;  -- Register Select
54
     DataIn   : in  Std_Logic_Vector(7 downto 0); -- 
55
     DataOut  : out Std_Logic_Vector(7 downto 0)); -- 
56
end entity; --================== End of entity ==============================--
57
-------------------------------------------------------------------------------
58
-- Architecture for miniUART Controller Unit
59
-------------------------------------------------------------------------------
60
architecture uart of miniUART is
61
  -----------------------------------------------------------------------------
62
  -- Signals
63
  -----------------------------------------------------------------------------
64
  signal RxData : Std_Logic_Vector(7 downto 0); -- 
65
  signal TxData : Std_Logic_Vector(7 downto 0); -- 
66
  signal StatReg : Std_Logic_Vector(7 downto 0); -- status register
67
  signal CtrlReg : Std_Logic_Vector(7 downto 0); -- control register
68
  --             StatReg detailed 
69
  -----------+--------+--------+--------+--------+--------+--------+--------+
70
  --  Int    | PErr   | ORErr  | FErr   | CTS    | DCD    | TBufE  | DRdy   |
71
  -----------+--------+--------+--------+--------+--------+--------+--------+
72
  signal EnabRx : Std_Logic;  -- Enable RX unit
73
  signal EnabTx : Std_Logic;  -- Enable TX unit
74
  signal DRdy   : Std_Logic;  -- Receive Data ready
75
  signal TBufE  : Std_Logic;  -- Transmit buffer empty
76
  signal FErr   : Std_Logic;  -- Frame error
77
  signal OErr   : Std_Logic;  -- Output error
78
  signal Read   : Std_Logic;  -- Read receive buffer
79
  signal Load   : Std_Logic;  -- Load transmit buffer
80
  signal Int    : Std_Logic;  -- Interrupt bit
81
  signal Reset  : Std_Logic;  -- Reset (Software & Hardware)
82
  -----------------------------------------------------------------------------
83
  -- Baud rate Generator
84
  -----------------------------------------------------------------------------
85
  component ClkUnit is
86
   port (
87
     Clk      : in  Std_Logic;  -- System Clock
88
     Reset    : in  Std_Logic;  -- Reset input
89
     EnableRX : out Std_Logic;  -- Control signal
90
     EnableTX : out Std_Logic;  -- Control signal
91
          BaudRate : in  Std_Logic_Vector(1 downto 0));
92
  end component;
93
  -----------------------------------------------------------------------------
94
  -- Receive Unit
95
  -----------------------------------------------------------------------------
96
  component RxUnit is
97
  port (
98
     Clk    : in  Std_Logic;  -- Clock signal
99
     Reset  : in  Std_Logic;  -- Reset input
100
     Enable : in  Std_Logic;  -- Enable input
101
     RxD    : in  Std_Logic;  -- RS-232 data input
102
     ReadD  : in  Std_Logic;  -- Read data signal
103
     FRErr  : out Std_Logic;  -- Status signal
104
     ORErr  : out Std_Logic;  -- Status signal
105
     DARdy  : out Std_Logic;  -- Status signal
106
     DataI  : out Std_Logic_Vector(7 downto 0));
107
  end component;
108
  -----------------------------------------------------------------------------
109
  -- Transmitter Unit
110
  -----------------------------------------------------------------------------
111
  component TxUnit is
112
  port (
113
     Clk    : in  Std_Logic;  -- Clock signal
114
     Reset  : in  Std_Logic;  -- Reset input
115
     Enable : in  Std_Logic;  -- Enable input
116
     LoadD  : in  Std_Logic;  -- Load transmit data
117
     TxD    : out Std_Logic;  -- RS-232 data output
118
     TBE    : out Std_Logic;  -- Tx buffer empty
119
     DataO  : in  Std_Logic_Vector(7 downto 0));
120
  end component;
121
begin
122
  -----------------------------------------------------------------------------
123
  -- Instantiation of internal components
124
  -----------------------------------------------------------------------------
125
 
126
  ClkDiv  : ClkUnit port map (
127
                Clk      => SysClk,
128
                                         EnableRx => EnabRX,
129
                                         EnableTx => EnabTX,
130
                                         BaudRate => CtrlReg(1 downto 0),
131
                                         Reset    => Reset);
132
 
133
  TxDev   : TxUnit  port map (
134
                Clk      => SysClk,
135
                                         Reset    => Reset,
136
                                         Enable   => EnabTX,
137
                                         LoadD    => Load,
138
                                         TxD      => TxD,
139
                                         TBE      => TBufE,
140
                                         DataO    => TxData);
141
 
142
  RxDev   : RxUnit  port map (
143
                Clk      => SysClk,
144
                                         Reset    => Reset,
145
                                         Enable   => EnabRX,
146
                                         RxD      => RxD,
147
                                         ReadD    => Read,
148
                                         FRErr    => FErr,
149
                                         ORErr    => OErr,
150
                                         DARdy    => DRdy,
151
                                         DataI    => RxData);
152
 
153
  -----------------------------------------------------------------------------
154
  -- Implements the controller for Rx&Tx units
155
  -----------------------------------------------------------------------------
156
  RSBusCtrl : process(SysClk, Reset, DRdy, TBufE, FErr, OErr, Int, CtrlReg)
157
     variable StatM : Std_Logic_Vector(7 downto 0);
158
  begin
159
     if SysClk'event and SysClk='0' then
160
        if Reset = '1' then
161
           StatM := "00000000";
162
           Int <= '0';
163
        else
164
           StatM(0) := DRdy;
165
           StatM(1) := TBufE;
166
                          StatM(2) := '0'; -- DCD
167
                          StatM(3) := CTS_n;
168
           StatM(4) := FErr;
169
           StatM(5) := OErr;
170
           StatM(6) := '0'; -- Parrity error
171
                     StatM(7) := Int;
172
                     Int <= (CtrlReg(7) and DRdy) or
173
                           ((not CtrlReg(6)) and CtrlReg(5) and TBufE);
174
        end if;
175
 
176
                 RTS_n <= CtrlReg(6) and not CtrlReg(5);
177
       Irq <= Int;
178
       StatReg <= StatM;
179
     end if;
180
  end process;
181
 
182
-----------------------------------------------------------------------------
183
-- Combinational section
184
-----------------------------------------------------------------------------
185
 
186
control_strobe:  process(SysClk, Reset, cs, rw, Addr, DataIn, CtrlReg )
187
  begin
188
   if SysClk'event and SysClk='1' then
189
          if (reset = '1') then
190
            CtrlReg <= "00000000";
191
                 Load <= '0';
192
                 Read <= '0';
193
          else
194
            if cs = '1' then
195
              if Addr = '1' then
196
                     CtrlReg <= CtrlReg;
197
                     if rw = '0' then  -- write data register
198
                  Load <= '1';
199
                       Read <= '0';
200
                else               -- read Data Register
201
                  Load <= '0';
202
             Read <= '1';
203
                          end if; -- rw
204
              else                 -- read Status Register
205
                Load <= '0';
206
                     Read <= '0';
207
                     if rw = '0' then  -- write data register
208
                            CtrlReg <= DataIn;
209
                else               -- read Data Register
210
                       CtrlReg <= CtrlReg;
211
                          end if; -- rw
212
                   end if; -- Addr
213
            else                   -- not selected
214
              Load <= '0';
215
                   Read <= '0';
216
                        CtrlReg <= CtrlReg;
217
            end if;  -- cs
218
          end if; -- reset
219
   end if; -- SysClk
220
end process;
221
 
222
---------------------------------------------------------------
223
--
224
-- set data output mux
225
--
226
--------------------------------------------------------------
227
 
228
data_port: process(Addr, StatReg, RxData, DataIn )
229
begin
230
     TxData <= DataIn;
231
          if Addr = '1' then
232
                 DataOut <= RxData;  -- read data register
233
          else
234
                 DataOut <= StatReg;   -- read status register
235
          end if; -- Addr
236
end process;
237
 
238
---------------------------------------------------------------
239
--
240
-- reset may be hardware or software
241
--
242
---------------------------------------------------------------
243
 
244
uart_reset: process(CtrlReg, rst )
245
begin
246
          Reset <= (CtrlReg(1) and CtrlReg(0)) or rst;
247
end process;
248
 
249
end uart; --===================== End of architecture =======================--
250
 

powered by: WebSVN 2.1.0

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