]> rtime.felk.cvut.cz Git - fpga/virtex2/uart.git/blob - openMSP430_uart.vhd
Software modification to work whit HW UART
[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   component omsp_quadcount is
81     port (
82       mclk        : in  std_logic;
83       per_addr    : in  std_logic_vector (7  downto 0);
84       per_din     : in  std_logic_vector (15 downto 0);  -- unused
85       per_en      : in  std_logic;
86       per_wen     : in  std_logic_vector (1  downto 0);  -- unused
87       puc         : in  std_logic;                       -- unused
88       per_irq_acc : in  std_logic;                       -- unused
89       per_irq     : out std_logic;                       -- unused
90       per_dout    : out std_logic_vector (15 downto 0);
91       
92       qcount      : in  std_logic_vector (31 downto 0)
93     );
94   end component;
95   
96   component uart is
97     port (
98       mclk        : in  std_logic;
99       per_addr    : in  std_logic_vector (7 downto 0);
100       per_din     : in  std_logic_vector (15 downto 0);
101       per_en      : in  std_logic;
102       per_wen     : in  std_logic_vector (1 downto 0);
103       puc         : in  std_logic;
104       per_irq_acc : in  std_logic;
105       per_irq     : out std_logic;
106       per_dout    : out std_logic_vector (15 downto 0);
107
108       rxd         : in  std_logic;
109       txd         : out std_logic
110     );
111   end component;
112
113   component qcounter is
114     port (
115       clock    : in std_logic;
116       reset    : in std_logic;
117       a0, b0   : in std_logic;
118       qcount   : out std_logic_vector (31 downto 0);
119       a_rise, a_fall, b_rise, b_fall, ab_event : out std_logic;
120       ab_error : out std_logic
121     );
122   end component;
123
124
125   signal mclk : std_logic;
126   signal puc : std_logic;
127   signal aclk_en : std_logic;
128   signal smclk_en : std_logic;
129   
130   signal irq_acc : std_logic_vector (13 downto 0);
131   signal irq : std_logic_vector (13 downto 0);
132
133   signal pmem_addr : std_logic_vector (10 downto 0);
134   signal pmem_dout : std_logic_vector (15 downto 0);
135   signal pmem_cen   : std_logic;
136
137   signal dmem_addr : std_logic_vector (8 downto 0);
138   signal dmem_cen  : std_logic;
139   signal dmem_wen  : std_logic_vector (1  downto 0);
140   signal dmem_din  : std_logic_vector (15 downto 0);
141   signal dmem_dout : std_logic_vector (15 downto 0);
142   
143   signal per_din : std_logic_vector (15 downto 0);
144   signal per_dout : std_logic_Vector (15 downto 0);
145   signal per_wen : std_logic_vector (1 downto 0);
146   signal per_en : std_logic;
147   signal per_addr : std_logic_vector (7 downto 0);
148
149
150   signal omsp_quadcount_dout : std_logic_vector (15 downto 0);
151   signal omsp_quadcount_irq  : std_logic;
152
153   signal uart_dout : std_logic_vector (15 downto 0);
154   signal uart_irq  : std_logic;
155
156   signal qcount : std_logic_vector (31 downto 0);
157
158 --------------------------------------------------------------------------------
159
160 begin
161   openMSP430_0 : openMSP430 port map (
162     aclk_en       => aclk_en,
163     dbg_freeze    => open,
164     dbg_uart_txd  => open,
165     dmem_addr     => dmem_addr,
166     dmem_cen      => dmem_cen,
167     dmem_din      => dmem_din,
168     dmem_wen      => dmem_wen,
169     irq_acc       => irq_acc,
170     mclk          => mclk,
171     per_addr      => per_addr,
172     per_din       => per_din,
173     per_wen       => per_wen,
174     per_en        => per_en,
175     pmem_addr     => pmem_addr,
176     pmem_cen      => pmem_cen,
177     pmem_din      => open,
178     pmem_wen      => open,
179     puc           => puc,
180     smclk_en      => smclk_en,
181   
182     dbg_uart_rxd  => '0',
183     dco_clk       => CLK_24MHz,
184     dmem_dout     => dmem_dout,
185     irq           => irq,
186     lfxt_clk      => '0',
187     nmi           => '0',
188     per_dout      => per_dout,
189     pmem_dout     => pmem_dout,
190     reset_n       => RESET
191   );
192
193   ram_8x512_hi : ram_8x512 port map (
194     addr => dmem_addr,
195     clk => mclk,
196     din => dmem_din (15 downto 8),
197     dout => dmem_dout (15 downto 8),
198     en => dmem_cen,
199     we => dmem_wen (1)
200   );
201   
202   ram_8x512_lo : ram_8x512 port map (
203     addr => dmem_addr,
204     clk => mclk,
205     din => dmem_din (7 downto 0),
206     dout => dmem_dout (7 downto 0),
207     en => dmem_cen,
208     we => dmem_wen (0)
209   );
210   
211   rom_8x2k_hi : rom_8x2k port map (
212     addr => pmem_addr,
213     clk => mclk,
214     din => (others => '0'),
215     dout => pmem_dout (15 downto 8),
216     en => pmem_cen,
217     we => '1'
218   );
219       
220   rom_8x2k_lo : rom_8x2k port map (
221     addr => pmem_addr,
222     clk => mclk,
223     din => (others => '0'),
224     dout => pmem_dout (7 downto 0),
225     en => pmem_cen,
226     we => '1'
227   );
228
229   omsp_quadcount_0 : omsp_quadcount port map (
230     mclk        => mclk,
231     per_addr    => per_addr,
232     per_din     => (others => '0'),
233     per_en      => per_en,
234     per_wen     => "00",
235     puc         => '0',
236     per_irq_acc => '0',
237     per_irq     => omsp_quadcount_irq,
238     per_dout    => omsp_quadcount_dout,
239     
240     qcount      => qcount
241   );
242
243   uart_o : uart port map (
244     mclk        => mclk,
245     per_addr    => per_addr,
246     per_din     => per_din,
247     per_en      => per_en,
248     per_wen     => per_wen,
249     puc         => puc,
250     per_irq_acc => '0',
251     per_irq     => uart_irq,
252     per_dout    => uart_dout,
253
254     rxd         => TXD,
255     txd         => RXD
256   );
257
258   qcounter_0 : qcounter port map (
259     clock     => mclk,
260     reset     => ROT_PRESS,
261     a0        => ROT_A,
262     b0        => ROT_B,
263     qcount    => qcount,
264     a_rise    => open,
265     a_fall    => open,
266     b_rise    => open,
267     b_fall    => open,
268     ab_event  => open,
269     ab_error  => open
270   );
271
272 --------------------------------------------------------------------------------
273
274   per_dout <= uart_dout or omsp_quadcount_dout;
275   
276   irq <= (6 => uart_irq,
277           7 => omsp_quadcount_irq,
278           others => '0');
279   
280   ROT_FEED <= '1';
281   
282 end rtl;
283