]> rtime.felk.cvut.cz Git - fpga/virtex2/uart.git/blob - openMSP430_uart.vhd
27c4acccb0029cf81c43036a0dcf00cc5755db15
[fpga/virtex2/uart.git] / openMSP430_uart.vhd
1 library IEEE;
2 use IEEE.STD_LOGIC_1164.ALL;
3 use IEEE.STD_LOGIC_ARITH.ALL;
4 use IEEE.STD_LOGIC_UNSIGNED.ALL;
5
6 entity openMSP430_uart is
7   port (
8     CLK_24MHz: in std_logic;
9     RESET: in std_logic;
10
11     RXD : out std_logic;
12     TXD : in std_logic;
13     
14     ROT_FEED : out std_logic;
15     ROT_A : in std_logic;
16     ROT_B : in std_logic;
17     ROT_PRESS : in std_logic
18   );
19 end openMSP430_uart;
20
21 --------------------------------------------------------------------------------
22
23 architecture rtl of openMSP430_uart is
24   component openMSP430 is
25     port(  
26       aclk_en       :  out std_logic;                        -- ACLK enable
27       dbg_freeze    :  out std_logic;                        -- Freeze peripherals
28       dbg_uart_txd  :  out std_logic;                        -- Debug interface: UART TXD
29       dmem_addr     :  out std_logic_vector (8  downto 0);   -- Data Memory address
30       dmem_cen      :  out std_logic;                        -- Data Memory chip enable (low active)
31       dmem_din      :  out std_logic_vector (15 downto 0);   -- Data Memory data input
32       dmem_wen      :  out std_logic_vector (1  downto 0);   -- Data Memory write enable (low active)
33       irq_acc       :  out std_logic_vector (13 downto 0);   -- Interrupt request accepted (one-hot signal)
34       mclk          :  out std_logic;                        -- Main system clock
35       per_addr      :  out std_logic_vector (7  downto 0);   -- Peripheral address
36       per_din       :  out std_logic_vector (15 downto 0);   -- Peripheral data input
37       per_wen       :  out std_logic_vector (1  downto 0);   -- Peripheral write enable (high active)
38       per_en        :  out std_logic;                        -- Peripheral enable (high active)
39       pmem_addr     :  out std_logic_vector (10 downto 0);   -- Program Memory address
40       pmem_cen      :  out std_logic;                        -- Program Memory chip enable (low active)
41       pmem_din      :  out std_logic_vector (15 downto 0);   -- Program Memory data input (optional)
42       pmem_wen      :  out std_logic_vector (1  downto 0);   -- Program Memory write enable (low active) (optional)
43       puc           :  out std_logic;                        -- Main system reset
44       smclk_en      :  out std_logic;                        -- SMCLK enable
45
46       dbg_uart_rxd  :  in  std_logic;                        -- Debug interface: UART RXD
47       dco_clk       :  in  std_logic;                        -- Fast oscillator (fast clock)
48       dmem_dout     :  in  std_logic_vector (15 downto 0);   -- Data Memory data output
49       irq           :  in  std_logic_vector (13 downto 0);   -- Maskable interrupts
50       lfxt_clk      :  in  std_logic;                        -- Low frequency oscillator (typ 32kHz)
51       nmi           :  in  std_logic;                        -- Non-maskable interrupt (asynchronous)
52       per_dout      :  in  std_logic_vector (15 downto 0);   -- Peripheral data output
53       pmem_dout     :  in  std_logic_vector (15 downto 0);   -- Program Memory data output
54       reset_n       :  in  std_logic                         -- Reset Pin (low active)
55     );
56   end component;
57
58   component ram_8x512
59     port (
60       addr: in std_logic_VECTOR(8 downto 0);
61       clk: in std_logic;
62       din: in std_logic_VECTOR(7 downto 0);
63       dout: out std_logic_VECTOR(7 downto 0);
64       en: in std_logic;
65       we: in std_logic
66     );
67   end component;
68   
69   component rom_8x2k
70     port (
71       addr: in std_logic_VECTOR(10 downto 0);
72       clk: in std_logic;
73       din: in std_logic_VECTOR(7 downto 0);
74       dout: out std_logic_VECTOR(7 downto 0);
75       en: in std_logic;
76       we: in std_logic
77     );
78   end component;
79
80   component omsp_quadcount is
81     generic (
82       ADDR : std_logic_vector (15 downto 0));
83     port (
84       mclk     : in  std_logic;
85       puc      : in  std_logic;
86       per_addr : in  std_logic_vector (7 downto 0);
87       per_en   : in  std_logic;
88       per_irq  : out std_logic;
89       per_dout : out std_logic_vector (15 downto 0);
90       qclk     : in  std_logic;
91       qreset   : in  std_logic;
92       a0, b0   : in  std_logic;
93       qcount   : out std_logic_vector (31 downto 0));
94   end component omsp_quadcount;
95   
96   component uart is
97     port (
98       mclk        : in  std_logic;
99       per_addr    : in  std_logic_vector (7 downto 0);
100       per_din     : in  std_logic_vector (15 downto 0);
101       per_en      : in  std_logic;
102       per_wen     : in  std_logic_vector (1 downto 0);
103       puc         : in  std_logic;
104       per_irq_acc : in  std_logic;
105       per_irq     : out std_logic;
106       per_dout    : out std_logic_vector (15 downto 0);
107
108       rxd         : in  std_logic;
109       txd         : out std_logic
110     );
111   end component;
112
113
114   signal mclk : std_logic;
115   signal puc : std_logic;
116   signal aclk_en : std_logic;
117   signal smclk_en : std_logic;
118   
119   signal irq_acc : std_logic_vector (13 downto 0);
120   signal irq : std_logic_vector (13 downto 0);
121
122   signal pmem_addr : std_logic_vector (10 downto 0);
123   signal pmem_dout : std_logic_vector (15 downto 0);
124   signal pmem_cen   : std_logic;
125
126   signal dmem_addr : std_logic_vector (8 downto 0);
127   signal dmem_cen  : std_logic;
128   signal dmem_wen  : std_logic_vector (1  downto 0);
129   signal dmem_din  : std_logic_vector (15 downto 0);
130   signal dmem_dout : std_logic_vector (15 downto 0);
131   
132   signal per_din : std_logic_vector (15 downto 0);
133   signal per_dout : std_logic_Vector (15 downto 0);
134   signal per_wen : std_logic_vector (1 downto 0);
135   signal per_en : std_logic;
136   signal per_addr : std_logic_vector (7 downto 0);
137
138
139   signal omsp_quadcount_dout : std_logic_vector (15 downto 0);
140   signal omsp_quadcount_irq  : std_logic;
141
142   signal uart_dout : std_logic_vector (15 downto 0);
143   signal uart_irq  : std_logic;
144
145
146 --------------------------------------------------------------------------------
147
148 begin
149   openMSP430_0 : openMSP430 port map (
150     aclk_en       => aclk_en,
151     dbg_freeze    => open,
152     dbg_uart_txd  => open,
153     dmem_addr     => dmem_addr,
154     dmem_cen      => dmem_cen,
155     dmem_din      => dmem_din,
156     dmem_wen      => dmem_wen,
157     irq_acc       => irq_acc,
158     mclk          => mclk,
159     per_addr      => per_addr,
160     per_din       => per_din,
161     per_wen       => per_wen,
162     per_en        => per_en,
163     pmem_addr     => pmem_addr,
164     pmem_cen      => pmem_cen,
165     pmem_din      => open,
166     pmem_wen      => open,
167     puc           => puc,
168     smclk_en      => smclk_en,
169   
170     dbg_uart_rxd  => '0',
171     dco_clk       => CLK_24MHz,
172     dmem_dout     => dmem_dout,
173     irq           => irq,
174     lfxt_clk      => '0',
175     nmi           => '0',
176     per_dout      => per_dout,
177     pmem_dout     => pmem_dout,
178     reset_n       => RESET
179   );
180
181   ram_8x512_hi : ram_8x512 port map (
182     addr => dmem_addr,
183     clk => mclk,
184     din => dmem_din (15 downto 8),
185     dout => dmem_dout (15 downto 8),
186     en => dmem_cen,
187     we => dmem_wen (1)
188   );
189   
190   ram_8x512_lo : ram_8x512 port map (
191     addr => dmem_addr,
192     clk => mclk,
193     din => dmem_din (7 downto 0),
194     dout => dmem_dout (7 downto 0),
195     en => dmem_cen,
196     we => dmem_wen (0)
197   );
198   
199   rom_8x2k_hi : rom_8x2k port map (
200     addr => pmem_addr,
201     clk => mclk,
202     din => (others => '0'),
203     dout => pmem_dout (15 downto 8),
204     en => pmem_cen,
205     we => '1'
206   );
207       
208   rom_8x2k_lo : rom_8x2k port map (
209     addr => pmem_addr,
210     clk => mclk,
211     din => (others => '0'),
212     dout => pmem_dout (7 downto 0),
213     en => pmem_cen,
214     we => '1'
215   );
216
217   omsp_quadcount_1: omsp_quadcount
218     generic map (
219       ADDR => X"0150")
220     port map (
221       mclk     => mclk,
222       puc      => puc,
223       per_addr => per_addr,
224       per_en   => per_en,
225       per_irq  => omsp_quadcount_irq,
226       per_dout => omsp_quadcount_dout,
227       qclk     => mclk,
228       qreset   => ROT_PRESS,
229       a0       => ROT_A,
230       b0       => ROT_B,
231       qcount   => open
232   );
233
234   uart_o : uart port map (
235     mclk        => mclk,
236     per_addr    => per_addr,
237     per_din     => per_din,
238     per_en      => per_en,
239     per_wen     => per_wen,
240     puc         => puc,
241     per_irq_acc => '0',
242     per_irq     => uart_irq,
243     per_dout    => uart_dout,
244
245     rxd         => TXD,
246     txd         => RXD
247   );
248
249
250 --------------------------------------------------------------------------------
251
252   per_dout <= uart_dout or omsp_quadcount_dout;
253   
254   irq <= (6 => uart_irq,
255           7 => omsp_quadcount_irq,
256           others => '0');
257   
258   ROT_FEED <= '1';
259   
260 end rtl;
261