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