VHDL код управления АЦП AD7266

AD7266 на VHDLУправление многоканальным АЦП типа AD7266 посредством ПЛИС имеет некоторые нюансы, которые новичку с наскоку не преодолеть. В данном посте представлен VHDL код управления AD7266 который поможет справиться с этим популярным АЦП. Микросхема выгодна по многим пунктам. Главный из них это многоканальность позволяющая оцифровывать сигнал аж по 12 каналам и по 6 каналам если разбить входы по дифференциальным парам. Такой АЦП идеален для построения различных многоканальных систем, например многоканальных цифровых фильтров, БПФ и др.

Итак согласно документации управление AD7266 - это стандартные сигналы типа SCLK и CS с помощью которых можно дать старт преобразования и по прошествию 13 или 14 тактовых сигналов получить результат. Не будем вдаваться в подробности настройки АЦП внешними управляющими сигналами для работы в различных режимах. Это достаточно подробно описано даташите на микросхему. Остановимся только на VHDL коде для ПЛИС позволяющем стартовать преобразование и получить его результат.


--------------------------------------------------------------------
-- Project 	: Модуль SPI AD7266 
-- Author 	: Acvarif
-- Date 		: 20/02/12 
-- File 		: spiad7266.vhd
--------------------------------------------------------------------
-- Description : Модуль управления АЦП AD7266
--------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity spiad7266 is

	generic 
	(
		-- общая размерность SPI порта 
		DATA_WIDTH 	: natural := 14
	);
	port 
	(
		-- тактовая частота SPI
		spi_sclk	: in std_logic;
		-- глобальный сброс 
		spi_clr		: in std_logic;
		-- CS SPI
		spi_cs		: in std_logic;
		-- вход SPI
		spi_input	: in std_logic;

		-- выходные данные
		data_out	: out std_logic_vector (DATA_WIDTH - 3 downto 0)
	);

end spiad7266;

architecture behavioural of spiad7266 is

	signal s_cnt 				: std_logic_vector (3 downto 0);  
	signal s_spi_data 	: std_logic_vector (0 to DATA_WIDTH - 1);

begin

-- SPI процесс
process(spi_clr, spi_sclk, s_spi_data)

begin
	
	if spi_clr = '0' then 	
		s_cnt <= (others => '0');
		s_spi_data <= (others => '0');
		data_out  <= (others => '0');
	elsif spi_sclk'event and spi_sclk = '1' then
		if spi_cs = '1' then 
			s_cnt <= (others => '0');
			s_spi_data <= (others => '0');
		elsif spi_cs = '0' then 
			s_cnt <= s_cnt + 1;	
			if s_cnt > 0 then 
				s_spi_data(0 to DATA_WIDTH - 1)  <= s_spi_data (1 to DATA_WIDTH - 1) & spi_input;
			end if;
			-- фиксация информации	
			if s_cnt = 13 then 
				data_out <= s_spi_data(2 to 13);
			end if;	
		end if;	
	end if;		

end process; 

end behavioural;

Между двумя импульсами spi_sc необходимо обеспечить не менее 14 отрицательных фронтов тактовых импульсов spi_clk, причем так, чтобы отрицательный фронт spi_cs не совпадал с отрицательным фронтом spi_clk, что, согласно документации на АЦП, обеспечит только один первый неучитываемый нулевой бит результата. Это должен выполняет внешний модуль формирования тактовых импульсов. На нем пока не будем останавливаться. Будем считать, что это все уже имеется. Далее все выполняется за 13 тактов с получением результата в регистре data_out. Для подсчета тактов используется счетчик, который обнуляется по приходу положительного импулься spi_cs.

Нюанс состоит в том, что если сформировать импульс spi_cs так, что он будет совпадать своим отрицательным фронтом с отрицательным фронтом импульса spi_clk, то результат преобразования можно будет получить только через 14 тактов spi_clk, поскольку вначале будет не один неучитываемый нулевой бит результата, а два.

Top.Mail.Ru