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;
23 --------------------------------------------------------------------------------
25 architecture rtl of openMSP430_uart is
26 component openMSP430 is
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
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)
62 addr: in std_logic_VECTOR(8 downto 0);
64 din: in std_logic_VECTOR(7 downto 0);
65 dout: out std_logic_VECTOR(7 downto 0);
73 addr: in std_logic_VECTOR(10 downto 0);
75 din: in std_logic_VECTOR(7 downto 0);
76 dout: out std_logic_VECTOR(7 downto 0);
82 component omsp_quadcount is
84 ADDR : std_logic_vector (15 downto 0));
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);
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;
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);
106 per_irq_acc : in std_logic;
107 per_irq : out std_logic;
108 per_dout : out std_logic_vector (15 downto 0);
115 component omsp_pwm is
118 PWM_WIDTH : integer);
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;
137 reset : in std_ulogic;
138 count : out std_logic_vector (WIDTH-1 downto 0));
139 end component counter;
143 signal mclk : std_logic;
144 signal puc : std_logic;
145 signal aclk_en : std_logic;
146 signal smclk_en : std_logic;
148 signal irq_acc : std_logic_vector (13 downto 0);
149 signal irq : std_logic_vector (13 downto 0);
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;
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);
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);
168 signal omsp_quadcount_dout : std_logic_vector (15 downto 0);
169 signal omsp_quadcount_irq : std_logic;
171 signal uart_dout : std_logic_vector (15 downto 0);
172 signal uart_irq : std_logic;
174 signal omsp_pwm_dout : std_logic_vector (15 downto 0);
176 signal pwm_cnt : std_logic_vector (15 downto 0);
178 --------------------------------------------------------------------------------
181 openMSP430_0 : openMSP430 port map (
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,
191 per_addr => per_addr,
195 pmem_addr => pmem_addr,
196 pmem_cen => pmem_cen,
200 smclk_en => smclk_en,
203 dco_clk => CLK_24MHz,
204 dmem_dout => dmem_dout,
208 per_dout => per_dout,
209 pmem_dout => pmem_dout,
213 ram_8x512_hi : ram_8x512 port map (
216 din => dmem_din (15 downto 8),
217 dout => dmem_dout (15 downto 8),
222 ram_8x512_lo : ram_8x512 port map (
225 din => dmem_din (7 downto 0),
226 dout => dmem_dout (7 downto 0),
231 rom_8x2k_hi : rom_8x2k port map (
234 din => (others => '0'),
235 dout => pmem_dout (15 downto 8),
240 rom_8x2k_lo : rom_8x2k port map (
243 din => (others => '0'),
244 dout => pmem_dout (7 downto 0),
249 omsp_quadcount_1: omsp_quadcount
255 per_addr => per_addr,
257 per_irq => omsp_quadcount_irq,
258 per_dout => omsp_quadcount_dout,
266 uart_o : uart port map (
268 per_addr => per_addr,
275 per_dout => uart_dout,
281 omsp_pwm_1 : omsp_pwm
288 per_addr => per_addr,
292 per_dout => omsp_pwm_dout,
305 --------------------------------------------------------------------------------
307 per_dout <= uart_dout or omsp_quadcount_dout or omsp_pwm_dout;
309 irq <= (6 => uart_irq,
310 7 => omsp_quadcount_irq,