library ieee; use ieee.std_logic_1164.all; use IEEE.numeric_std.all; library grlib, techmap; use grlib.amba.all; use grlib.amba.all; use grlib.stdlib.all; use techmap.gencomp.all; use techmap.allclkgen.all; library gaisler; use gaisler.memctrl.all; use gaisler.leon3.all; use gaisler.uart.all; use gaisler.misc.all; --use gaisler.sim.all; library lpp; use lpp.lpp_ad_conv.all; use lpp.lpp_amba.all; use lpp.apb_devices_list.all; use lpp.general_purpose.all; use lpp.Rocket_PCM_Encoder.all; use work.Convertisseur_config.all; use work.config.all; entity ici4 is generic ( fabtech : integer := CFG_FABTECH; memtech : integer := CFG_MEMTECH; padtech : integer := CFG_PADTECH; clktech : integer := CFG_CLKTECH; WordSize : integer := 8; WordCnt : integer := 144;MinFCount : integer := 64 ); port ( reset : in std_ulogic; clk : in std_ulogic; sclk : in std_logic; Gate : in std_logic; MinF : in std_logic; MajF : in std_logic; Data : out std_logic; DC_ADC_Sclk : out std_logic; DC_ADC_IN : in std_logic_vector(1 downto 0); DC_ADC_ClkDiv : out std_logic; DC_ADC_FSynch : out std_logic; SET_RESET0 : out std_logic; SET_RESET1 : out std_logic; LED : out std_logic ); end; architecture rtl of ici4 is signal clk_buf,reset_buf : std_logic; Constant FramePlacerCount : integer := 2; signal MinF_Inv : std_logic; signal Gate_Inv : std_logic; signal sclk_Inv : std_logic; signal WordCount : integer range 0 to WordCnt-1; signal WordClk : std_logic; signal data_int : std_logic; signal MuxOUT : std_logic_vector(WordSize-1 downto 0); signal MuxIN : std_logic_vector((2*WordSize)-1 downto 0); signal Sel : integer range 0 to 1; signal AMR1X : std_logic_vector(23 downto 0); signal AMR1Y : std_logic_vector(23 downto 0); signal AMR1Z : std_logic_vector(23 downto 0); signal AMR2X : std_logic_vector(23 downto 0); signal AMR2Y : std_logic_vector(23 downto 0); signal AMR2Z : std_logic_vector(23 downto 0); signal AMR3X : std_logic_vector(23 downto 0); signal AMR3Y : std_logic_vector(23 downto 0); signal AMR3Z : std_logic_vector(23 downto 0); signal AMR4X : std_logic_vector(23 downto 0); signal AMR4Y : std_logic_vector(23 downto 0); signal AMR4Z : std_logic_vector(23 downto 0); signal Temp1 : std_logic_vector(23 downto 0); signal Temp2 : std_logic_vector(23 downto 0); signal Temp3 : std_logic_vector(23 downto 0); signal Temp4 : std_logic_vector(23 downto 0); signal LF1 : std_logic_vector(15 downto 0); signal LF2 : std_logic_vector(15 downto 0); signal LF3 : std_logic_vector(15 downto 0); signal LF1_int : std_logic_vector(23 downto 0); signal LF2_int : std_logic_vector(23 downto 0); signal LF3_int : std_logic_vector(23 downto 0); signal DC_ADC_SmplClk : std_logic; signal LF_ADC_SmplClk : std_logic; signal SET_RESET0_sig : std_logic; signal SET_RESET1_sig : std_logic; signal MinFCnt : integer range 0 to MinFCount-1; signal FramePlacerFlags : std_logic_vector(FramePlacerCount-1 downto 0); begin clk_buf <= clk; reset_buf <= reset; -- Gate_Inv <= not Gate; sclk_Inv <= not Sclk; MinF_Inv <= not MinF; LED <= not data_int; data <= data_int; SD0 : Serial_Driver generic map(WordSize) port map(sclk_Inv,MuxOUT,Gate_inv,data_int); WC0 : Word_Cntr generic map(WordSize,WordCnt) port map(sclk_Inv,MinF,WordClk,WordCount); MFC0 : MinF_Cntr generic map(MinFCount) port map( clk => MinF_Inv, reset => MajF, Cnt_out => MinFCnt ); MUX0 : Serial_Driver_Multiplexor generic map(FramePlacerCount,WordSize) port map(sclk_Inv,Sel,MuxIN,MuxOUT); DCFP0 : entity work.DC_FRAME_PLACER generic map(WordSize,WordCnt,MinFCount) port map( clk => Sclk, Wcount => WordCount, MinFCnt => MinFCnt, Flag => FramePlacerFlags(0), AMR1X => AMR1X, AMR1Y => AMR1Y, AMR1Z => AMR1Z, AMR2X => AMR2X, AMR2Y => AMR2Y, AMR2Z => AMR2Z, AMR3X => AMR3X, AMR3Y => AMR3Y, AMR3Z => AMR3Z, AMR4X => AMR4X, AMR4Y => AMR4Y, AMR4Z => AMR4Z, Temp1 => Temp1, Temp2 => Temp2, Temp3 => Temp3, Temp4 => Temp4, WordOut => MuxIN(7 downto 0)); LFP0 : entity work.LF_FRAME_PLACER generic map(WordSize,WordCnt,MinFCount) port map( clk => Sclk, Wcount => WordCount, Flag => FramePlacerFlags(1), LF1 => LF1, LF2 => LF2, LF3 => LF3, WordOut => MuxIN(15 downto 8)); DC_SMPL_CLK0 : entity work.DC_SMPL_CLK port map(MinF_Inv,DC_ADC_SmplClk); process(reset,DC_ADC_SmplClk) begin if reset = '0' then SET_RESET0_sig <= '0'; elsif DC_ADC_SmplClk'event and DC_ADC_SmplClk = '1' then SET_RESET0_sig <= not SET_RESET0_sig; end if; end process; SET_RESET1_sig <= SET_RESET0_sig; SET_RESET0 <= SET_RESET0_sig; SET_RESET1 <= SET_RESET1_sig; -- send_ADC_DATA : IF SEND_CONSTANT_DATA = 0 GENERATE DC_ADC0 : DUAL_ADS1278_DRIVER --With AMR down ! => 24bits DC TM -> SC high res on Spin port map( Clk => clk_buf, reset => reset_buf, SpiClk => DC_ADC_Sclk, DIN => DC_ADC_IN, SmplClk => DC_ADC_SmplClk, OUT00 => AMR1X, OUT01 => AMR1Y, OUT02 => AMR1Z, OUT03 => AMR2X, OUT04 => AMR2Y, OUT05 => AMR2Z, OUT06 => Temp1, OUT07 => Temp2, OUT10 => AMR3X, OUT11 => AMR3Y, OUT12 => AMR3Z, OUT13 => AMR4X, OUT14 => AMR4Y, OUT15 => AMR4Z, OUT16 => Temp3, OUT17 => Temp4, FSynch => DC_ADC_FSynch ); LF1 <= LF1cst; LF2 <= LF2cst; LF3 <= LF3cst; END GENERATE; send_CST_DATA : IF (SEND_CONSTANT_DATA = 1) and (SEND_MINF_VALUE = 0) GENERATE AMR1X <= AMR1Xcst; AMR1Y <= AMR1Ycst; AMR1Z <= AMR1Zcst; AMR2X <= AMR2Xcst; AMR2Y <= AMR2Ycst; AMR2Z <= AMR2Zcst; Temp1 <= Temp1cst; Temp2 <= Temp2cst; AMR3X <= AMR3Xcst; AMR3Y <= AMR3Ycst; AMR3Z <= AMR3Zcst; AMR4X <= AMR4Xcst; AMR4Y <= AMR4Ycst; AMR4Z <= AMR4Zcst; Temp3 <= Temp3cst; Temp4 <= Temp4cst; LF1 <= LF1cst; LF2 <= LF2cst; LF3 <= LF3cst; END GENERATE; send_minF_valuelbl : IF (SEND_CONSTANT_DATA = 1) and (SEND_MINF_VALUE = 1) GENERATE AMR1X <= X"000" & "000" & std_logic_vector(TO_UNSIGNED(MinFCnt,9)); AMR1Y <= X"000" & "000" & std_logic_vector(TO_UNSIGNED(MinFCnt,9)); AMR1Z <= X"000" & "000" & std_logic_vector(TO_UNSIGNED(MinFCnt,9)); AMR2X <= X"000" & "000" & std_logic_vector(TO_UNSIGNED(MinFCnt,9)); AMR2Y <= X"000" & "000" & std_logic_vector(TO_UNSIGNED(MinFCnt,9)); AMR2Z <= X"000" & "000" & std_logic_vector(TO_UNSIGNED(MinFCnt,9)); Temp1 <= X"000" & "000" & std_logic_vector(TO_UNSIGNED(MinFCnt,9)); Temp2 <= X"000" & "000" & std_logic_vector(TO_UNSIGNED(MinFCnt,9)); AMR3X <= X"000" & "000" & std_logic_vector(TO_UNSIGNED(MinFCnt,9)); AMR3Y <= X"000" & "000" & std_logic_vector(TO_UNSIGNED(MinFCnt,9)); AMR3Z <= X"000" & "000" & std_logic_vector(TO_UNSIGNED(MinFCnt,9)); AMR4X <= X"000" & "000" & std_logic_vector(TO_UNSIGNED(MinFCnt,9)); AMR4Y <= X"000" & "000" & std_logic_vector(TO_UNSIGNED(MinFCnt,9)); AMR4Z <= X"000" & "000" & std_logic_vector(TO_UNSIGNED(MinFCnt,9)); Temp3 <= X"000" & "000" & std_logic_vector(TO_UNSIGNED(MinFCnt,9)); Temp4 <= X"000" & "000" & std_logic_vector(TO_UNSIGNED(MinFCnt,9)); LF1 <= LF1cst; LF2 <= LF2cst; LF3 <= LF3cst; END GENERATE; LF_SMPL_CLK0 : entity work.LF_SMPL_CLK port map( Wclck => WordClk, MinF => MinF, SMPL_CLK => LF_ADC_SmplClk ); process(clk) variable SelVar : integer range 0 to 1; begin if clk'event and clk ='1' then Decoder: FOR i IN 0 to FramePlacerCount-1 loop if FramePlacerFlags(i) = '1' then SelVar := i; end if; END loop Decoder; Sel <= SelVar; end if; end process; end rtl;