]> rtime.felk.cvut.cz Git - fpga/virtex2/uart.git/blob - openMSP430_uart.vhd
cbcd0ef237ccd422b141c780fd23f8a9cd9dea9b
[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   component omsp_quadcount is
156     port (
157       mclk        : in  std_logic;
158       per_addr    : in  std_logic_vector (7  downto 0);
159       per_din     : in  std_logic_vector (15 downto 0);  -- unused
160       per_en      : in  std_logic;
161       per_wen     : in  std_logic_vector (1  downto 0);  -- unused
162       puc         : in  std_logic;                       -- unused
163       per_irq_acc : in  std_logic;                       -- unused
164       per_irq     : out std_logic;                       -- unused
165       per_dout    : out std_logic_vector (15 downto 0);
166       
167       qcount      : in  std_logic_vector (31 downto 0)
168     );
169   end component;
170
171
172   signal mclk : std_logic;
173   signal puc : std_logic;
174   signal aclk_en : std_logic;
175   signal smclk_en : std_logic;
176   
177   signal irq_acc : std_logic_vector (13 downto 0);
178   signal irq : std_logic_vector (13 downto 0);
179
180   signal pmem_addr : std_logic_vector (10 downto 0);
181   signal pmem_dout : std_logic_vector (15 downto 0);
182   signal pmem_cen   : std_logic;
183
184   signal dmem_addr : std_logic_vector (8 downto 0);
185   signal dmem_cen  : std_logic;
186   signal dmem_wen  : std_logic_vector (1  downto 0);
187   signal dmem_din  : std_logic_vector (15 downto 0);
188   signal dmem_dout : std_logic_vector (15 downto 0);
189   
190   signal per_din : std_logic_vector (15 downto 0);
191   signal per_dout : std_logic_Vector (15 downto 0);
192   signal per_wen : std_logic_vector (1 downto 0);
193   signal per_en : std_logic;
194   signal per_addr : std_logic_vector (7 downto 0);
195
196
197   signal gpio_per_dout : std_logic_vector (15 downto 0);
198   signal timerA_per_dout : std_logic_vector (15 downto 0);
199   signal omsp_quadcount_dout : std_logic_vector (15 downto 0);
200
201   signal irq_ta0 : std_logic;
202   signal irq_ta1 : std_logic;
203
204 --------------------------------------------------------------------------------
205
206 begin
207   openMSP430_0 : openMSP430 port map (
208     aclk_en       => aclk_en,
209     dbg_freeze    => open,
210     dbg_uart_txd  => open,
211     dmem_addr     => dmem_addr,
212     dmem_cen      => dmem_cen,
213     dmem_din      => dmem_din,
214     dmem_wen      => dmem_wen,
215     irq_acc       => irq_acc,
216     mclk          => mclk,
217     per_addr      => per_addr,
218     per_din       => per_din,
219     per_wen       => per_wen,
220     per_en        => per_en,
221     pmem_addr     => pmem_addr,
222     pmem_cen      => pmem_cen,
223     pmem_din      => open,
224     pmem_wen      => open,
225     puc           => puc,
226     smclk_en      => smclk_en,
227   
228     dbg_uart_rxd  => '0',
229     dco_clk       => CLK_24MHz,
230     dmem_dout     => dmem_dout,
231     irq           => irq,
232     lfxt_clk      => '0',
233     nmi           => '0',
234     per_dout      => per_dout,
235     pmem_dout     => pmem_dout,
236     reset_n       => RESET
237   );
238
239   ram_8x512_hi : ram_8x512 port map (
240     addr => dmem_addr,
241     clk => mclk,
242     din => dmem_din (15 downto 8),
243     dout => dmem_dout (15 downto 8),
244     en => dmem_cen,
245     we => dmem_wen (1)
246   );
247   
248   ram_8x512_lo : ram_8x512 port map (
249     addr => dmem_addr,
250     clk => mclk,
251     din => dmem_din (7 downto 0),
252     dout => dmem_dout (7 downto 0),
253     en => dmem_cen,
254     we => dmem_wen (0)
255   );
256   
257   rom_8x2k_hi : rom_8x2k port map (
258     addr => pmem_addr,
259     clk => mclk,
260     din => (others => '0'),
261     dout => pmem_dout (15 downto 8),
262     en => pmem_cen,
263     we => '1'
264   );
265       
266   rom_8x2k_lo : rom_8x2k port map (
267     addr => pmem_addr,
268     clk => mclk,
269     din => (others => '0'),
270     dout => pmem_dout (7 downto 0),
271     en => pmem_cen,
272     we => '1'
273   );
274
275
276   omsp_gpio_0 : omsp_gpio
277     generic map (
278       P1_EN => '1',  -- Enable Port 1
279       P2_EN => '1',  -- Enable Port 2
280       P3_EN => '0',  -- Enable Port 3
281       P4_EN => '0',  -- Enable Port 4
282       P5_EN => '0',  -- Enable Port 5
283       P6_EN => '0'   -- Enable Port 6
284     )
285     port map (
286       irq_port1 => open,
287       irq_port2 => open,
288       p1_dout (7 downto 2) => open,
289       p1_dout (1) => RXD,
290       p1_dout (0) => open,
291       p1_dout_en => open,
292       p1_sel => open,
293       p2_dout => open,
294       p2_dout_en => open,
295       p2_sel => open,
296       p3_dout => open,
297       p3_dout_en => open,
298       p3_sel => open,
299       p4_dout => open,
300       p4_dout_en => open,
301       p4_sel => open,
302       p5_dout => open,
303       p5_dout_en => open,
304       p5_sel => open,
305       p6_dout => open,
306       p6_dout_en => open,
307       p6_sel => open,
308       per_dout => gpio_per_dout,
309       mclk => mclk,
310       p1_din => (others => '0'),
311       p2_din => (others => '0'),
312       p3_din => (others => '0'),
313       p4_din => (others => '0'),
314       p5_din => (others => '0'),
315       p6_din => (others => '0'),
316       per_addr => per_addr,
317       per_din => per_din,
318       per_en => per_en,
319       per_wen => per_wen,
320       puc => puc
321     );
322
323   omsp_timerA_0 : omsp_timerA port map (
324     irq_ta0     => irq_ta0,
325     irq_ta1     => irq_ta1,
326     per_dout    => timerA_per_dout,
327     ta_out0     => open,
328     ta_out0_en  => open,
329     ta_out1     => open,
330     ta_out1_en  => open,
331     ta_out2     => open,
332     ta_out2_en  => open,
333
334     aclk_en     => aclk_en,
335     dbg_freeze  => '0',
336     inclk       => '0',
337     irq_ta0_acc => irq_acc (9),
338     mclk        => mclk,
339     per_addr    => per_addr,
340     per_din     => per_din,
341     per_en      => per_en,
342     per_wen     => per_wen,
343     puc         => puc,
344     smclk_en    => smclk_en,
345     ta_cci0a    => '0',
346     ta_cci0b    => TXD,
347     ta_cci1a    => '0',
348     ta_cci1b    => '0',
349     ta_cci2a    => '0',
350     ta_cci2b    => '0',
351     taclk       => '0'
352   );
353
354   omsp_quadcount_0 : omsp_quadcount port map (
355     mclk        => mclk,
356     per_addr    => per_addr,
357     per_din     => (others => '0'),
358     per_en      => per_en,
359     per_wen     => "00",
360     puc         => '0',
361     per_irq_acc => '0',
362     per_irq     => open,
363     per_dout    => omsp_quadcount_dout,
364     
365     qcount      => X"0001E240" -- 123456
366   );
367
368 --------------------------------------------------------------------------------
369
370   per_dout <=  gpio_per_dout or timerA_per_dout or omsp_quadcount_dout;
371   
372   irq <= (9 => irq_ta0,
373           8 => irq_ta1,
374           others => '0');
375   
376 end rtl;
377