]> rtime.felk.cvut.cz Git - fpga/virtex2/uart.git/blob - openMSP430_uart.vhd
Make RS-232 transmitting work.
[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 --------------------------------------------------------------------------------
185
186 begin
187   openMSP430_0 : openMSP430 port map (
188     aclk_en       => aclk_en,
189     dbg_freeze    => open,
190     dbg_uart_txd  => open,
191     dmem_addr     => dmem_addr,
192     dmem_cen      => dmem_cen,
193     dmem_din      => dmem_din,
194     dmem_wen      => dmem_wen,
195     irq_acc       => open,
196     mclk          => mclk,
197     per_addr      => per_addr,
198     per_din       => per_din,
199     per_wen       => per_wen,
200     per_en        => per_en,
201     pmem_addr     => pmem_addr,
202     pmem_cen      => pmem_cen,
203     pmem_din      => open,
204     pmem_wen      => open,
205     puc           => puc,
206     smclk_en      => smclk_en,
207   
208     dbg_uart_rxd  => '0',
209     dco_clk       => CLK_24MHz,
210     dmem_dout     => dmem_dout,
211     irq           => (others => '0'),
212     lfxt_clk      => '0',
213     nmi           => '0',
214     per_dout      => per_dout,
215     pmem_dout     => pmem_dout,
216     reset_n       => RESET
217   );
218
219   ram_8x512_hi : ram_8x512 port map (
220     addr => dmem_addr,
221     clk => mclk,
222     din => dmem_din (15 downto 8),
223     dout => dmem_dout (15 downto 8),
224     en => dmem_cen,
225     we => dmem_wen (1)
226   );
227   
228   ram_8x512_lo : ram_8x512 port map (
229     addr => dmem_addr,
230     clk => mclk,
231     din => dmem_din (7 downto 0),
232     dout => dmem_dout (7 downto 0),
233     en => dmem_cen,
234     we => dmem_wen (0)
235   );
236   
237   rom_8x2k_hi : rom_8x2k port map (
238     addr => pmem_addr,
239     clk => mclk,
240     din => (others => '0'),
241     dout => pmem_dout (15 downto 8),
242     en => pmem_cen,
243     we => '1'
244   );
245       
246   rom_8x2k_lo : rom_8x2k port map (
247     addr => pmem_addr,
248     clk => mclk,
249     din => (others => '0'),
250     dout => pmem_dout (7 downto 0),
251     en => pmem_cen,
252     we => '1'
253   );
254
255
256   omsp_gpio_0 : omsp_gpio
257     generic map (
258       P1_EN => '1',  -- Enable Port 1
259       P2_EN => '1',  -- Enable Port 2
260       P3_EN => '0',  -- Enable Port 3
261       P4_EN => '0',  -- Enable Port 4
262       P5_EN => '0',  -- Enable Port 5
263       P6_EN => '0'   -- Enable Port 6
264     )
265     port map (
266       irq_port1 => open,
267       irq_port2 => open,
268       p1_dout (7 downto 2) => open,
269       p1_dout (1) => RXD,
270       p1_dout (0) => open,
271       p1_dout_en => open,
272       p1_sel => open,
273       p2_dout => open,
274       p2_dout_en => open,
275       p2_sel => open,
276       p3_dout => open,
277       p3_dout_en => open,
278       p3_sel => open,
279       p4_dout => open,
280       p4_dout_en => open,
281       p4_sel => open,
282       p5_dout => open,
283       p5_dout_en => open,
284       p5_sel => open,
285       p6_dout => open,
286       p6_dout_en => open,
287       p6_sel => open,
288       per_dout => gpio_per_dout,
289       mclk => mclk,
290       p1_din => (others => '0'),
291       p2_din => (others => '0'),
292       p3_din => (others => '0'),
293       p4_din => (others => '0'),
294       p5_din => (others => '0'),
295       p6_din => (others => '0'),
296       per_addr => per_addr,
297       per_din => per_din,
298       per_en => per_en,
299       per_wen => per_wen,
300       puc => puc
301     );
302
303   omsp_timerA_0 : omsp_timerA port map (
304     irq_ta0     => open,
305     irq_ta1     => open,
306     per_dout    => timerA_per_dout,
307     ta_out0     => open,
308     ta_out0_en  => open,
309     ta_out1     => open,
310     ta_out1_en  => open,
311     ta_out2     => open,
312     ta_out2_en  => open,
313
314     aclk_en     => aclk_en,
315     dbg_freeze  => '0',
316     inclk       => '0',
317     irq_ta0_acc => '0',
318     mclk        => mclk,
319     per_addr    => per_addr,
320     per_din     => per_din,
321     per_en      => per_en,
322     per_wen     => per_wen,
323     puc         => puc,
324     smclk_en    => smclk_en,
325     ta_cci0a    => '0',
326     ta_cci0b    => '0',
327     ta_cci1a    => '0',
328     ta_cci1b    => '0',
329     ta_cci2a    => '0',
330     ta_cci2b    => '0',
331     taclk       => '0'
332   );
333
334 --------------------------------------------------------------------------------
335
336   per_dout <=  gpio_per_dout or timerA_per_dout;
337   
338 end rtl;
339