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

Subversion Repositories z80control

[/] [z80control/] [trunk/] [DE1/] [rtl/] [VHDL/] [uart/] [miniUART.vhd] - Blame information for rev 12

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 12 tylerapohl
--===========================================================================--
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
-- Description    : The memory consists of a dual-port memory addressed by
34
--                  two counters (RdCnt & WrCnt). The third counter (StatCnt)
35
--                  sets the status signals and keeps a track of the data flow.
36
-------------------------------------------------------------------------------
37
-- Entity for miniUART Unit - 9600 baudrate                                  --
38
-------------------------------------------------------------------------------
39
library ieee;
40
   use ieee.std_logic_1164.all;
41
   use ieee.numeric_std.all;
42
library work;
43
   use work.UART_Def.all;
44
 
45
entity miniUART is
46
  port (
47
     SysClk   : in  Std_Logic;  -- System Clock
48
     Reset    : in  Std_Logic;  -- Reset input
49
     CS_N     : in  Std_Logic;
50
     RD_N     : in  Std_Logic;
51
     WR_N     : in  Std_Logic;
52
     RxD      : in  Std_Logic;
53
     TxD      : out Std_Logic;
54
     IntRx_N  : out Std_Logic;  -- Receive interrupt
55
     IntTx_N  : out Std_Logic;  -- Transmit interrupt
56
     Addr     : in  Std_Logic_Vector(1 downto 0); -- 
57
     DataIn   : in  Std_Logic_Vector(7 downto 0); -- 
58
     DataOut  : out Std_Logic_Vector(7 downto 0)); -- 
59
end entity; --================== End of entity ==============================--
60
-------------------------------------------------------------------------------
61
-- Architecture for miniUART Controller Unit
62
-------------------------------------------------------------------------------
63
architecture uart of miniUART is
64
  -----------------------------------------------------------------------------
65
  -- Signals
66
  -----------------------------------------------------------------------------
67
  signal RxData : Std_Logic_Vector(7 downto 0); -- 
68
  signal TxData : Std_Logic_Vector(7 downto 0); -- 
69
  signal CSReg  : Std_Logic_Vector(7 downto 0); -- Ctrl & status register
70
  --             CSReg detailed 
71
  -----------+--------+--------+--------+--------+--------+--------+--------+
72
  -- CSReg(7)|CSReg(6)|CSReg(5)|CSReg(4)|CSReg(3)|CSReg(2)|CSReg(1)|CSReg(0)|
73
  --   Res   |  Res   |  Res   |  Res   | UndRun | OvrRun |  FErr  |  OErr  |
74
  -----------+--------+--------+--------+--------+--------+--------+--------+
75
  signal EnabRx : Std_Logic;  -- Enable RX unit
76
  signal EnabTx : Std_Logic;  -- Enable TX unit
77
  signal DRdy   : Std_Logic;  -- Receive Data ready
78
  signal TRegE  : Std_Logic;  -- Transmit register empty
79
  signal TBufE  : Std_Logic;  -- Transmit buffer empty
80
  signal FErr   : Std_Logic;  -- Frame error
81
  signal OErr   : Std_Logic;  -- Output error
82
  signal Read   : Std_Logic;  -- Read receive buffer
83
  signal Load   : Std_Logic;  -- Load transmit buffer
84
  -----------------------------------------------------------------------------
85
  -- Baud rate Generator
86
  -----------------------------------------------------------------------------
87
  component ClkUnit is
88
   port (
89
     SysClk   : in  Std_Logic;  -- System Clock
90
     EnableRX : out Std_Logic;  -- Control signal
91
     EnableTX : out Std_Logic;  -- Control signal
92
     Reset    : in  Std_Logic); -- Reset input
93
  end component;
94
  -----------------------------------------------------------------------------
95
  -- Receive Unit
96
  -----------------------------------------------------------------------------
97
  component RxUnit is
98
  port (
99
     Clk    : in  Std_Logic;  -- Clock signal
100
     Reset  : in  Std_Logic;  -- Reset input
101
     Enable : in  Std_Logic;  -- Enable input
102
     RxD    : in  Std_Logic;  -- RS-232 data input
103
     RD     : in  Std_Logic;  -- Read data signal
104
     FErr   : out Std_Logic;  -- Status signal
105
     OErr   : out Std_Logic;  -- Status signal
106
     DRdy   : out Std_Logic;  -- Status signal
107
     DataIn : out Std_Logic_Vector(7 downto 0));
108
  end component;
109
  -----------------------------------------------------------------------------
110
  -- Transmitter Unit
111
  -----------------------------------------------------------------------------
112
  component TxUnit is
113
  port (
114
     Clk    : in  Std_Logic;  -- Clock signal
115
     Reset  : in  Std_Logic;  -- Reset input
116
     Enable : in  Std_Logic;  -- Enable input
117
     Load   : in  Std_Logic;  -- Load transmit data
118
     TxD    : out Std_Logic;  -- RS-232 data output
119
     TRegE  : out Std_Logic;  -- Tx register empty
120
     TBufE  : out Std_Logic;  -- Tx buffer empty
121
     DataO  : in  Std_Logic_Vector(7 downto 0));
122
  end component;
123
begin
124
  -----------------------------------------------------------------------------
125
  -- Instantiation of internal components
126
  -----------------------------------------------------------------------------
127
  ClkDiv  : ClkUnit port map (SysClk,EnabRX,EnabTX,Reset);
128
  TxDev   : TxUnit port map (SysClk,Reset,EnabTX,Load,TxD,TRegE,TBufE,TxData);
129
  RxDev   : RxUnit port map (SysClk,Reset,EnabRX,RxD,Read,FErr,OErr,DRdy,RxData);
130
 
131
  --IntRx_N <= DRdy;
132
  --IntTx_N <= TBufE;
133
  -----------------------------------------------------------------------------
134
  -- Implements the controller for Rx&Tx units
135
  -----------------------------------------------------------------------------
136
  RSBusCtrl : process(SysClk,Reset,Read,Load)
137
     variable StatM : Std_Logic_Vector(4 downto 0);
138
  begin
139
     if Rising_Edge(SysClk) then
140
        if Reset = '0' then
141
           StatM := "00000";
142
           --IntTx_N <= '0';
143
           --IntRx_N <= '0';
144
           CSReg <= "11110000";
145
        else
146
           StatM(0) := DRdy;
147
           StatM(1) := FErr;
148
           StatM(2) := OErr;
149
           StatM(3) := TBufE;
150
           StatM(4) := TRegE;
151
        end if;
152
        --case StatM is
153
             --when "00001" =>
154
             --     IntRx_N <= '1';
155
             --     CSReg(2) <= '1';
156
             --when "10001" =>
157
             --     IntRx_N <= '1';
158
             --     CSReg(2) <= '1';
159
             --when "01000" =>
160
             --     IntTx_N <= '1';
161
             --when "10000" =>
162
             --     IntTx_N <= '1';
163
             --     CSReg(3) <= '1';
164
             --when others => null;
165
        --end case;
166
 
167
                IntRx_N <= DRdy;
168
                IntTx_N <= TRegE;
169
 
170
        --if Read = '1' then
171
        --   CSReg(2) <= '0';
172
        --   IntRx_N <= '0';
173
        --end if;
174
 
175
        --if Load = '1' then
176
        --   CSReg(3) <= '0';
177
        --   IntTx_N <= '0';
178
        --end if;
179
     end if;
180
  end process;
181
  -----------------------------------------------------------------------------
182
  -- Combinational section
183
  -----------------------------------------------------------------------------
184
  process(SysClk)
185
  begin
186
     if (CS_N = '0' and RD_N = '0') then
187
        Read <= '1';
188
     else Read <= '0';
189
     end if;
190
 
191
     if (CS_N = '0' and WR_N = '0') then
192
        Load <= '1';
193
     else Load <= '0';
194
     end if;
195
 
196
     if Read = '0' then
197
        DataOut <= "ZZZZZZZZ";
198
     elsif (Read = '1' and Addr = "00") then
199
        DataOut <= RxData;
200
     elsif (Read = '1' and Addr = "01") then
201
        DataOut <= CSReg;
202
     end if;
203
 
204
     if Load = '0' then
205
        TxData <= "ZZZZZZZZ";
206
     elsif (Load = '1' and Addr = "00") then
207
        TxData <= DataIn;
208
     end if;
209
  end process;
210
end uart; --===================== End of architecture =======================--

powered by: WebSVN 2.1.0

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