##// END OF EJS Templates
LPP IIR FILTER v2.0.0...
LPP IIR FILTER v2.0.0 ADConv v1.1.0 - Re-design of the IIR Filter to compute more "rapidly" (in term of number of cycle) - Re-design of the ADConv to respect the resync rules - Add a global TB for IIR Filter and ADConv in designs/Projet-LeonLFR-AP3K-Sheldon_sim-all

File last commit:

r113:a71a25becd04 JC
r113:a71a25becd04 JC
Show More
Top_Data_Acquisition.vhd
155 lines | 5.2 KiB | text/x-vhdl | VhdlLexer
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
LIBRARY lpp;
USE lpp.lpp_ad_conv.ALL;
use lpp.iir_filter.all;
use lpp.FILTERcfg.all;
ENTITY Top_Data_Acquisition IS
PORT (
-- ADS7886
cnv_run : IN STD_LOGIC;
cnv : OUT STD_LOGIC;
sck : OUT STD_LOGIC;
sdo : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
--
cnv_clk : IN STD_LOGIC;
cnv_rstn : IN STD_LOGIC;
--
clk : IN STD_LOGIC;
rstn : IN STD_LOGIC
);
END Top_Data_Acquisition;
ARCHITECTURE tb OF Top_Data_Acquisition IS
-----------------------------------------------------------------------------
CONSTANT ChanelCount : INTEGER := 8;
CONSTANT ncycle_cnv_high : INTEGER := 79;
CONSTANT ncycle_cnv : INTEGER := 500;
-----------------------------------------------------------------------------
SIGNAL sample : Samples(ChanelCount-1 DOWNTO 0);
SIGNAL sample_val : STD_LOGIC;
SIGNAL sample_val_delay : STD_LOGIC;
-----------------------------------------------------------------------------
CONSTANT Coef_SZ : integer := 9;
CONSTANT CoefCntPerCel: integer := 6;
CONSTANT CoefPerCel : integer := 5;
CONSTANT Cels_count : integer := 5;
signal coefs : std_logic_vector((Coef_SZ*CoefCntPerCel*Cels_count)-1 downto 0);
signal coefs_JC : std_logic_vector((Coef_SZ*CoefPerCel*Cels_count)-1 downto 0);
signal sample_filter_in : samplT(ChanelCount-1 downto 0,17 downto 0);
signal sample_filter_out : samplT(ChanelCount-1 downto 0,17 downto 0);
--
signal sample_filter_JC_out_val : STD_LOGIC;
signal sample_filter_JC_out : samplT(ChanelCount-1 downto 0,17 downto 0);
--
signal sample_filter_JC_out_r_val : STD_LOGIC;
signal sample_filter_JC_out_r : samplT(ChanelCount-1 downto 0,17 downto 0);
BEGIN
-- component instantiation
-----------------------------------------------------------------------------
DIGITAL_acquisition: ADS7886_drvr
GENERIC MAP (
ChanelCount => ChanelCount,
ncycle_cnv_high => ncycle_cnv_high,
ncycle_cnv => ncycle_cnv)
PORT MAP (
cnv_clk => cnv_clk, --
cnv_rstn => cnv_rstn, --
cnv_run => cnv_run, --
cnv => cnv, --
clk => clk, --
rstn => rstn, --
sck => sck, --
sdo => sdo(ChanelCount-1 DOWNTO 0), --
sample => sample,
sample_val => sample_val);
-----------------------------------------------------------------------------
PROCESS (clk, rstn)
BEGIN -- PROCESS
IF rstn = '0' THEN -- asynchronous reset (active low)
sample_val_delay <= '0';
ELSIF clk'event AND clk = '1' THEN -- rising clock edge
sample_val_delay <= sample_val;
END IF;
END PROCESS;
-----------------------------------------------------------------------------
ChanelLoop: for i in 0 to ChanelCount-1 generate
SampleLoop: for j in 0 to 15 generate
sample_filter_in(i,j) <= sample(i)(j);
end generate;
sample_filter_in(i,16) <= sample(i)(15);
sample_filter_in(i,17) <= sample(i)(15);
end generate;
coefs <= CoefsInitValCst;
coefs_JC <= CoefsInitValCst_JC;
FILTER: IIR_CEL_CTRLR
GENERIC MAP (
tech => 0,
Sample_SZ => 18,
ChanelsCount => ChanelCount,
Coef_SZ => Coef_SZ,
CoefCntPerCel => CoefCntPerCel,
Cels_count => Cels_count,
Mem_use => use_CEL) -- use_CEL for SIMU, use_RAM for synthesis
PORT MAP (
reset => rstn,
clk => clk,
sample_clk => sample_val_delay,
sample_in => sample_filter_in,
sample_out => sample_filter_out,
virg_pos => 7,
GOtest => OPEN,
coefs => coefs);
IIR_CEL_CTRLR_v2_1: IIR_CEL_CTRLR_v2
GENERIC MAP (
tech => 0,
Mem_use => use_CEL,
Sample_SZ => 18,
Coef_SZ => Coef_SZ,
Coef_Nb => 25, -- TODO
Coef_sel_SZ => 5, -- TODO
Cels_count => Cels_count,
ChanelsCount => ChanelCount)
PORT MAP (
rstn => rstn,
clk => clk,
virg_pos => 7,
coefs => coefs_JC,
sample_in_val => sample_val_delay,
sample_in => sample_filter_in,
sample_out_val => sample_filter_JC_out_val,
sample_out => sample_filter_JC_out);
-----------------------------------------------------------------------------
PROCESS (clk, rstn)
BEGIN -- PROCESS
IF rstn = '0' THEN -- asynchronous reset (active low)
sample_filter_JC_out_r_val <= '0';
rst_all_chanel: FOR I IN ChanelCount-1 DOWNTO 0 LOOP
rst_all_bits: FOR J IN 17 DOWNTO 0 LOOP
sample_filter_JC_out_r(I,J) <= '0';
END LOOP rst_all_bits;
END LOOP rst_all_chanel;
ELSIF clk'event AND clk = '1' THEN -- rising clock edge
sample_filter_JC_out_r_val <= sample_filter_JC_out_val;
IF sample_filter_JC_out_val = '1' THEN
sample_filter_JC_out_r <= sample_filter_JC_out;
END IF;
END IF;
END PROCESS;
END tb;