library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity openMSP430_uart is port ( CLK_24MHz: in std_logic; RESET: in std_logic; RXD : out std_logic; TXD : in std_logic; ROT_FEED : out std_logic; ROT_A : in std_logic; ROT_B : in std_logic; ROT_PRESS : in std_logic ); end openMSP430_uart; -------------------------------------------------------------------------------- architecture rtl of openMSP430_uart is component openMSP430 is port( aclk_en : out std_logic; -- ACLK enable dbg_freeze : out std_logic; -- Freeze peripherals dbg_uart_txd : out std_logic; -- Debug interface: UART TXD dmem_addr : out std_logic_vector (8 downto 0); -- Data Memory address dmem_cen : out std_logic; -- Data Memory chip enable (low active) dmem_din : out std_logic_vector (15 downto 0); -- Data Memory data input dmem_wen : out std_logic_vector (1 downto 0); -- Data Memory write enable (low active) irq_acc : out std_logic_vector (13 downto 0); -- Interrupt request accepted (one-hot signal) mclk : out std_logic; -- Main system clock per_addr : out std_logic_vector (7 downto 0); -- Peripheral address per_din : out std_logic_vector (15 downto 0); -- Peripheral data input per_wen : out std_logic_vector (1 downto 0); -- Peripheral write enable (high active) per_en : out std_logic; -- Peripheral enable (high active) pmem_addr : out std_logic_vector (10 downto 0); -- Program Memory address pmem_cen : out std_logic; -- Program Memory chip enable (low active) pmem_din : out std_logic_vector (15 downto 0); -- Program Memory data input (optional) pmem_wen : out std_logic_vector (1 downto 0); -- Program Memory write enable (low active) (optional) puc : out std_logic; -- Main system reset smclk_en : out std_logic; -- SMCLK enable dbg_uart_rxd : in std_logic; -- Debug interface: UART RXD dco_clk : in std_logic; -- Fast oscillator (fast clock) dmem_dout : in std_logic_vector (15 downto 0); -- Data Memory data output irq : in std_logic_vector (13 downto 0); -- Maskable interrupts lfxt_clk : in std_logic; -- Low frequency oscillator (typ 32kHz) nmi : in std_logic; -- Non-maskable interrupt (asynchronous) per_dout : in std_logic_vector (15 downto 0); -- Peripheral data output pmem_dout : in std_logic_vector (15 downto 0); -- Program Memory data output reset_n : in std_logic -- Reset Pin (low active) ); end component; component ram_8x512 port ( addr: in std_logic_VECTOR(8 downto 0); clk: in std_logic; din: in std_logic_VECTOR(7 downto 0); dout: out std_logic_VECTOR(7 downto 0); en: in std_logic; we: in std_logic ); end component; component rom_8x2k port ( addr: in std_logic_VECTOR(10 downto 0); clk: in std_logic; din: in std_logic_VECTOR(7 downto 0); dout: out std_logic_VECTOR(7 downto 0); en: in std_logic; we: in std_logic ); end component; component omsp_gpio generic ( P1_EN : std_logic; P2_EN : std_logic; P3_EN : std_logic; P4_EN : std_logic; P5_EN : std_logic; P6_EN : std_logic ); port( mclk : in std_logic; p1_din : in std_logic_vector(7 downto 0); p2_din : in std_logic_vector(7 downto 0); p3_din : in std_logic_vector(7 downto 0); p4_din : in std_logic_vector(7 downto 0); p5_din : in std_logic_vector(7 downto 0); p6_din : in std_logic_vector(7 downto 0); per_addr : in std_logic_vector(7 downto 0); per_din : in std_logic_vector(15 downto 0); per_en : in std_logic; per_wen : in std_logic_vector(1 downto 0); puc : in std_logic; irq_port1 : out std_logic; irq_port2 : out std_logic; p1_dout : out std_logic_vector(7 downto 0); p1_dout_en : out std_logic_vector(7 downto 0); p1_sel : out std_logic_vector(7 downto 0); p2_dout : out std_logic_vector(7 downto 0); p2_dout_en : out std_logic_vector(7 downto 0); p2_sel : out std_logic_vector(7 downto 0); p3_dout : out std_logic_vector(7 downto 0); p3_dout_en : out std_logic_vector(7 downto 0); p3_sel : out std_logic_vector(7 downto 0); p4_dout : out std_logic_vector(7 downto 0); p4_dout_en : out std_logic_vector(7 downto 0); p4_sel : out std_logic_vector(7 downto 0); p5_dout : out std_logic_vector(7 downto 0); p5_dout_en : out std_logic_vector(7 downto 0); p5_sel : out std_logic_vector(7 downto 0); p6_dout : out std_logic_vector(7 downto 0); p6_dout_en : out std_logic_vector(7 downto 0); p6_sel : out std_logic_vector(7 downto 0); per_dout : out std_logic_vector(15 downto 0) ); end component; component omsp_timerA port ( irq_ta0 : out std_logic; -- Timer A interrupt: TACCR0 irq_ta1 : out std_logic; -- Timer A interrupt: TAIV, TACCR1, TACCR2 per_dout : out std_logic_vector (15 downto 0); -- Peripheral data output ta_out0 : out std_logic; -- Timer A output 0 ta_out0_en : out std_logic; -- Timer A output 0 enable ta_out1 : out std_logic; -- Timer A output 1 ta_out1_en : out std_logic; -- Timer A output 1 enable ta_out2 : out std_logic; -- Timer A output 2 ta_out2_en : out std_logic; -- Timer A output 2 enable aclk_en : in std_logic; -- ACLK enable (from CPU) dbg_freeze : in std_logic; -- Freeze Timer A counter inclk : in std_logic; -- INCLK external timer clock (SLOW) irq_ta0_acc : in std_logic; -- Interrupt request TACCR0 accepted mclk : in std_logic; -- Main system clock per_addr : in std_logic_vector (7 downto 0); -- Peripheral address per_din : in std_logic_Vector (15 downto 0); -- Peripheral data input per_en : in std_logic; -- Peripheral enable (high active) per_wen : in std_logic_vector (1 downto 0); -- Peripheral write enable (high active) puc : in std_logic; -- Main system reset smclk_en : in std_logic; -- SMCLK enable (from CPU) ta_cci0a : in std_logic; -- Timer A capture 0 input A ta_cci0b : in std_logic; -- Timer A capture 0 input B ta_cci1a : in std_logic; -- Timer A capture 1 input A ta_cci1b : in std_logic; -- Timer A capture 1 input B ta_cci2a : in std_logic; -- Timer A capture 2 input A ta_cci2b : in std_logic; -- Timer A capture 2 input B taclk : in std_logic -- TACLK external timer clock (SLOW) ); end component; component omsp_quadcount is port ( mclk : in std_logic; per_addr : in std_logic_vector (7 downto 0); per_din : in std_logic_vector (15 downto 0); -- unused per_en : in std_logic; per_wen : in std_logic_vector (1 downto 0); -- unused puc : in std_logic; -- unused per_irq_acc : in std_logic; -- unused per_irq : out std_logic; -- unused per_dout : out std_logic_vector (15 downto 0); qcount : in std_logic_vector (31 downto 0) ); end component; component qcounter is port ( clock : in std_logic; reset : in std_logic; a0, b0 : in std_logic; qcount : out std_logic_vector (31 downto 0); a_rise, a_fall, b_rise, b_fall, ab_event : out std_logic; ab_error : out std_logic ); end component; signal mclk : std_logic; signal puc : std_logic; signal aclk_en : std_logic; signal smclk_en : std_logic; signal irq_acc : std_logic_vector (13 downto 0); signal irq : std_logic_vector (13 downto 0); signal pmem_addr : std_logic_vector (10 downto 0); signal pmem_dout : std_logic_vector (15 downto 0); signal pmem_cen : std_logic; signal dmem_addr : std_logic_vector (8 downto 0); signal dmem_cen : std_logic; signal dmem_wen : std_logic_vector (1 downto 0); signal dmem_din : std_logic_vector (15 downto 0); signal dmem_dout : std_logic_vector (15 downto 0); signal per_din : std_logic_vector (15 downto 0); signal per_dout : std_logic_Vector (15 downto 0); signal per_wen : std_logic_vector (1 downto 0); signal per_en : std_logic; signal per_addr : std_logic_vector (7 downto 0); signal gpio_per_dout : std_logic_vector (15 downto 0); signal timerA_per_dout : std_logic_vector (15 downto 0); signal omsp_quadcount_dout : std_logic_vector (15 downto 0); signal irq_ta0 : std_logic; signal irq_ta1 : std_logic; signal omsp_quadcount_irq : std_logic; signal qcount : std_logic_vector (31 downto 0); -------------------------------------------------------------------------------- begin openMSP430_0 : openMSP430 port map ( aclk_en => aclk_en, dbg_freeze => open, dbg_uart_txd => open, dmem_addr => dmem_addr, dmem_cen => dmem_cen, dmem_din => dmem_din, dmem_wen => dmem_wen, irq_acc => irq_acc, mclk => mclk, per_addr => per_addr, per_din => per_din, per_wen => per_wen, per_en => per_en, pmem_addr => pmem_addr, pmem_cen => pmem_cen, pmem_din => open, pmem_wen => open, puc => puc, smclk_en => smclk_en, dbg_uart_rxd => '0', dco_clk => CLK_24MHz, dmem_dout => dmem_dout, irq => irq, lfxt_clk => '0', nmi => '0', per_dout => per_dout, pmem_dout => pmem_dout, reset_n => RESET ); ram_8x512_hi : ram_8x512 port map ( addr => dmem_addr, clk => mclk, din => dmem_din (15 downto 8), dout => dmem_dout (15 downto 8), en => dmem_cen, we => dmem_wen (1) ); ram_8x512_lo : ram_8x512 port map ( addr => dmem_addr, clk => mclk, din => dmem_din (7 downto 0), dout => dmem_dout (7 downto 0), en => dmem_cen, we => dmem_wen (0) ); rom_8x2k_hi : rom_8x2k port map ( addr => pmem_addr, clk => mclk, din => (others => '0'), dout => pmem_dout (15 downto 8), en => pmem_cen, we => '1' ); rom_8x2k_lo : rom_8x2k port map ( addr => pmem_addr, clk => mclk, din => (others => '0'), dout => pmem_dout (7 downto 0), en => pmem_cen, we => '1' ); omsp_gpio_0 : omsp_gpio generic map ( P1_EN => '1', -- Enable Port 1 P2_EN => '1', -- Enable Port 2 P3_EN => '0', -- Enable Port 3 P4_EN => '0', -- Enable Port 4 P5_EN => '0', -- Enable Port 5 P6_EN => '0' -- Enable Port 6 ) port map ( irq_port1 => open, irq_port2 => open, p1_dout (7 downto 2) => open, p1_dout (1) => RXD, p1_dout (0) => open, p1_dout_en => open, p1_sel => open, p2_dout => open, p2_dout_en => open, p2_sel => open, p3_dout => open, p3_dout_en => open, p3_sel => open, p4_dout => open, p4_dout_en => open, p4_sel => open, p5_dout => open, p5_dout_en => open, p5_sel => open, p6_dout => open, p6_dout_en => open, p6_sel => open, per_dout => gpio_per_dout, mclk => mclk, p1_din => (others => '0'), p2_din => (others => '0'), p3_din => (others => '0'), p4_din => (others => '0'), p5_din => (others => '0'), p6_din => (others => '0'), per_addr => per_addr, per_din => per_din, per_en => per_en, per_wen => per_wen, puc => puc ); omsp_timerA_0 : omsp_timerA port map ( irq_ta0 => irq_ta0, irq_ta1 => irq_ta1, per_dout => timerA_per_dout, ta_out0 => open, ta_out0_en => open, ta_out1 => open, ta_out1_en => open, ta_out2 => open, ta_out2_en => open, aclk_en => aclk_en, dbg_freeze => '0', inclk => '0', irq_ta0_acc => irq_acc (9), mclk => mclk, per_addr => per_addr, per_din => per_din, per_en => per_en, per_wen => per_wen, puc => puc, smclk_en => smclk_en, ta_cci0a => '0', ta_cci0b => TXD, ta_cci1a => '0', ta_cci1b => '0', ta_cci2a => '0', ta_cci2b => '0', taclk => '0' ); omsp_quadcount_0 : omsp_quadcount port map ( mclk => mclk, per_addr => per_addr, per_din => (others => '0'), per_en => per_en, per_wen => "00", puc => '0', per_irq_acc => '0', per_irq => omsp_quadcount_irq, per_dout => omsp_quadcount_dout, qcount => qcount ); qcounter_0 : qcounter port map ( clock => mclk, reset => ROT_PRESS, a0 => ROT_A, b0 => ROT_B, qcount => qcount, a_rise => open, a_fall => open, b_rise => open, b_fall => open, ab_event => open, ab_error => open ); -------------------------------------------------------------------------------- per_dout <= gpio_per_dout or timerA_per_dout or omsp_quadcount_dout; irq <= (9 => irq_ta0, 8 => irq_ta1, 7 => omsp_quadcount_irq, others => '0'); ROT_FEED <= '1'; end rtl;