]> rtime.felk.cvut.cz Git - fpga/virtex2/uart.git/blob - openMSP430_uart.vhd
Peripheral connected to the quadcount module and an incremental encoder. Interrupt...
[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
81   component omsp_gpio
82     generic (
83       P1_EN : std_logic;
84       P2_EN : std_logic;
85       P3_EN : std_logic;
86       P4_EN : std_logic;
87       P5_EN : std_logic;
88       P6_EN : std_logic
89     );
90     port(
91       mclk : in std_logic;
92       p1_din : in std_logic_vector(7 downto 0);
93       p2_din : in std_logic_vector(7 downto 0);
94       p3_din : in std_logic_vector(7 downto 0);
95       p4_din : in std_logic_vector(7 downto 0);
96       p5_din : in std_logic_vector(7 downto 0);
97       p6_din : in std_logic_vector(7 downto 0);
98       per_addr : in std_logic_vector(7 downto 0);
99       per_din : in std_logic_vector(15 downto 0);
100       per_en : in std_logic;
101       per_wen : in std_logic_vector(1 downto 0);
102       puc : in std_logic;          
103       irq_port1 : out std_logic;
104       irq_port2 : out std_logic;
105       p1_dout : out std_logic_vector(7 downto 0);
106       p1_dout_en : out std_logic_vector(7 downto 0);
107       p1_sel : out std_logic_vector(7 downto 0);
108       p2_dout : out std_logic_vector(7 downto 0);
109       p2_dout_en : out std_logic_vector(7 downto 0);
110       p2_sel : out std_logic_vector(7 downto 0);
111       p3_dout : out std_logic_vector(7 downto 0);
112       p3_dout_en : out std_logic_vector(7 downto 0);
113       p3_sel : out std_logic_vector(7 downto 0);
114       p4_dout : out std_logic_vector(7 downto 0);
115       p4_dout_en : out std_logic_vector(7 downto 0);
116       p4_sel : out std_logic_vector(7 downto 0);
117       p5_dout : out std_logic_vector(7 downto 0);
118       p5_dout_en : out std_logic_vector(7 downto 0);
119       p5_sel : out std_logic_vector(7 downto 0);
120       p6_dout : out std_logic_vector(7 downto 0);
121       p6_dout_en : out std_logic_vector(7 downto 0);
122       p6_sel : out std_logic_vector(7 downto 0);
123       per_dout : out std_logic_vector(15 downto 0)
124     );
125   end component;
126
127   component omsp_timerA
128     port (
129       irq_ta0     : out std_logic;      -- Timer A interrupt: TACCR0
130       irq_ta1     : out std_logic;                       -- Timer A interrupt: TAIV, TACCR1, TACCR2
131       per_dout    : out std_logic_vector (15 downto 0);  -- Peripheral data output
132       ta_out0     : out std_logic;                       -- Timer A output 0
133       ta_out0_en  : out std_logic;      -- Timer A output 0 enable
134       ta_out1     : out std_logic;      -- Timer A output 1
135       ta_out1_en  : out std_logic;      -- Timer A output 1 enable
136       ta_out2     : out std_logic;      -- Timer A output 2
137       ta_out2_en  : out std_logic;      -- Timer A output 2 enable
138
139       aclk_en     : in std_logic;       -- ACLK enable (from CPU)
140       dbg_freeze  : in std_logic;       -- Freeze Timer A counter
141       inclk       : in std_logic;       -- INCLK external timer clock (SLOW)
142       irq_ta0_acc : in std_logic;       -- Interrupt request TACCR0 accepted
143       mclk        : in std_logic;                        -- Main system clock
144       per_addr    : in std_logic_vector (7  downto 0);   -- Peripheral address
145       per_din     : in std_logic_Vector (15 downto 0);   -- Peripheral data input
146       per_en      : in std_logic;                        -- Peripheral enable (high active)
147       per_wen     : in std_logic_vector (1  downto 0);   -- Peripheral write enable (high active)
148       puc         : in std_logic;                        -- Main system reset
149       smclk_en    : in std_logic;       -- SMCLK enable (from CPU)
150       ta_cci0a    : in std_logic;       -- Timer A capture 0 input A
151       ta_cci0b    : in std_logic;       -- Timer A capture 0 input B
152       ta_cci1a    : in std_logic;       -- Timer A capture 1 input A
153       ta_cci1b    : in std_logic;       -- Timer A capture 1 input B
154       ta_cci2a    : in std_logic;       -- Timer A capture 2 input A
155       ta_cci2b    : in std_logic;       -- Timer A capture 2 input B
156       taclk       : in std_logic        -- TACLK external timer clock (SLOW)
157     );
158   end component;
159
160   component omsp_quadcount is
161     port (
162       mclk        : in  std_logic;
163       per_addr    : in  std_logic_vector (7  downto 0);
164       per_din     : in  std_logic_vector (15 downto 0);  -- unused
165       per_en      : in  std_logic;
166       per_wen     : in  std_logic_vector (1  downto 0);  -- unused
167       puc         : in  std_logic;                       -- unused
168       per_irq_acc : in  std_logic;                       -- unused
169       per_irq     : out std_logic;                       -- unused
170       per_dout    : out std_logic_vector (15 downto 0);
171       
172       qcount      : in  std_logic_vector (31 downto 0)
173     );
174   end component;
175
176   component qcounter is
177     port (
178       clock    : in std_logic;
179       reset    : in std_logic;
180       a0, b0   : in std_logic;
181       qcount   : out std_logic_vector (31 downto 0);
182       a_rise, a_fall, b_rise, b_fall, ab_event : out std_logic;
183       ab_error : out std_logic
184     );
185   end component;
186
187
188   signal mclk : std_logic;
189   signal puc : std_logic;
190   signal aclk_en : std_logic;
191   signal smclk_en : std_logic;
192   
193   signal irq_acc : std_logic_vector (13 downto 0);
194   signal irq : std_logic_vector (13 downto 0);
195
196   signal pmem_addr : std_logic_vector (10 downto 0);
197   signal pmem_dout : std_logic_vector (15 downto 0);
198   signal pmem_cen   : std_logic;
199
200   signal dmem_addr : std_logic_vector (8 downto 0);
201   signal dmem_cen  : std_logic;
202   signal dmem_wen  : std_logic_vector (1  downto 0);
203   signal dmem_din  : std_logic_vector (15 downto 0);
204   signal dmem_dout : std_logic_vector (15 downto 0);
205   
206   signal per_din : std_logic_vector (15 downto 0);
207   signal per_dout : std_logic_Vector (15 downto 0);
208   signal per_wen : std_logic_vector (1 downto 0);
209   signal per_en : std_logic;
210   signal per_addr : std_logic_vector (7 downto 0);
211
212
213   signal gpio_per_dout : std_logic_vector (15 downto 0);
214   signal timerA_per_dout : std_logic_vector (15 downto 0);
215   signal omsp_quadcount_dout : std_logic_vector (15 downto 0);
216
217   signal irq_ta0 : std_logic;
218   signal irq_ta1 : std_logic;
219   signal omsp_quadcount_irq : std_logic;
220
221   signal qcount : std_logic_vector (31 downto 0);
222
223 --------------------------------------------------------------------------------
224
225 begin
226   openMSP430_0 : openMSP430 port map (
227     aclk_en       => aclk_en,
228     dbg_freeze    => open,
229     dbg_uart_txd  => open,
230     dmem_addr     => dmem_addr,
231     dmem_cen      => dmem_cen,
232     dmem_din      => dmem_din,
233     dmem_wen      => dmem_wen,
234     irq_acc       => irq_acc,
235     mclk          => mclk,
236     per_addr      => per_addr,
237     per_din       => per_din,
238     per_wen       => per_wen,
239     per_en        => per_en,
240     pmem_addr     => pmem_addr,
241     pmem_cen      => pmem_cen,
242     pmem_din      => open,
243     pmem_wen      => open,
244     puc           => puc,
245     smclk_en      => smclk_en,
246   
247     dbg_uart_rxd  => '0',
248     dco_clk       => CLK_24MHz,
249     dmem_dout     => dmem_dout,
250     irq           => irq,
251     lfxt_clk      => '0',
252     nmi           => '0',
253     per_dout      => per_dout,
254     pmem_dout     => pmem_dout,
255     reset_n       => RESET
256   );
257
258   ram_8x512_hi : ram_8x512 port map (
259     addr => dmem_addr,
260     clk => mclk,
261     din => dmem_din (15 downto 8),
262     dout => dmem_dout (15 downto 8),
263     en => dmem_cen,
264     we => dmem_wen (1)
265   );
266   
267   ram_8x512_lo : ram_8x512 port map (
268     addr => dmem_addr,
269     clk => mclk,
270     din => dmem_din (7 downto 0),
271     dout => dmem_dout (7 downto 0),
272     en => dmem_cen,
273     we => dmem_wen (0)
274   );
275   
276   rom_8x2k_hi : rom_8x2k port map (
277     addr => pmem_addr,
278     clk => mclk,
279     din => (others => '0'),
280     dout => pmem_dout (15 downto 8),
281     en => pmem_cen,
282     we => '1'
283   );
284       
285   rom_8x2k_lo : rom_8x2k port map (
286     addr => pmem_addr,
287     clk => mclk,
288     din => (others => '0'),
289     dout => pmem_dout (7 downto 0),
290     en => pmem_cen,
291     we => '1'
292   );
293
294
295   omsp_gpio_0 : omsp_gpio
296     generic map (
297       P1_EN => '1',  -- Enable Port 1
298       P2_EN => '1',  -- Enable Port 2
299       P3_EN => '0',  -- Enable Port 3
300       P4_EN => '0',  -- Enable Port 4
301       P5_EN => '0',  -- Enable Port 5
302       P6_EN => '0'   -- Enable Port 6
303     )
304     port map (
305       irq_port1 => open,
306       irq_port2 => open,
307       p1_dout (7 downto 2) => open,
308       p1_dout (1) => RXD,
309       p1_dout (0) => open,
310       p1_dout_en => open,
311       p1_sel => open,
312       p2_dout => open,
313       p2_dout_en => open,
314       p2_sel => open,
315       p3_dout => open,
316       p3_dout_en => open,
317       p3_sel => open,
318       p4_dout => open,
319       p4_dout_en => open,
320       p4_sel => open,
321       p5_dout => open,
322       p5_dout_en => open,
323       p5_sel => open,
324       p6_dout => open,
325       p6_dout_en => open,
326       p6_sel => open,
327       per_dout => gpio_per_dout,
328       mclk => mclk,
329       p1_din => (others => '0'),
330       p2_din => (others => '0'),
331       p3_din => (others => '0'),
332       p4_din => (others => '0'),
333       p5_din => (others => '0'),
334       p6_din => (others => '0'),
335       per_addr => per_addr,
336       per_din => per_din,
337       per_en => per_en,
338       per_wen => per_wen,
339       puc => puc
340     );
341
342   omsp_timerA_0 : omsp_timerA port map (
343     irq_ta0     => irq_ta0,
344     irq_ta1     => irq_ta1,
345     per_dout    => timerA_per_dout,
346     ta_out0     => open,
347     ta_out0_en  => open,
348     ta_out1     => open,
349     ta_out1_en  => open,
350     ta_out2     => open,
351     ta_out2_en  => open,
352
353     aclk_en     => aclk_en,
354     dbg_freeze  => '0',
355     inclk       => '0',
356     irq_ta0_acc => irq_acc (9),
357     mclk        => mclk,
358     per_addr    => per_addr,
359     per_din     => per_din,
360     per_en      => per_en,
361     per_wen     => per_wen,
362     puc         => puc,
363     smclk_en    => smclk_en,
364     ta_cci0a    => '0',
365     ta_cci0b    => TXD,
366     ta_cci1a    => '0',
367     ta_cci1b    => '0',
368     ta_cci2a    => '0',
369     ta_cci2b    => '0',
370     taclk       => '0'
371   );
372
373   omsp_quadcount_0 : omsp_quadcount port map (
374     mclk        => mclk,
375     per_addr    => per_addr,
376     per_din     => (others => '0'),
377     per_en      => per_en,
378     per_wen     => "00",
379     puc         => '0',
380     per_irq_acc => '0',
381     per_irq     => omsp_quadcount_irq,
382     per_dout    => omsp_quadcount_dout,
383     
384     qcount      => qcount
385   );
386
387   qcounter_0 : qcounter port map (
388     clock     => mclk,
389     reset     => ROT_PRESS,
390     a0        => ROT_A,
391     b0        => ROT_B,
392     qcount    => qcount,
393     a_rise    => open,
394     a_fall    => open,
395     b_rise    => open,
396     b_fall    => open,
397     ab_event  => open,
398     ab_error  => open
399   );
400
401 --------------------------------------------------------------------------------
402
403   per_dout <=  gpio_per_dout or timerA_per_dout or omsp_quadcount_dout;
404   
405   irq <= (9 => irq_ta0,
406           8 => irq_ta1,
407           7 => omsp_quadcount_irq,
408           others => '0');
409   
410   ROT_FEED <= '1';
411   
412 end rtl;
413