2 use IEEE.STD_LOGIC_1164.ALL;
3 use IEEE.STD_LOGIC_ARITH.ALL;
4 use IEEE.STD_LOGIC_UNSIGNED.ALL;
6 entity openMSP430_uart is
8 CLK_24MHz: in std_logic;
14 ROT_FEED : out std_logic;
17 ROT_PRESS : in std_logic
21 --------------------------------------------------------------------------------
23 architecture rtl of openMSP430_uart is
24 component openMSP430 is
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
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)
60 addr: in std_logic_VECTOR(8 downto 0);
62 din: in std_logic_VECTOR(7 downto 0);
63 dout: out std_logic_VECTOR(7 downto 0);
71 addr: in std_logic_VECTOR(10 downto 0);
73 din: in std_logic_VECTOR(7 downto 0);
74 dout: out std_logic_VECTOR(7 downto 0);
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);
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)
127 component omsp_timerA
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
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)
160 component omsp_quadcount is
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);
172 qcount : in std_logic_vector (31 downto 0)
176 component qcounter is
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
188 signal mclk : std_logic;
189 signal puc : std_logic;
190 signal aclk_en : std_logic;
191 signal smclk_en : std_logic;
193 signal irq_acc : std_logic_vector (13 downto 0);
194 signal irq : std_logic_vector (13 downto 0);
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;
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);
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);
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);
217 signal irq_ta0 : std_logic;
218 signal irq_ta1 : std_logic;
219 signal omsp_quadcount_irq : std_logic;
221 signal qcount : std_logic_vector (31 downto 0);
223 --------------------------------------------------------------------------------
226 openMSP430_0 : openMSP430 port map (
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,
236 per_addr => per_addr,
240 pmem_addr => pmem_addr,
241 pmem_cen => pmem_cen,
245 smclk_en => smclk_en,
248 dco_clk => CLK_24MHz,
249 dmem_dout => dmem_dout,
253 per_dout => per_dout,
254 pmem_dout => pmem_dout,
258 ram_8x512_hi : ram_8x512 port map (
261 din => dmem_din (15 downto 8),
262 dout => dmem_dout (15 downto 8),
267 ram_8x512_lo : ram_8x512 port map (
270 din => dmem_din (7 downto 0),
271 dout => dmem_dout (7 downto 0),
276 rom_8x2k_hi : rom_8x2k port map (
279 din => (others => '0'),
280 dout => pmem_dout (15 downto 8),
285 rom_8x2k_lo : rom_8x2k port map (
288 din => (others => '0'),
289 dout => pmem_dout (7 downto 0),
295 omsp_gpio_0 : omsp_gpio
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
307 p1_dout (7 downto 2) => open,
327 per_dout => gpio_per_dout,
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,
342 omsp_timerA_0 : omsp_timerA port map (
345 per_dout => timerA_per_dout,
356 irq_ta0_acc => irq_acc (9),
358 per_addr => per_addr,
363 smclk_en => smclk_en,
373 omsp_quadcount_0 : omsp_quadcount port map (
375 per_addr => per_addr,
376 per_din => (others => '0'),
381 per_irq => omsp_quadcount_irq,
382 per_dout => omsp_quadcount_dout,
387 qcounter_0 : qcounter port map (
401 --------------------------------------------------------------------------------
403 per_dout <= gpio_per_dout or timerA_per_dout or omsp_quadcount_dout;
405 irq <= (9 => irq_ta0,
407 7 => omsp_quadcount_irq,