RSS Git Download  Clone
Raw Blame History
-- =============================================================================================
--                             	                                                            **
-- =============================================================================================
--	Title: sampck_synth.vhd
--	Description:	VHDL  design file for control of AD9510 on adp_pupe
--	The 'cntrl' module handles the seria communications with the AD9510
--  The 'init' module forces the defualt setup to be loaded following a reset
--	Once intialisation has completed the host can use the read/write strobe ports and the data/address ports
--	to perform read/write cycles.
--  All reads and writes are 8 bit values.
--
--  A maximum of 90 locations exist so requires 7 address bits - port set to 8 bits wide and msb ignored
--	Mod Record
--	===========
--	1)26/03/07		sampck_synth created
--
-- (C) Copyright Alpha Data Parallel Systems Ltd. 1999-2003
--
--
-------------------------------------------------------------------------------------------------



--ToDo
--Fix 'gated clock' message - mux o/p bits in a separate process
--********************************************************************************************








--********************************************************************************************
--			Entity Definition
--
-- Notes:
--********************************************************************************************
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;



--Required for 'attribute' use
--library synplify;
--use synplify.attributes.all;


entity sampck_synth is
generic
(
	END_CNT	:positive := 2
);
port
(
		reset		:in		std_logic;
		clock		:in		std_logic;
		wr_data		:in		std_logic_vector( 7 downto 0);
		rd_data		:out		std_logic_vector( 7 downto 0);
		rd_status	:out	std_logic;
		loc_func		 :in		std_logic;

		address		:in		std_logic_vector( 7 downto 0);

		rd_strobe		:in		std_logic;
		wr_strobe		:in		std_logic;
		busy		:out		std_logic;
		busy_flag		:out		std_logic;
		init_busy		:out		std_logic;


		synth_status	:in	std_logic;		--ad9510 monitor output, fpga input
		synth_sclk	:out	std_logic;		--ad9510 serial clock,   fpga output
		synth_sdio	:out	std_logic;		--ad9510 data in, 		   fpga output
		synth_sdo	:in	std_logic;				--ad 9510 data out,		   fpga input
		synth_csb	:out	std_logic;			--ad9510 cs, active low, fpga output

		synth_func	:out	std_logic			--ad9510 multipurpose input
);
end sampck_synth;
--********************************************************************************************













--********************************************************************************************
--	Architecture Definition
--
--********************************************************************************************
architecture synth of sampck_synth is









--********************************************************************************************
--	Constant/Type Definitions
--********************************************************************************************

constant CNTMSB 	:positive := 7;
--********************************************************************************************


--********************************************************************************************
--	Component Definitions
--********************************************************************************************
component sampck_synth_cntrl is
generic
(
	END_CNT	:positive := 2
);
port
(
		reset		:in		std_logic;
		clock		:in		std_logic;
		wr_data		:in		std_logic_vector( 7 downto 0);
		rd_data		:out		std_logic_vector( 7 downto 0);
		rd_status	:out	std_logic;

		address		:in		std_logic_vector( 7 downto 0);
		loc_func 		:in		std_logic;
		rd_strobe		:in		std_logic;
		wr_strobe		:in		std_logic;
		busy		:out		std_logic;

		synth_status	:in	std_logic;		--ad9510 monitor output, fpga input
		synth_sclk	:out	std_logic;		--ad9510 serial clock,   fpga output
		synth_sdio	:out	std_logic;		--ad9510 data in, 		   fpga output
		synth_sdo	:in	std_logic;				--ad 9510 data out,		   fpga input
		synth_csb	:out	std_logic;			--ad9510 cs, active low, fpga output

		synth_func	:out	std_logic			--ad9510 multipurpose input
);
end component sampck_synth_cntrl;







component sampck_synth_init is
port
(
		reset			:in		std_logic;
		clock			:in		std_logic;
		trigger		:in		std_logic;

		init_done	:out		std_logic;
		wr_strobe	:out		std_logic;
		busy			:in		std_logic;


		address		:out		std_logic_vector( 7 downto 0);
		wr_data		:out		std_logic_vector( 7 downto 0)
);
end component sampck_synth_init;


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







--********************************************************************************************
--	Signal Definitions
--
--********************************************************************************************

signal 	clock_sig :std_logic;
signal 	reset_sig :std_logic;

signal	host_rdstatus_sig :std_logic;


signal 	host_wrdat_sig    :std_logic_vector(7 downto 0);
signal 	host_addr_sig    :std_logic_vector(7 downto 0);
signal 	host_wr_strobe_sig  :std_logic;
signal 	host_rd_strobe_sig  :std_logic;
signal 	host_func_sig  :std_logic;


signal 	synth_init_done_sig  :std_logic;
signal 	synth_init_strobe_sig  :std_logic;
signal 	synth_init_trig_sig  :std_logic;
signal 	synth_init_cnt_sig  :std_logic_vector(CNTMSB downto 0);
signal 	synth_init_data_sig    :std_logic_vector(7 downto 0);
signal 	synth_init_addr_sig    :std_logic_vector(7 downto 0);


signal 	sm_busy_sig  :std_logic;
signal 	sm_busy_flag_sig  :std_logic;
signal 	sm_busypl_sig  :std_logic;
signal 	mux_wrdat_sig    :std_logic_vector(7 downto 0);
signal 	mux_wraddr_sig    :std_logic_vector(7 downto 0);
signal 	host_rddat_sig    :std_logic_vector(7 downto 0);
signal 	mux_wr_strobe_sig  :std_logic;
signal 	mux_rd_strobe_sig  :std_logic;






signal	synth_sclk_sig	:std_logic;
signal	synth_sdio_sig	:std_logic;
signal	synth_sdo_sig	:std_logic;
signal 	synth_csb_sig  :std_logic;
signal	synth_status_sig :std_logic;
signal	synth_func_sig   :std_logic;





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





--********************************************************************************************
--	Attributes
--********************************************************************************************

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



























--********************************************************************************************
--	Architectural Statements
--********************************************************************************************

begin
--==============================================================================================
-- Port mappings
--==============================================================================================
	clock_sig <= clock;
	reset_sig <= reset;

	rd_data<=host_rddat_sig;
	rd_status <= host_rdstatus_sig;

	host_wrdat_sig <=wr_data;
	host_addr_sig <=address;
	host_rd_strobe_sig <= rd_strobe;
	host_wr_strobe_sig <= wr_strobe;
	host_func_sig <= loc_func;


	--Synth ports
	synth_status_sig<=synth_status;
	synth_sclk	  <=synth_sclk_sig;
	synth_sdio	  <= synth_sdio_sig;
	synth_sdo_sig <= synth_sdo;
	synth_csb	    <=synth_csb_sig;
	synth_func	  <=synth_func_sig;
------------------------------------------------------------------------------------------------






--==============================================================================================
--Latch the rising edge of the busy flag for host readback; any read or write strobe
--clears this flag
--==============================================================================================
process(reset_sig,clock_sig)
begin
	if reset_sig = '1' then
		init_busy <= '0';
		busy <= '0';
		busy_flag <= '0';

		sm_busypl_sig <= '0';
		sm_busy_flag_sig <= '0';
	elsif rising_edge(clock_sig) then
		busy        <= sm_busy_sig;
		busy_flag <= sm_busy_flag_sig;
		init_busy		<= not synth_init_done_sig;

		sm_busypl_sig <= sm_busy_sig;

		if host_rd_strobe_sig= '1' or host_rd_strobe_sig ='1' then
			sm_busy_flag_sig <= '0';
		else
			if sm_busypl_sig='0' and sm_busy_sig ='1' then
				sm_busy_flag_sig <= '1';
			end if;
		end if;

	end if;
end process;
------------------------------------------------------------------------------------------------







--==============================================================================================
--Counter to provide a delay then trigger ( rising edge) following a reset
--stops incrementing when MSB is set
--==============================================================================================
process(reset_sig,clock_sig)
begin
	if reset_sig = '1' then
		synth_init_cnt_sig <= ( others => '0');
		synth_init_trig_sig <= '0';
	elsif rising_edge(clock_sig) then
		synth_init_trig_sig <= synth_init_cnt_sig(CNTMSB);

		if synth_init_trig_sig ='0' then
			synth_init_cnt_sig <=synth_init_cnt_sig+ '1';
		end if;
	end if;
end process;
------------------------------------------------------------------------------------------------

--==============================================================================================
-- Mux the host and init signals
--==============================================================================================
process(reset_sig,clock_sig)
begin
	if reset_sig = '1' then
		mux_wrdat_sig  <= (others =>'0');
		mux_wraddr_sig <= (others =>'0');
		mux_rd_strobe_sig <= '0';
		mux_wr_strobe_sig <= '0';
	elsif rising_edge(clock_sig) then
		if synth_init_done_sig ='0' then
			mux_wrdat_sig  <= synth_init_data_sig;
			mux_wraddr_sig <= synth_init_addr_sig;
			mux_rd_strobe_sig <= '0';
			mux_wr_strobe_sig <= synth_init_strobe_sig;
		else
			mux_wrdat_sig  <= host_wrdat_sig;
			mux_wraddr_sig <= host_addr_sig;
			mux_rd_strobe_sig <= host_rd_strobe_sig;
			mux_wr_strobe_sig <= host_wr_strobe_sig;
		end if;
	end if;
end process;
------------------------------------------------------------------------------------------------





--==============================================================================================
-- Runs the initialisation sequence following a reset
--==============================================================================================
initsynth: sampck_synth_init
port map
(
		reset		=> reset_sig,
		clock		=> clock_sig,
		trigger		=>synth_init_cnt_sig(CNTMSB),
		wr_strobe	=>synth_init_strobe_sig,
		init_done		=> synth_init_done_sig,

		busy			=> sm_busy_sig,
		wr_data		=>synth_init_data_sig,
		address		=> synth_init_addr_sig
);


------------------------------------------------------------------------------------------------






--==============================================================================================
-- State machine to generate read and write cycles
--==============================================================================================
cksynth:sampck_synth_cntrl
generic map
(
	END_CNT	=>END_CNT
)
port map
(
		reset		=> reset_sig,
		clock		=> clock_sig,

		wr_data		=> mux_wrdat_sig,
		address		=> mux_wraddr_sig,
		rd_data		=> host_rddat_sig,

		rd_status	=> host_rdstatus_sig,
		busy		 => sm_busy_sig,
		loc_func     => host_func_sig,
		rd_strobe		=>mux_rd_strobe_sig,
		wr_strobe	  =>mux_wr_strobe_sig,

		synth_status	=>synth_status_sig,
		synth_sclk	=>synth_sclk_sig,
		synth_sdio	=> synth_sdio_sig,
		synth_sdo	 => synth_sdo_sig,
		synth_csb	=>synth_csb_sig,
		synth_func	=>synth_func_sig
);
--------------------------------------------------------------------------------------------------







end; -- architecture  sampck_synth
--********************************************************************************************