]> rtime.felk.cvut.cz Git - fpga/virtex2/uart.git/blob - openMSP430_uart.vhd
b6e3eceae7e709a5640399e47d2976b297d2245e
[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 end openMSP430_uart;
15
16 --------------------------------------------------------------------------------
17
18 architecture rtl of openMSP430_uart is
19   component openMSP430 is
20     port(  
21       aclk_en       :  out std_logic;                        -- ACLK enable
22       dbg_freeze    :  out std_logic;                        -- Freeze peripherals
23       dbg_uart_txd  :  out std_logic;                        -- Debug interface: UART TXD
24       dmem_addr     :  out std_logic_vector (8  downto 0);   -- Data Memory address
25       dmem_cen      :  out std_logic;                        -- Data Memory chip enable (low active)
26       dmem_din      :  out std_logic_vector (15 downto 0);   -- Data Memory data input
27       dmem_wen      :  out std_logic_vector (1  downto 0);   -- Data Memory write enable (low active)
28       irq_acc       :  out std_logic_vector (13 downto 0);   -- Interrupt request accepted (one-hot signal)
29       mclk          :  out std_logic;                        -- Main system clock
30       per_addr      :  out std_logic_vector (7  downto 0);   -- Peripheral address
31       per_din       :  out std_logic_vector (15 downto 0);   -- Peripheral data input
32       per_wen       :  out std_logic_vector (1  downto 0);   -- Peripheral write enable (high active)
33       per_en        :  out std_logic;                        -- Peripheral enable (high active)
34       pmem_addr     :  out std_logic_vector (10 downto 0);   -- Program Memory address
35       pmem_cen      :  out std_logic;                        -- Program Memory chip enable (low active)
36       pmem_din      :  out std_logic_vector (15 downto 0);   -- Program Memory data input (optional)
37       pmem_wen      :  out std_logic_vector (1  downto 0);   -- Program Memory write enable (low active) (optional)
38       puc           :  out std_logic;                        -- Main system reset
39       smclk_en      :  out std_logic;                        -- SMCLK enable
40
41       dbg_uart_rxd  :  in  std_logic;                        -- Debug interface: UART RXD
42       dco_clk       :  in  std_logic;                        -- Fast oscillator (fast clock)
43       dmem_dout     :  in  std_logic_vector (15 downto 0);   -- Data Memory data output
44       irq           :  in  std_logic_vector (13 downto 0);   -- Maskable interrupts
45       lfxt_clk      :  in  std_logic;                        -- Low frequency oscillator (typ 32kHz)
46       nmi           :  in  std_logic;                        -- Non-maskable interrupt (asynchronous)
47       per_dout      :  in  std_logic_vector (15 downto 0);   -- Peripheral data output
48       pmem_dout     :  in  std_logic_vector (15 downto 0);   -- Program Memory data output
49       reset_n       :  in  std_logic                         -- Reset Pin (low active)
50     );
51   end component;
52
53   component ram_8x512
54     port (
55       addr: in std_logic_VECTOR(8 downto 0);
56       clk: in std_logic;
57       din: in std_logic_VECTOR(7 downto 0);
58       dout: out std_logic_VECTOR(7 downto 0);
59       en: in std_logic;
60       we: in std_logic
61     );
62   end component;
63   
64   component rom_8x2k
65     port (
66       addr: in std_logic_VECTOR(10 downto 0);
67       clk: in std_logic;
68       din: in std_logic_VECTOR(7 downto 0);
69       dout: out std_logic_VECTOR(7 downto 0);
70       en: in std_logic;
71       we: in std_logic
72     );
73   end component;
74
75
76   component omsp_gpio
77     generic (
78       P1_EN : std_logic;
79       P2_EN : std_logic;
80       P3_EN : std_logic;
81       P4_EN : std_logic;
82       P5_EN : std_logic;
83       P6_EN : std_logic
84     );
85     port(
86       mclk : in std_logic;
87       p1_din : in std_logic_vector(7 downto 0);
88       p2_din : in std_logic_vector(7 downto 0);
89       p3_din : in std_logic_vector(7 downto 0);
90       p4_din : in std_logic_vector(7 downto 0);
91       p5_din : in std_logic_vector(7 downto 0);
92       p6_din : in std_logic_vector(7 downto 0);
93       per_addr : in std_logic_vector(7 downto 0);
94       per_din : in std_logic_vector(15 downto 0);
95       per_en : in std_logic;
96       per_wen : in std_logic_vector(1 downto 0);
97       puc : in std_logic;          
98       irq_port1 : out std_logic;
99       irq_port2 : out std_logic;
100       p1_dout : out std_logic_vector(7 downto 0);
101       p1_dout_en : out std_logic_vector(7 downto 0);
102       p1_sel : out std_logic_vector(7 downto 0);
103       p2_dout : out std_logic_vector(7 downto 0);
104       p2_dout_en : out std_logic_vector(7 downto 0);
105       p2_sel : out std_logic_vector(7 downto 0);
106       p3_dout : out std_logic_vector(7 downto 0);
107       p3_dout_en : out std_logic_vector(7 downto 0);
108       p3_sel : out std_logic_vector(7 downto 0);
109       p4_dout : out std_logic_vector(7 downto 0);
110       p4_dout_en : out std_logic_vector(7 downto 0);
111       p4_sel : out std_logic_vector(7 downto 0);
112       p5_dout : out std_logic_vector(7 downto 0);
113       p5_dout_en : out std_logic_vector(7 downto 0);
114       p5_sel : out std_logic_vector(7 downto 0);
115       p6_dout : out std_logic_vector(7 downto 0);
116       p6_dout_en : out std_logic_vector(7 downto 0);
117       p6_sel : out std_logic_vector(7 downto 0);
118       per_dout : out std_logic_vector(15 downto 0)
119     );
120   end component;
121
122   component omsp_timerA
123     port (
124       irq_ta0     : out std_logic;      -- Timer A interrupt: TACCR0
125       irq_ta1     : out std_logic;                       -- Timer A interrupt: TAIV, TACCR1, TACCR2
126       per_dout    : out std_logic_vector (15 downto 0);  -- Peripheral data output
127       ta_out0     : out std_logic;                       -- Timer A output 0
128       ta_out0_en  : out std_logic;      -- Timer A output 0 enable
129       ta_out1     : out std_logic;      -- Timer A output 1
130       ta_out1_en  : out std_logic;      -- Timer A output 1 enable
131       ta_out2     : out std_logic;      -- Timer A output 2
132       ta_out2_en  : out std_logic;      -- Timer A output 2 enable
133
134       aclk_en     : in std_logic;       -- ACLK enable (from CPU)
135       dbg_freeze  : in std_logic;       -- Freeze Timer A counter
136       inclk       : in std_logic;       -- INCLK external timer clock (SLOW)
137       irq_ta0_acc : in std_logic;       -- Interrupt request TACCR0 accepted
138       mclk        : in std_logic;                        -- Main system clock
139       per_addr    : in std_logic_vector (7  downto 0);   -- Peripheral address
140       per_din     : in std_logic_Vector (15 downto 0);   -- Peripheral data input
141       per_en      : in std_logic;                        -- Peripheral enable (high active)
142       per_wen     : in std_logic_vector (1  downto 0);   -- Peripheral write enable (high active)
143       puc         : in std_logic;                        -- Main system reset
144       smclk_en    : in std_logic;       -- SMCLK enable (from CPU)
145       ta_cci0a    : in std_logic;       -- Timer A capture 0 input A
146       ta_cci0b    : in std_logic;       -- Timer A capture 0 input B
147       ta_cci1a    : in std_logic;       -- Timer A capture 1 input A
148       ta_cci1b    : in std_logic;       -- Timer A capture 1 input B
149       ta_cci2a    : in std_logic;       -- Timer A capture 2 input A
150       ta_cci2b    : in std_logic;       -- Timer A capture 2 input B
151       taclk       : in std_logic        -- TACLK external timer clock (SLOW)
152     );
153   end component;
154
155
156   signal mclk : std_logic;
157   signal puc : std_logic;
158   signal aclk_en : std_logic;
159   signal smclk_en : std_logic;
160   
161   signal irq_acc : std_logic_vector (13 downto 0);
162   signal irq : std_logic_vector (13 downto 0);
163
164   signal pmem_addr : std_logic_vector (10 downto 0);
165   signal pmem_dout : std_logic_vector (15 downto 0);
166   signal pmem_cen   : std_logic;
167
168   signal dmem_addr : std_logic_vector (8 downto 0);
169   signal dmem_cen  : std_logic;
170   signal dmem_wen  : std_logic_vector (1  downto 0);
171   signal dmem_din  : std_logic_vector (15 downto 0);
172   signal dmem_dout : std_logic_vector (15 downto 0);
173   
174   signal per_din : std_logic_vector (15 downto 0);
175   signal per_dout : std_logic_Vector (15 downto 0);
176   signal per_wen : std_logic_vector (1 downto 0);
177   signal per_en : std_logic;
178   signal per_addr : std_logic_vector (7 downto 0);
179
180
181   signal gpio_per_dout : std_logic_vector (15 downto 0);
182   signal timerA_per_dout : std_logic_vector (15 downto 0);
183
184   signal irq_ta0 : std_logic;
185   signal irq_ta1 : std_logic;
186
187 --------------------------------------------------------------------------------
188
189 begin
190   openMSP430_0 : openMSP430 port map (
191     aclk_en       => aclk_en,
192     dbg_freeze    => open,
193     dbg_uart_txd  => open,
194     dmem_addr     => dmem_addr,
195     dmem_cen      => dmem_cen,
196     dmem_din      => dmem_din,
197     dmem_wen      => dmem_wen,
198     irq_acc       => irq_acc,
199     mclk          => mclk,
200     per_addr      => per_addr,
201     per_din       => per_din,
202     per_wen       => per_wen,
203     per_en        => per_en,
204     pmem_addr     => pmem_addr,
205     pmem_cen      => pmem_cen,
206     pmem_din      => open,
207     pmem_wen      => open,
208     puc           => puc,
209     smclk_en      => smclk_en,
210   
211     dbg_uart_rxd  => '0',
212     dco_clk       => CLK_24MHz,
213     dmem_dout     => dmem_dout,
214     irq           => irq,
215     lfxt_clk      => '0',
216     nmi           => '0',
217     per_dout      => per_dout,
218     pmem_dout     => pmem_dout,
219     reset_n       => RESET
220   );
221
222   ram_8x512_hi : ram_8x512 port map (
223     addr => dmem_addr,
224     clk => mclk,
225     din => dmem_din (15 downto 8),
226     dout => dmem_dout (15 downto 8),
227     en => dmem_cen,
228     we => dmem_wen (1)
229   );
230   
231   ram_8x512_lo : ram_8x512 port map (
232     addr => dmem_addr,
233     clk => mclk,
234     din => dmem_din (7 downto 0),
235     dout => dmem_dout (7 downto 0),
236     en => dmem_cen,
237     we => dmem_wen (0)
238   );
239   
240   rom_8x2k_hi : rom_8x2k port map (
241     addr => pmem_addr,
242     clk => mclk,
243     din => (others => '0'),
244     dout => pmem_dout (15 downto 8),
245     en => pmem_cen,
246     we => '1'
247   );
248       
249   rom_8x2k_lo : rom_8x2k port map (
250     addr => pmem_addr,
251     clk => mclk,
252     din => (others => '0'),
253     dout => pmem_dout (7 downto 0),
254     en => pmem_cen,
255     we => '1'
256   );
257
258
259   omsp_gpio_0 : omsp_gpio
260     generic map (
261       P1_EN => '1',  -- Enable Port 1
262       P2_EN => '1',  -- Enable Port 2
263       P3_EN => '0',  -- Enable Port 3
264       P4_EN => '0',  -- Enable Port 4
265       P5_EN => '0',  -- Enable Port 5
266       P6_EN => '0'   -- Enable Port 6
267     )
268     port map (
269       irq_port1 => open,
270       irq_port2 => open,
271       p1_dout (7 downto 2) => open,
272       p1_dout (1) => RXD,
273       p1_dout (0) => open,
274       p1_dout_en => open,
275       p1_sel => open,
276       p2_dout => open,
277       p2_dout_en => open,
278       p2_sel => open,
279       p3_dout => open,
280       p3_dout_en => open,
281       p3_sel => open,
282       p4_dout => open,
283       p4_dout_en => open,
284       p4_sel => open,
285       p5_dout => open,
286       p5_dout_en => open,
287       p5_sel => open,
288       p6_dout => open,
289       p6_dout_en => open,
290       p6_sel => open,
291       per_dout => gpio_per_dout,
292       mclk => mclk,
293       p1_din => (others => '0'),
294       p2_din => (others => '0'),
295       p3_din => (others => '0'),
296       p4_din => (others => '0'),
297       p5_din => (others => '0'),
298       p6_din => (others => '0'),
299       per_addr => per_addr,
300       per_din => per_din,
301       per_en => per_en,
302       per_wen => per_wen,
303       puc => puc
304     );
305
306   omsp_timerA_0 : omsp_timerA port map (
307     irq_ta0     => irq_ta0,
308     irq_ta1     => irq_ta1,
309     per_dout    => timerA_per_dout,
310     ta_out0     => open,
311     ta_out0_en  => open,
312     ta_out1     => open,
313     ta_out1_en  => open,
314     ta_out2     => open,
315     ta_out2_en  => open,
316
317     aclk_en     => aclk_en,
318     dbg_freeze  => '0',
319     inclk       => '0',
320     irq_ta0_acc => irq_acc (9),
321     mclk        => mclk,
322     per_addr    => per_addr,
323     per_din     => per_din,
324     per_en      => per_en,
325     per_wen     => per_wen,
326     puc         => puc,
327     smclk_en    => smclk_en,
328     ta_cci0a    => '0',
329     ta_cci0b    => TXD,
330     ta_cci1a    => '0',
331     ta_cci1b    => '0',
332     ta_cci2a    => '0',
333     ta_cci2b    => '0',
334     taclk       => '0'
335   );
336
337 --------------------------------------------------------------------------------
338
339   per_dout <=  gpio_per_dout or timerA_per_dout;
340   
341   irq <= (9 => irq_ta0,
342           8 => irq_ta1,
343           others => '0');
344   
345 end rtl;
346