⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 top_level.vhd

📁 Serial ADC Interface write in VHDL based on xilinx cpld
💻 VHD
字号:
-- **************************************************************
-- 
-- Owner:	Xilinx Inc.
-- File:  	top_level.vhd
--
-- Purpose:  	This top level file creates the bidirectional buffering
--           	scheme in the XPLA3.  It instantiates the state machine 
--		   	   which sends a bunch of bytes to the ADS7870.  
--
--
-- **************************************************************

library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_arith.all;

entity TOP_LEVEL is
	port(
	SP_CS0n	 		: in 	STD_LOGIC;
	SP_CS1n   		: in 	STD_LOGIC;
	SP_WEn  		: in 	STD_LOGIC;
	SP_OEn			: in 	STD_LOGIC;
	SP_D			: inout STD_LOGIC_VECTOR(15 DOWNTO 0);
	SP_A			: in 	STD_LOGIC_VECTOR(23 DOWNTO 1);
	SP_A_0 			: out   STD_LOGIC;
	CHIP3_EN		: out 	STD_LOGIC;
	A			: out 	STD_LOGIC_VECTOR(22 DOWNTO 0);
	D			: inout STD_LOGIC_VECTOR(15 DOWNTO 0);
	FLASH_CS0n		: out 	STD_LOGIC;
	FLASH_WR_PROTECT	: out 	STD_LOGIC;
	SRAM_CS1n		: inout STD_LOGIC;
	OEn			: out 	STD_LOGIC;
	RWn			: out 	STD_LOGIC;

	IO13			: out 	STD_LOGIC;

	SRAM_UPPER_BYTEn	: out 	STD_LOGIC;
	SRAM_LOW_BYTEn		: out 	STD_LOGIC;

	--ADS7870 Signals
	Cclk			: in	STD_LOGIC;
	Sclk			: inout	STD_LOGIC;
	Din			: out 	STD_LOGIC;
	Dout			: in 	STD_LOGIC;
	AD_CHIP2_ENn		: out 	STD_LOGIC;
	RISE_FALL 		: out 	STD_LOGIC;
	CONVERT 	 	: out 	STD_LOGIC;
	OSC_CNTRL 		: out 	STD_LOGIC;
	ADS_RESET		: out 	STD_LOGIC;	
	BUSY			: in 	STD_LOGIC;
	
	BUSY_TEST		: out 	STD_LOGIC;

--	AD_D0			: in 	STD_LOGIC;
--	AD_D1			: in 	STD_LOGIC;
--	AD_D2			: in 	STD_LOGIC;
--	AD_D3			: in 	STD_LOGIC;


--	SRAM_Write_En		: inout	STD_LOGIC;

	LED1_SEL		: out 	STD_LOGIC;
	LED2_SEL		: out 	STD_LOGIC;
	LED3_SEL		: out 	STD_LOGIC;
	LED4_SEL		: out 	STD_LOGIC

	);

end TOP_LEVEL;

architecture BEHAVE of TOP_LEVEL is


constant RESET_ADDR : STD_LOGIC_VECTOR(23 downto 0) := "000000000000000000111110";  -- A1 to A5 asserted 


-- ************************ SIGNAL DECLARATIONS *****************
signal X								: STD_LOGIC;
signal SM_WE						: STD_LOGIC;

signal SRAM_Write_En 			: STD_LOGIC;
signal SRAM_Read_En 				: STD_LOGIC;
signal SRAM_ReADDATA			: STD_LOGIC_VECTOR(15 DOWNTO 0);
signal SRAM_Write_Data			: STD_LOGIC_VECTOR(15 DOWNTO 0);
	
signal StateMachine_SRAM_ENn		: STD_LOGIC;
signal StateMachine_WE			: STD_LOGIC;
signal StateMachine_OE			: STD_LOGIC;

signal MUX_OUT				: STD_LOGIC_VECTOR(15 DOWNTO 0);
signal Mux_Sel				: STD_LOGIC;

signal SM_ADDRESS			: STD_LOGIC_VECTOR(22 DOWNTO 0);

signal ADC_DATA				: STD_LOGIC_VECTOR(15 DOWNTO 0);

signal RESET_BUTTON			: STD_LOGIC;

component ADC_INTERFACE 
	port(
		--ADS7870 Signals 
		Cclk			: 	in	 STD_LOGIC;
		Sclk			: 	inout STD_LOGIC;
		Din			: 	out STD_LOGIC;
		Dout			: 	in  STD_LOGIC;
		AD_CHIP2_ENn		: 	out STD_LOGIC;
		busy				: 	in  STD_LOGIC;
		busy_test		:  out STD_LOGIC;
		ADS_reset		:  out STD_LOGIC;
		RISE_FALL 		:  out STD_LOGIC;
		CONVERT 	 		:  out STD_LOGIC;
		OSC_CNTRL 		:  out STD_LOGIC;

			-- Miscellaneous Signals

		ADC_DATA		:	out STD_LOGIC_VECTOR(15 downto 0);
		Reset_Button		:	in  STD_LOGIC;


			-- StateMachine Specific Signals

		Mux_Sel			:  out STD_LOGIC;
		statemachine_sram_enn	: inout STD_LOGIC;
		statemachine_we		: inout STD_LOGIC;
		statemachine_oe		: out STD_LOGIC;
		SM_ADDRESS		: 	inout STD_LOGIC_VECTOR(22 DOWNTO 0);
		SM_WE			: 	out STD_LOGIC
	     );
	     
end component;


begin


ASSERT_RESET_BUTTON: process(SP_A, SP_D, SP_WEn, SP_CS1n)
begin
	if(SP_CS1n = '0') then
		if(SP_WEn'event and SP_WEn='1') then
		  	if (SP_D = "1111111111111111" and (SP_A & '0') = RESET_ADDR) then
		  		RESET_BUTTON <= '0'; -- reset SM
		  	
		  	elsif (SP_D = "0000000000000000" and (SP_A & '0') = RESET_ADDR) then
		  		RESET_BUTTON<= '1';
		  	
		  	end if;
		end if;
	 end if;
	 
end process ASSERT_RESET_BUTTON;


--
--                                                           SRAM_Write_En
--                                                                  |
--                                            ---------------------|>---
--                                           |                           | 
--                 SRAM_Read_En              |                            ---[]  D
--                       |                   |    SRAM_ReADDATA         |
--                  ----<|-------------------|---------------------<|----
--                 |                         |
--   DATA []--------                         |
--                 |       SRAM_Write_Data   |
--                  ----|>-------------------
--
-- 
--
--



--Create 2:1 Multiplexer
--
--                      |\
--   SRAM_Write_Data   -| |
--                      | |- MUX_OUT
--         ADC_DATA    -| |
--                      |/
--                       |
--                      Mux_Sel

MUX_OUT(15 DOWNTO 0) <= SRAM_Write_Data(15 DOWNTO 0) when Mux_Sel = '0' else
								ADC_DATA;


SRAM_Write_En <= SM_WE or (not SM_WE and ( not SP_WEn and (not SP_CS0n or not SP_CS1n) ) ); -- Enable Signal		




-- Bidirectional Bus, D (Goes TO/FROM the springboard):

D(15 DOWNTO 0) <=  MUX_OUT(15 DOWNTO 0) when (SRAM_Write_En = '1') else (others => 'Z');

SRAM_READDATA(15 DOWNTO 0) <= D(15 DOWNTO 0);


SRAM_Read_En <= not SP_OEn and (not SP_CS0n or not SP_CS1n);  --  Enable Signal

-- Bidirectional Bus, DATA (Goes TO/FROM Handspring Unit):
SP_D(15 DOWNTO 0) <= SRAM_READDATA(15 DOWNTO 0) when (SRAM_Read_En = '1') else (others => 'Z');

SRAM_Write_Data(15 DOWNTO 0) <= SP_D(15 DOWNTO 0);


	
--************************************************************************



--Create 2:1 Multiplexer
--
--                      |\
--	   SP_CS1n     -| |
--                      | |- SRAM_CS1n
--StateMachine_SRAM_Enn-| |
--                      |/
--                       |
--                      Mux_Sel

SRAM_CS1n <= SP_CS1n when Mux_Sel = '0' else
	  StateMachine_SRAM_Enn;


--Create 2:1 Multiplexer
--
--                      |\
--		SP_WEn -| |
--                      | |- RWn
--StateMachine_WE      -| |
--                      |/
--                       |
--                      Mux_Sel

RWn <= SP_WEn when Mux_Sel = '0' else
			  StateMachine_WE;

--Create 2:1 Multiplexer
--
--                      |\
--	      SP_OEn   -| |
--                      | |- OEn
--StateMachine_OE      -| |
--                      |/
--                       |
--                      Mux_Sel

OEn <= SP_OEn when Mux_Sel = '0' else
	  StateMachine_OE;




--Create 2:1 Multiplexer
--
--                      |\
--             SP_A    -| |
--                      | |- A
--       Addr_count    -| |
--                      |/
--                       |
--                      Mux_Sel

A(22 DOWNTO 0) <= SP_A(23 DOWNTO 1) when Mux_Sel = '0' else
			  SM_ADDRESS;

SP_A_0 <= '0';  --  SP_A(0) is not used in this version of Handspring Visor
     


--SRAM Control Signals
SRAM_UPPER_BYTEn	<= '0';
SRAM_LOW_BYTEn		<= '0';

--Flash Control Signals
FLASH_CS0n 	<= '1';
FLASH_WR_PROTECT	<= '1';

--Miscellaneous
CHIP3_EN <= SP_CS1n;    -- Brings CS1 to an outside pin so we can probe it
IO13 		<= SRAM_CS1n;


--LED's
led1_sel <= '1'; --  not AD_D0;  --Turn LEDs on when AD_IO pins are logic high
led2_sel <= '1'; --not AD_D1;
led3_sel <= '1'; --not AD_D2;
led4_sel <= '1'; --not AD_D3;




-- *************************** State Machine Instantiation *******************
ADC : ADC_INTERFACE
  port map(
		--ADS7870 Signals 
		Cclk				=>   Cclk,
		Sclk				=>   Sclk,
		Din				=>   Din,
		Dout				=>   Dout,
		AD_CHIP2_ENn			=>   AD_CHIP2_ENn,
		busy				=>   busy,
		busy_test			=>   busy_test,
		ADS_RESET			=>   ADS_RESET,
		RISE_FALL 			=>   RISE_FALL,
		CONVERT 	 		=>   CONVERT,
		OSC_CNTRL 			=>   OSC_CNTRL,
		ADC_DATA			=>   ADC_DATA,			
		Reset_Button			=>   Reset_Button,

		Mux_Sel				=>   Mux_Sel,
		
		statemachine_sram_enn 		=>  statemachine_sram_enn,
		statemachine_we		  	=>  statemachine_we,
		statemachine_oe		 	=>  statemachine_oe,
		SM_ADDRESS			=>  SM_ADDRESS,
 		SM_WE				=>   SM_WE



		);

END BEHAVE;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -