------------------------------------------------------------------------------------
-- $Archive:: $
-- $Revision:: $
-- $Date:: $
-- $Author:: $
--
--
--
------------------------------------------------------------------------------------
------------------------------------------------------------------------------------
-- Start the real code
------------------------------------------------------------------------------------
library IEEE;
use IEEE.std_logic_1164.all;
--
--
--
entity c5509aevm is
port
(
CLKIN : in std_logic; -- 20 MHz clock in
PONRSn : in std_logic; -- Power on reset from voltage supervisor
PON_CORE : in std_logic; -- Core Power Status
PUSHBRS : in std_logic; -- Push button reset
USB_DSP_RS : in std_logic;
USB_PORSTn : out std_logic;
-- DSP Memory interface signals
DSP_DQ : inout std_logic_vector( 7 downto 0 ); -- DSP Data bus
DSP_ADDR : in std_logic_vector( 4 downto 1 ); -- DSP Address bus
DSP_ADDR20 : in std_logic; -- Upper DSP Address
DSP_ADDR19 : in std_logic;
DSP_ADDR18 : in std_logic;
DSP_ADDR17 : in std_logic;
DSP_WEn : in std_logic; -- DSP Write strobe
DSP_REn : in std_logic; -- DSP Read strobe
DSP_OEn : in std_logic; -- DSP Output enable
DSP_RSn : out std_logic; -- DSP Reset
DSP_RS_LEDn : out std_logic; -- DSP Reset LED
FLASH_CEn : out std_logic;
FLASH_RSn : out std_logic;
-- DSP Memory Chip Select signals
DSP_CS3n : in std_logic; -- DSP DC Chip select
DSP_CS2n : in std_logic; -- DSP DC Chip Select 2
DSP_CS1n : in std_logic; -- Flash Chip Select 2
-- DSP GPIO Lines
DSP_GP6 : in std_logic;
DSP_GP5 : in std_logic;
DSP_TINOUT_0 : inout std_logic;
DSP_INT0 : out std_logic;
DSP_INT1 : out std_logic;
DSP_INT3 : out std_logic;
-- User/Board Support
USER_SW : in std_logic_vector( 3 downto 0 );
USER_LED : out std_logic_vector( 3 downto 0 );
-- NI Interface
DIGIO1 :out std_logic;
DIGIO0 :out std_logic;
-- LCD Interface
oLCD_A0 : out std_logic;
oLCD_SI : out std_logic;
oLCD_SCK : out std_logic;
oLCD_RESET : out std_logic;
-- Daughter Card Support
DC_STAT : in std_logic_vector( 1 downto 0 ); -- DC Status
DC_CNTL : out std_logic_vector( 1 downto 0 ); -- DC Control
DC_DETn : in std_logic; -- DC Detect
DC_POR : in std_logic;
DC_RESETn : out std_logic; -- DC Reset
DC_DBUF_OEn : out std_logic; -- DC Data buffer output enable
DC_CNTL_OEn : out std_logic; -- DC Control buffer enable
DC_DBUF_DIR : out std_logic;
X_TIN0 : inout std_logic;
X_TOUT0 : inout std_logic;
-- Daughter Card Interface
DC_INT3n : in std_logic;
DC_INT1n : in std_logic;
DC_INT0n : in std_logic;
-- Voltage Control
CORE_VCNTL0 : out std_logic;
CORE_VCNTL1 : out std_logic;
--McBSP Multiplexer Control
MCBSP_ONBD_SEL2 : out std_logic;
MCBSP_EXP_SEL2 : out std_logic;
MCBSP_ONBD_SEL0 : out std_logic;
--
WAKE_UP_SW : in std_logic);
----
-- CPLD_Option : in std_logic );
end c5509aevm;
-----------------------------------------------------------------------------------
-- Include standard librariess
-----------------------------------------------------------------------------------
library IEEE;
use IEEE.std_logic_1164.all;
-- use work.std_arith.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
-----------------------------------------------------------------------------------
-- Include fpga specifics here if required.
-- act3 is for Actel 54sx devices. We normally use this for the hardwired
-- clock definition.
-----------------------------------------------------------------------------------
-- library act3;
-- use act3.components.all;
architecture behavior_c5509aevm of c5509aevm is
constant CPLD_VERSION : std_logic_vector(3 downto 0) := "0000";
constant PWB_REV : std_logic_vector(3 downto 0) := "0000";
-----------------------------------------------------------------------------------
-- Add local components in here
-----------------------------------------------------------------------------------
--component MyComponent
--port
--(
--);
--end component;
-----------------------------------------------------------------------------------
-- Add signals
-----------------------------------------------------------------------------------
-- CPLD Register signals
signal MclkDiv : std_logic_vector( 1 downto 0 );
signal LcdClkEn : std_logic;
signal LcdA0 : std_logic;
signal LcdD : std_logic_vector( 7 downto 0 );
signal LcdRequest : std_logic;
signal LcdStart : std_logic;
signal LCD_BUSY : std_logic;
signal LcdMuxD : std_logic;
signal LcdShiftCnt : std_logic_vector( 2 downto 0 );
signal LcdSckOn : std_logic;
signal REG_CEn : std_logic;
signal CpldReg0 : std_logic_vector( 7 downto 0 );
signal CpldReg1 : std_logic_vector( 7 downto 0 );
signal CpldReg2 : std_logic_vector( 7 downto 0 );
signal CpldReg3 : std_logic_vector( 7 downto 0 );
signal CpldReg4 : std_logic_vector( 7 downto 0 );
signal CpldReg5 : std_logic_vector( 7 downto 0 );
signal CpldReg6 : std_logic_vector( 7 downto 0 );
signal CpldReg7 : std_logic_vector( 7 downto 0 );
signal CpldReg8 : std_logic_vector( 7 downto 0 );
signal CpldReg9 : std_logic_vector( 7 downto 0 );
signal CpldReg10 : std_logic_vector( 7 downto 0 );
signal MuxD : std_logic_vector( 7 downto 0 );
signal ChipEnables : std_logic_vector( 10 downto 0 );
signal CpldRegCs0 : std_logic;
signal CpldRegCs1 : std_logic;
signal CpldRegCs2 : std_logic;
signal CpldRegCs3 : std_logic;
signal CpldRegCs4 : std_logic;
signal CpldRegCs5 : std_logic;
signal CpldRegCs6 : std_logic;
signal CpldRegCs7 : std_logic;
signal CpldRegCs8 : std_logic;
signal CpldRegCs9 : std_logic;
signal CpldRegCs10 : std_logic;
signal POWER_UP :std_logic;
signal SystemResetn : std_logic;
signal CpldClkOut : std_logic;
-----------------------------------------------------------------------------------
-- The implementation
-----------------------------------------------------------------------------------
begin
-----------------------------------------------------------------------------------
-- Actel specific definition for the hardwired clock "hclk"
-----------------------------------------------------------------------------------
-- u1: HCLKBUF port map( PAD => iMasterClockIn, Y => oMasterClockIn );
-----------------------------------------------------------------------------------
-- Map the other components
-----------------------------------------------------------------------------------
--u2: my_component port map ( ComponentSignalName => SignalConnection, ... );
-----------------------------------------------------------------------------------
-- Now define the logic
-----------------------------------------------------------------------------------
-- Generate a reset from the three sources. May need to deglitch based on
-- external implementation.
--
-- Generate a CPLD clockout from clock input. This is a place holder just in
-- case we need it later.
--
SystemResetn <= '0' when ( PONRSn = '0' ) or
(PUSHBRS = '1' ) or
(USB_DSP_RS = '0' )
else '1';
DSP_RSn <= '0' when SystemResetn = '0' else '1';
DSP_RS_LEDn <= '0' when SystemResetn = '0' else '1';
FLASH_RSn <= '0' when SystemResetn = '0' else '1';
USB_PORSTn <= '0' when PONRSn = '0'
else '1';
FLASH_CEn <= '0' when (( DSP_CS1n = '0' and DSP_ADDR20 = '0' ) or
( DSP_CS1n = '0' and DSP_ADDR20 = '1' and DSP_ADDR19 = '0') or
( DSP_CS1n = '0' and DSP_ADDR20 = '1' and DSP_ADDR18 = '0') or
( DSP_CS1n = '0' and DSP_ADDR20 = '1' and DSP_ADDR17 = '0'))
else '1';
REG_CEn <= '0' when ( DSP_CS1n = '0' and
DSP_ADDR20 = '1' and DSP_ADDR19 = '1' and DSP_ADDR18 = '1' and DSP_ADDR17 = '1' )
else '1';
--#########################################################################
-- Generic register addresss decode and register chip select generation.
-- VHDL compiler will reduce any unused logic so we can be verbose.
--
process( DSP_ADDR )
begin
case DSP_ADDR( 4 downto 1) is
when "0000" => ChipEnables <= "00000000001";
when "0001" => ChipEnables <= "00000000010";
when "0010" => ChipEnables <= "00000000100";
when "0011" => ChipEnables <= "00000001000";
when "0100" => ChipEnables <= "00000010000";
when "0101" => ChipEnables <= "00000100000";
when "0110" => ChipEnables <= "00001000000";
when "0111" => ChipEnables <= "00010000000";
when "1000" => ChipEnables <= "00100000000";
when "1001" => ChipEnables <= "01000000000";
when "1010" => ChipEnables <= "10000000000";
when others => ChipEnables <= "00000000000";
end case;
end process;
CpldRegCs0 <= '1' when ChipEnables(0) = '1' and REG_CEn = '0' else '0';
CpldRegCs1 <= '1' when ChipEnables(1) = '1' and REG_CEn = '0' else '0';
CpldRegCs2 <= '1' when ChipEnables(2) = '1' and REG_CEn = '0' else '0';
CpldRegCs3 <= '1' when ChipEnables(3) = '1' and REG_CEn = '0' else '0';
CpldRegCs4 <= '1' when ChipEnables(4) = '1' and REG_CEn = '0' else '0';
CpldRegCs5 <= '1' when ChipEnables(5) = '1' and REG_CEn = '0' else '0';
CpldRegCs6 <= '1' when ChipEnables(6) = '1' and REG_CEn = '0' else '0';
CpldRegCs7 <= '1' when ChipEnables(7) = '1' and REG_CEn = '0' else '0';
CpldRegCs8 <= '1' when ChipEnables(8) = '1' and REG_CEn = '0' else '0';
CpldRegCs9 <= '1' when ChipEnables(9) = '1' and REG_CEn = '0' else '0';
CpldRegCs10 <= '1' when ChipEnables(10) = '1' and REG_CEn = '0' else '0';
-- #########################################################################
-- Generate logic for each CPLD register and assign it's write, read, and
-- pin values if necessary.
--
-- All CPLD register writes occur on the rising edge DSP write strobe.
--
-- ========================================================================
-- REG 0: User Register
-- Bit 3-0 Led 3-0
-- Bit 7-4 Switch 3-0
process( SystemResetn, DSP_WEn, CpldRegCs0, DSP_DQ )
begin
if SystemResetn = '0' then
CpldReg0(3 downto 0 ) <= "0000";
elsif DSP_WEn'event and DSP_WEn = '1' then
if( CpldRegCs0 = '1' ) then
CpldReg0( 3 downto 0 ) <= DSP_DQ( 3 downto 0 );
end if;
end if;
end process;
CpldReg0(7 downto 4 ) <= USER_SW( 3 downto 0 );
USER_LED( 3 downto 0 ) <= not CpldReg0(3 downto 0 );
-- ========================================================================
-- REG 1: DC Register
-- Bit 1-0 DC_CNTL 1-0
-- Bit 2 RESERVED
-- Bit 3 DC_RESET
-- Bit 5-4 DC_STAT 1-0
-- Bit 6 RESERVED
-- Bit 7 DC_DETECT
--
process( SystemResetn, DSP_WEn, CpldRegCs1, DSP_DQ )
begin
if SystemResetn = '0' then
CpldReg1(1 downto 0 ) <= "00";
CpldReg1(3) <= '0';
elsif DSP_WEn'event and DSP_WEn = '1' then
if( CpldRegCs1 = '1' ) then
CpldReg1( 1 downto 0 ) <= DSP_DQ( 1 downto 0 );
CpldReg1(3) <= DSP_DQ(3);
end if;
end if;
end process;
CpldReg1(2) <= '0';
CpldReg1(5 downto 4 ) <= DC_STAT( 1 downto 0 );
CpldReg1(6) <= '0';
CpldReg1(7) <= not DC_DETn;
DC_CNTL( 1 downto 0 ) <= CpldReg1( 1 downto 0 );
DC_RESETn <= '0' when CpldReg1(3) = '1'
or DC_POR = '0' else '1';
-- ========================================================================
-- REG 4: Version Register
-- Bit 2-0 PWB Revision 2-0
-- Bit 3 NU read 0
-- Bit 7-4 CPLD version
CpldReg4(7 downto 0 ) <= CPLD_VERSION(3 downto 0 ) & PWB_REV(3 downto 0 );
-- ========================================================================
-- REG 6: Misc. Register
-- Bit 0 McBSP0 aic23 enable
-- Bit 1 MCBsp2 expansion
-- Bit 2 RESERVED
-- Bit 3 RESERVED
-- Bit 4 RESERVED
-- Bit 5 RESERVED
-- Bit 6 RESERVED
-- Bit 7 mcbsp0 select
process( SystemResetn, DSP_WEn, CpldRegCs6, DSP_DQ )
begin
if SystemResetn = '0' then
CpldReg6 <= "00000000";
elsif DSP_WEn'event and DSP_WEn = '1' then
if( CpldRegCs6 = '1' ) then
CpldReg6 <= DSP_DQ;
end if;
end if;
end process;
MCBSP_ONBD_SEL0 <= NOT CpldReg6(0);
MCBSP_ONBD_SEL2 <= CpldReg6(1);
MCBSP_EXP_SEL2 <= NOT CpldReg6(1);
DSP_TINOUT_0 <= X_TIN0 when CpldReg6(2) = '1'
else 'Z';
X_TOUT0 <= DSP_TINOUT_0 when CpldReg6(2) = '1'
else 'Z';
CORE_VCNTL0 <= CpldReg6(6) when CpldReg6(4) = '1'
else DSP_GP5;
CORE_VCNTL1 <= CpldReg6(7) when CpldReg6(4) = '1'
else DSP_GP6;
DIGIO1 <= CpldReg6(7) when CpldReg6(4) = '1'
else DSP_GP6;
DIGIO0 <= CpldReg6(6) when CpldReg6(4) = '0'
else DSP_GP5;
-- ========================================================================
-- REG 7: Interrupt Register
-- Bit 0 RESERVED
-- Bit 1 RESERVED
-- Bit 2 RESERVED
-- Bit 3 RESERVED
-- Bit 4 RESERVED
-- Bit 5 RESERVED
-- Bit 6 RESERVED
-- Bit 7 RESERVED
process( SystemResetn, DSP_WEn, CpldRegCs7, DSP_DQ )
begin
if SystemResetn = '0' then
CpldReg7 <= "00000000";
elsif DSP_WEn'event and DSP_WEn = '1' then
if( CpldRegCs7 = '1' ) then
CpldReg7 <= DSP_DQ;
end if;
end if;
end process;
---
POWER_UP <= PON_CORE;
DSP_INT0 <= '0' when ((CpldReg7(0) = '1' and WAKE_UP_SW = '1') OR
(CpldReg7(4) = '1' and POWER_UP = '1' ) OR
(DC_INT0n = '0'))
else '1';
DSP_INT1 <= '0' when ((CpldReg7(1) = '1' and WAKE_UP_SW = '1') OR
(CpldReg7(5) = '1' and POWER_UP = '1') OR
(DC_INT1n = '0'))
else '1';
DSP_INT3 <= '0' when ((CpldReg7(3) = '1' and WAKE_UP_SW = '1') OR
(CpldReg7(7) = '1' and POWER_UP = '1') OR
(DC_INT3n = '0'))
else '1';
-- #################################################################
-- LCD
--
-- Create a divide by 4 clock with a LcdClkEn.
-- DivClk LcdClkEn
-- 00 0
-- 01 0
-- 10 1
-- 11 0
-- All states operate on Mclk when LcdClkEn = '1'.
-- A 1-100
-- A 1-101
--
process( SystemResetn, CLKIN )
begin
if SystemResetn = '0' then
MclkDiv <= (others => '0' );
LcdClkEn <= '0';
elsif CLKIN'event and CLKIN = '1' then
MclkDiv <= MclkDiv + 1;
if( MclkDiv = "10" ) then
LcdClkEn <= '1';
else
LcdClkEn <= '0';
end if;
end if;
end process;
-- Latch the data and address on the rising edge of DSP_WEnn
process( DSP_WEn, SystemResetn, CpldRegCs8,CpldRegCs9,DSP_DQ )
begin
if SystemResetn = '0' then
LcdD <= ( others => '0' );
LcdA0 <= '0';
elsif DSP_WEn'event and DSP_WEn = '1' then
if ( CpldRegCs8 = '1'
or CpldRegCs9 = '1' ) then
LcdD <= DSP_DQ;
LcdA0 <= DSP_ADDR(1);
end if;
end if;
end process;
-- Generate a LCD Start edge. We clear the edge once we have
-- detected it with LcdStart.
process( DSP_WEn, SystemResetn, CpldRegCs8, CpldRegCs9, LcdStart )
begin
if SystemResetn = '0' or LcdStart = '1' then
LcdRequest <= '0';
elsif DSP_WEn'event and DSP_WEn = '1' then
if ( CpldRegCs8 = '1'
or CpldRegCs9 = '1' ) then
LcdRequest <= '1';
end if;
end if;
end process;
-- Generate the LCD start request.
-- If we have a spare flip-flop we should sync before
-- using it.
--
process( SystemResetn, CLKIN, LcdRequest, LcdClkEn )
begin
if SystemResetn = '0' then
LcdStart <= '0';
elsif CLKIN'event and CLKIN = '1' then
if( LcdClkEn = '1' ) then
LcdStart <= LcdRequest;
end if;
end if;
end process;
-- Load the shift count with 0 on start and count up to 7
-- The LcdSckOn signal is ON for Load/Count and OFF otherwise.
--
process( SystemResetn, CLKIN, LcdStart, LcdClkEn )
begin
if SystemResetn = '0' then
LcdShiftCnt <= (others => '1');
LcdSckOn <= '0';
elsif CLKIN'event and CLKIN = '1' then
if( LcdClkEn = '1' ) then
LcdSckOn <= '0'; -- Default
if LcdStart = '1' then
LcdShiftCnt <= "000";
LcdSckOn <= '1';
else
if LcdShiftCnt /= "111" then
LcdShiftCnt <= LcdShiftCnt + "001";
LcdSckOn <= '1';
end if;
end if;
end if;
end if;
end process;
-- Mux out the data
process( LcdShiftCnt, LcdD )
begin
case LcdShiftCnt( 2 downto 0 ) is
when "111" => LcdMuxD <= LcdD(0);
when "110" => LcdMuxD <= LcdD(1);
when "101" => LcdMuxD <= LcdD(2);
when "100" => LcdMuxD <= LcdD(3);
when "011" => LcdMuxD <= LcdD(4);
when "010" => LcdMuxD <= LcdD(5);
when "001" => LcdMuxD <= LcdD(6);
when others => LcdMuxD <= LcdD(7);
end case;
end process;
oLCD_SI <= LcdMuxD;
oLCD_SCK <= MclkDiv(1) when LcdSckOn = '1' else '1';
oLCD_A0 <= LcdA0;
LCD_BUSY <= '0' when ( LcdRequest = '1'
or LcdStart = '1'
or LcdSckOn = '1' ) else '1';
-- ========================================================================
-- REG 10: xxxx. Register
-- Bit 0 RESERVED
-- Bit 1 RESERVED
-- Bit 2 RESERVED
-- Bit 3 RESERVED
-- Bit 4 RESERVED
-- Bit 5 RESERVED
-- Bit 6 KEYBOARD_RESET
-- Bit 7 REad LCD_BUSY
process( SystemResetn, DSP_WEn, CpldRegCs10, DSP_DQ )
begin
if SystemResetn = '0' then
CpldReg10 <= "00000000";
elsif DSP_WEn'event and DSP_WEn = '1' then
if( CpldRegCs10 = '1' ) then
CpldReg10 <= DSP_DQ;
end if;
end if;
end process;
-- Controls CORE Voltage
oLCD_RESET <= '0' when SystemResetn = '0' or CpldReg10(6)='1' else '1';
-- =======================================================================
-- Mux the read data from all the registers and output for reads
--
process( DSP_ADDR,LCD_BUSY,CpldReg0,CpldReg1,CpldReg4,CpldReg6,CpldReg7,CpldReg10 )
begin
case DSP_ADDR( 4 downto 1) is
when "0000" => MuxD <= CpldReg0;
when "0001" => MuxD <= CpldReg1;
when "0100" => MuxD <= CpldReg4;
when "0110" => MuxD <= CpldReg6;
when "0111" => MuxD <= CpldReg7;
when "1010" => MuxD <= LCD_BUSY & CpldReg10(6 downto 0 );
when others => MuxD <= "00000000";
end case;
end process;
DSP_DQ <= MuxD when DSP_CS1n = '0'
and DSP_REn = '0'
and DSP_OEn = '0'
and DSP_ADDR17 = '1'
and DSP_ADDR18 = '1'
and DSP_ADDR19 = '1' -- for UART or CPLD Select
and DSP_ADDR20 = '1'
else "ZZZZZZZZ";
-- ONBD_BUF_DIR <= NOT DSP_REn;
---
--- ONBD_BUF_OEn <= '0' when (( DSP_CS3n = '0' and CpldReg10(3)='1') or DSP_CS2n = '0'or DSP_CS1n = '0')
--- else '1';
-- #########################################################################
-- Generate the Daughter card buffer control signals
--
-- Point the data buffer direction to the DC if not reading.
-- Only enable the DC buffer if reading and daughter card is installed
-- Only enable control ouput signals if daughter card is installed
--
DC_DBUF_OEn <= '0' when ( DC_DETn = '0' and DSP_CS2n = '0')
or ( DC_DETn = '0' and DSP_CS3n = '0')
else '1';
DC_CNTL_OEn <= '0' when DC_DETn = '0' else '1';
DC_DBUF_DIR <= DSP_REn;
end behavior_c5509aevm;
|
|