|
|
|
|
|
LIBRARY IEEE;
|
|
|
USE IEEE.STD_LOGIC_1164.ALL;
|
|
|
USE IEEE.NUMERIC_STD.ALL;
|
|
|
LIBRARY lpp;
|
|
|
USE lpp.lpp_ad_conv.ALL;
|
|
|
USE lpp.general_purpose.SYNC_FF;
|
|
|
|
|
|
ENTITY top_ad_conv_ADS7886_v2 IS
|
|
|
GENERIC(
|
|
|
ChannelCount : INTEGER := 8;
|
|
|
SampleNbBits : INTEGER := 14;
|
|
|
ncycle_cnv_high : INTEGER := 40; -- at least 32 cycles
|
|
|
ncycle_cnv : INTEGER := 500);
|
|
|
PORT (
|
|
|
-- CONV
|
|
|
cnv_clk : IN STD_LOGIC;
|
|
|
cnv_rstn : IN STD_LOGIC;
|
|
|
cnv : OUT STD_LOGIC;
|
|
|
-- DATA
|
|
|
clk : IN STD_LOGIC;
|
|
|
rstn : IN STD_LOGIC;
|
|
|
sck : OUT STD_LOGIC;
|
|
|
sdo : IN STD_LOGIC_VECTOR(ChannelCount-1 DOWNTO 0);
|
|
|
-- SAMPLE
|
|
|
sample : OUT Samples14v(ChannelCount-1 DOWNTO 0);
|
|
|
sample_val : OUT STD_LOGIC
|
|
|
);
|
|
|
END top_ad_conv_ADS7886_v2;
|
|
|
|
|
|
ARCHITECTURE ar_top_ad_conv_ADS7886_v2 OF top_ad_conv_ADS7886_v2 IS
|
|
|
|
|
|
SIGNAL cnv_cycle_counter : INTEGER;
|
|
|
SIGNAL cnv_s : STD_LOGIC;
|
|
|
SIGNAL cnv_sync : STD_LOGIC;
|
|
|
SIGNAL cnv_sync_not : STD_LOGIC;
|
|
|
|
|
|
SIGNAL sample_adc : Samples(ChannelCount-1 DOWNTO 0);
|
|
|
SIGNAL sample_val_adc : STD_LOGIC;
|
|
|
|
|
|
BEGIN
|
|
|
|
|
|
|
|
|
-----------------------------------------------------------------------------
|
|
|
-- CONV
|
|
|
-----------------------------------------------------------------------------
|
|
|
PROCESS (cnv_clk, cnv_rstn)
|
|
|
BEGIN -- PROCESS
|
|
|
IF cnv_rstn = '0' THEN -- asynchronous reset (active low)
|
|
|
cnv_cycle_counter <= 0;
|
|
|
cnv_s <= '0';
|
|
|
ELSIF cnv_clk'EVENT AND cnv_clk = '1' THEN -- rising clock edge
|
|
|
-- IF cnv_run = '1' THEN
|
|
|
IF cnv_cycle_counter < ncycle_cnv THEN
|
|
|
cnv_cycle_counter <= cnv_cycle_counter +1;
|
|
|
IF cnv_cycle_counter < ncycle_cnv_high THEN
|
|
|
cnv_s <= '1';
|
|
|
ELSE
|
|
|
cnv_s <= '0';
|
|
|
END IF;
|
|
|
ELSE
|
|
|
cnv_s <= '1';
|
|
|
cnv_cycle_counter <= 0;
|
|
|
END IF;
|
|
|
--ELSE
|
|
|
-- cnv_s <= '0';
|
|
|
-- cnv_cycle_counter <= 0;
|
|
|
--END IF;
|
|
|
END IF;
|
|
|
END PROCESS;
|
|
|
|
|
|
cnv <= NOT(cnv_s);
|
|
|
|
|
|
-----------------------------------------------------------------------------
|
|
|
-- SYNC CNV
|
|
|
-----------------------------------------------------------------------------
|
|
|
|
|
|
SYNC_FF_cnv : SYNC_FF
|
|
|
GENERIC MAP (
|
|
|
NB_FF_OF_SYNC => 2)
|
|
|
PORT MAP (
|
|
|
clk => clk,
|
|
|
rstn => rstn,
|
|
|
A => cnv_s, -- the data fetching begins immediately
|
|
|
A_sync => cnv_sync);
|
|
|
|
|
|
-----------------------------------------------------------------------------
|
|
|
|
|
|
cnv_sync_not <= NOT(cnv_sync);
|
|
|
|
|
|
ADS7886_drvr_v2_1 : ADS7886_drvr_v2
|
|
|
GENERIC MAP(
|
|
|
ChannelCount => 8,
|
|
|
NbBitsSamples => 16)
|
|
|
PORT MAP(
|
|
|
-- CONV --
|
|
|
cnv_clk => cnv_sync_not,
|
|
|
cnv_rstn => rstn,
|
|
|
-- DATA --
|
|
|
clk => clk, -- master clock, 25 MHz
|
|
|
rstn => rstn,
|
|
|
sck => sck,
|
|
|
sdo => sdo,
|
|
|
-- SAMPLE --
|
|
|
sample => sample_adc,
|
|
|
sample_val => sample_val_adc);
|
|
|
|
|
|
PROCESS (clk, rstn)
|
|
|
BEGIN -- PROCESS
|
|
|
IF rstn = '0' THEN -- asynchronous reset (active low)
|
|
|
FOR k IN 0 TO ChannelCount-1 LOOP
|
|
|
sample(k)(13 DOWNTO 0) <= (OTHERS => '0');
|
|
|
END LOOP;
|
|
|
sample_val <= '0';
|
|
|
ELSIF clk'EVENT AND clk = '1' THEN -- rising clock edge
|
|
|
IF sample_val_adc = '1' THEN
|
|
|
FOR k IN 0 TO ChannelCount-1 LOOP
|
|
|
IF (UNSIGNED(sample_adc(k)(11 DOWNTO 0)) >= 2048) THEN
|
|
|
sample(k)(13 DOWNTO 0) <= "00" &
|
|
|
STD_LOGIC_VECTOR(UNSIGNED(sample_adc(k)(11 DOWNTO 0)) - 2048);
|
|
|
ELSE
|
|
|
sample(k)(13 DOWNTO 0) <= "11" &
|
|
|
STD_LOGIC_VECTOR(UNSIGNED(sample_adc(k)(11 DOWNTO 0)) - 2048);
|
|
|
END IF;
|
|
|
END LOOP;
|
|
|
sample_val <= sample_val_adc;
|
|
|
ELSE
|
|
|
sample_val <= '0';
|
|
|
END IF;
|
|
|
END IF;
|
|
|
END PROCESS;
|
|
|
|
|
|
END ar_top_ad_conv_ADS7886_v2;
|
|
|
|