# HG changeset patch # User pellion # Date 2014-11-25 12:53:42 # Node ID 53d8882e79501fe5aa1df1fbb96cf43b7a9224c4 # Parent 8e0c2cb85822b28012440747102afe6bc224c1df CIC-LFR temp diff --git a/designs/Validation_CIC/from_Paul/cic_with_RAM.ods b/designs/Validation_CIC/from_Paul/cic_with_RAM.ods index 00c8fcbc23f5dbaf1f8cfdbedcc7d31d1b2d58df..e09b15fe744088d54fbb29ebee5113d8b3c6aef0 GIT binary patch literal 42486 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 diff --git a/lib/lpp/dsp/cic/cic_lfr.vhd b/lib/lpp/dsp/cic/cic_lfr.vhd --- a/lib/lpp/dsp/cic/cic_lfr.vhd +++ b/lib/lpp/dsp/cic/cic_lfr.vhd @@ -23,10 +23,15 @@ LIBRARY ieee; USE ieee.std_logic_1164.ALL; +USE ieee.numeric_std.all; LIBRARY lpp; USE lpp.cic_pkg.ALL; USE lpp.data_type_pkg.ALL; +USE lpp.iir_filter.ALL; + +LIBRARY techmap; +USE techmap.gencomp.ALL; ENTITY cic_lfr IS GENERIC( @@ -50,21 +55,225 @@ ENTITY cic_lfr IS END cic_lfr; ARCHITECTURE beh OF cic_lfr IS + -- + CONSTANT S_parameter : INTEGER := 2; + -- SIGNAL sel_sample : STD_LOGIC_VECTOR(2 DOWNTO 0); - SIGNAL sample_temp : sample_vector(3 DOWNTO 0,15 DOWNTO 0); + SIGNAL sample_temp : sample_vector(5 DOWNTO 0,15 DOWNTO 0); SIGNAL sample : STD_LOGIC_VECTOR(15 DOWNTO 0); + + SIGNAL OPERATION : STD_LOGIC_VECTOR(14 DOWNTO 0); + + -- ALU + SIGNAL data_in_A : STD_LOGIC_VECTOR(15 DOWNTO 0); + SIGNAL data_in_B : STD_LOGIC_VECTOR(15 DOWNTO 0); + SIGNAL data_in_Carry : STD_LOGIC; + SIGNAL data_out_Carry : STD_LOGIC; + + SIGNAL carry_reg : STD_LOGIC_VECTOR(S_parameter DOWNTO 0); + + ----------------------------------------------------------------------------- + TYPE ARRAY_OF_ADDR IS ARRAY (5 DOWNTO 0) OF STD_LOGIC_VECTOR(7 DOWNTO 0); + SIGNAL base_addr_INT : ARRAY_OF_ADDR; + CONSTANT base_addr_delta : INTEGER := 40; + SIGNAL addr_base_sel : STD_LOGIC_VECTOR(7 DOWNTO 0); + SIGNAL addr_gen: STD_LOGIC_VECTOR(7 DOWNTO 0); + SIGNAL addr_read: STD_LOGIC_VECTOR(7 DOWNTO 0); + SIGNAL addr_write: STD_LOGIC_VECTOR(7 DOWNTO 0); + SIGNAL data_we: STD_LOGIC; + SIGNAL data_wen : STD_LOGIC; + SIGNAL data_write : STD_LOGIC_VECTOR(15 DOWNTO 0); + SIGNAL data_read : STD_LOGIC_VECTOR(15 DOWNTO 0); + ----------------------------------------------------------------------------- + SIGNAL sample_out_reg16 : sample_vector(5 DOWNTO 0, 15 DOWNTO 0); + SIGNAL sample_out_reg256 : sample_vector(5 DOWNTO 0, 15 DOWNTO 0); + SIGNAL sample_valid_reg16 : STD_LOGIC_VECTOR(6 DOWNTO 0); + SIGNAL sample_valid_reg256: STD_LOGIC_VECTOR(6 DOWNTO 0); + SIGNAL data_out_16_valid_s : STD_LOGIC; + SIGNAL data_out_256_valid_s : STD_LOGIC; + BEGIN ----------------------------------------------------------------------------- -- SEL_SAMPLE ----------------------------------------------------------------------------- + sel_sample <= OPERATION(5 DOWNTO 3); all_bit: FOR I IN 15 DOWNTO 0 GENERATE sample_temp(0,I) <= data_in(0,I) WHEN sel_sample(0) = '0' ELSE data_in(1,I); - sample_temp(1,I) <= data_in(3,I) WHEN sel_sample(0) = '0' ELSE data_in(4,I); - sample_temp(2,I) <= sample_temp(0,I) WHEN sel_sample(1) = '0' ELSE data_in(2,I); - sample_temp(3,I) <= sample_temp(1,I) WHEN sel_sample(1) = '0' ELSE data_in(5,I); - sample(I) <= sample_temp(2,I) WHEN sel_sample(2) = '0' ELSE sample_temp(3,I); - END GENERATE all_bit; + sample_temp(1,I) <= data_in(2,I) WHEN sel_sample(0) = '0' ELSE data_in(3,I); + sample_temp(2,I) <= data_in(4,I) WHEN sel_sample(0) = '0' ELSE data_in(5,I); + sample_temp(3,I) <= data_write(I) WHEN sel_sample(0) = '0' ELSE '0'; + + sample_temp(4,I) <= sample_temp(0,I) WHEN sel_sample(1) = '0' ELSE sample_temp(1,I); + sample_temp(5,I) <= sample_temp(2,I) WHEN sel_sample(1) = '0' ELSE sample_temp(3,I); + + sample(I) <= sample_temp(4,I) WHEN sel_sample(2) = '0' ELSE sample_temp(5,I); + END GENERATE all_bit; + + data_in_A <= sample; + + ----------------------------------------------------------------------------- + -- ALU + ----------------------------------------------------------------------------- + ALU: cic_lfr_add_sub + PORT MAP ( + clk => clk, + rstn => rstn, + run => run, + + OP => OPERATION(1 DOWNTO 0), + + data_in_A => sample, + data_in_B => data_read, + data_in_Carry => data_in_Carry, + + data_out => data_write, + data_out_Carry => data_out_Carry); + + PROCESS (clk, rstn) + BEGIN -- PROCESS + IF rstn = '0' THEN -- asynchronous reset (active low) + carry_reg <= (OTHERS => '0'); + ELSIF clk'event AND clk = '1' THEN -- rising clock edge + carry_reg(0) <= data_out_Carry; + all_carry: FOR I IN S_parameter DOWNTO 1 LOOP + carry_reg(I) <= carry_reg(I-1); + END LOOP all_carry; + END IF; + END PROCESS; + + data_in_Carry <= carry_reg(S_parameter-1) WHEN OPERATION(2) = '0' ELSE carry_reg(S_parameter); + + ----------------------------------------------------------------------------- + -- MEMORY + ----------------------------------------------------------------------------- + all_channel: FOR I IN 5 DOWNTO 0 GENERATE + all_bit: FOR J IN 7 DOWNTO 0 GENERATE + base_addr_INT(I)(J) <= '1' WHEN (base_addr_delta * I/(2**J)) MOD 2 = 1 ELSE '0'; + END GENERATE all_bit; + END GENERATE all_channel; + + addr_base_sel <= base_addr_INT(to_integer(UNSIGNED(OPERATION(11 DOWNTO 9)))); + + + cic_lfr_address_gen_1: cic_lfr_address_gen + PORT MAP ( + clk => clk, + rstn => rstn, + run => run, + + addr_base => addr_base_sel, + addr_init => OPERATION(7), + addr_add_1 => OPERATION(8), + addr => addr_gen); + + + addr_read <= addr_gen WHEN OPERATION(14 DOWNTO 12) = "000" ELSE + STD_LOGIC_VECTOR(to_unsigned(to_integer(UNSIGNED(addr_base_sel))+2,8)) WHEN OPERATION(14 DOWNTO 12) = "001" ELSE + STD_LOGIC_VECTOR(to_unsigned(to_integer(UNSIGNED(addr_base_sel))+5,8)) WHEN OPERATION(14 DOWNTO 12) = "010" ELSE + STD_LOGIC_VECTOR(to_unsigned(to_integer(UNSIGNED(addr_base_sel))+8,8)) WHEN OPERATION(14 DOWNTO 12) = "011" ELSE + STD_LOGIC_VECTOR(to_unsigned(to_integer(UNSIGNED(addr_gen ))+6,8)); + + PROCESS (clk, rstn) + BEGIN -- PROCESS + IF rstn = '0' THEN -- asynchronous reset (active low) + addr_write <= (OTHERS => '0'); + data_we <= '0'; + ELSIF clk'event AND clk = '1' THEN -- rising clock edge + addr_write <= addr_read; + data_we <= OPERATION(6); + END IF; + END PROCESS; + + memCEL : IF use_RAM_nCEL = 0 GENERATE + data_wen <= NOT data_we; + RAMblk : RAM_CEL + GENERIC MAP(16, 8) + PORT MAP( + WD => data_write, + RD => data_read, + WEN => data_wen, + REN => '0', + WADDR => addr_write, + RADDR => addr_read, + RWCLK => clk, + RESET => rstn + ) ; + END GENERATE; + + memRAM : IF use_RAM_nCEL = 1 GENERATE + SRAM : syncram_2p + GENERIC MAP(tech, 8, 16) + PORT MAP(clk, '1', addr_read, data_read, + clk, data_we, addr_write, data_write); + END GENERATE; + + ----------------------------------------------------------------------------- + -- CONTROL + ----------------------------------------------------------------------------- + cic_lfr_control_1: cic_lfr_control + PORT MAP ( + clk => clk, + rstn => rstn, + run => run, + data_in_valid => data_in_valid, + data_out_16_valid => data_out_16_valid_s, + data_out_256_valid => data_out_256_valid_s, + OPERATION => OPERATION); + + PROCESS (clk, rstn) + BEGIN -- PROCESS + IF rstn = '0' THEN -- asynchronous reset (active low) + sample_valid_reg16 <= "0000001"; + sample_valid_reg256 <= "0000001"; + ELSIF clk'event AND clk = '1' THEN -- rising clock edge + IF run = '0' THEN + sample_valid_reg16 <= "0000001"; + sample_valid_reg256 <= "0000001"; + ELSE + IF data_out_16_valid_s = '1' OR sample_valid_reg16(6) = '1' THEN + sample_valid_reg16 <= sample_valid_reg16(5 DOWNTO 0) & sample_valid_reg16(6); + END IF; + IF data_out_256_valid_s = '1' OR sample_valid_reg256(6) = '1' THEN + sample_valid_reg256 <= sample_valid_reg256(5 DOWNTO 0) & sample_valid_reg256(6); + END IF; + END IF; + END IF; + END PROCESS; + + data_out_16_valid <= sample_valid_reg16(6); + data_out_256_valid <= sample_valid_reg256(6); + + ----------------------------------------------------------------------------- + data_out_256 <= sample_out_reg256; + data_out_16 <= sample_out_reg16; + + all_channel_out: FOR I IN 5 DOWNTO 0 GENERATE + all_bits: FOR J IN 15 DOWNTO 0 GENERATE + + PROCESS (clk, rstn) + BEGIN -- PROCESS + IF rstn = '0' THEN -- asynchronous reset (active low) + sample_out_reg16(I,J) <= '0'; + sample_out_reg256(I,J) <= '0'; + ELSIF clk'event AND clk = '1' THEN -- rising clock edge + IF run = '0' THEN + sample_out_reg16(I,J) <= '0'; + sample_out_reg256(I,J) <= '0'; + ELSE + IF sample_valid_reg16(I) = '1' AND data_out_16_valid_s = '1' THEN + sample_out_reg16(I,J) <= data_write(J); + END IF; + IF sample_valid_reg256(I) = '1' AND data_out_256_valid_s = '1' THEN + sample_out_reg256(I,J) <= data_write(J); + END IF; + END IF; + END IF; + END PROCESS; + + END GENERATE all_bits; + END GENERATE all_channel_out; + END beh; diff --git a/lib/lpp/dsp/cic/cic_lfr_control.vhd b/lib/lpp/dsp/cic/cic_lfr_control.vhd --- a/lib/lpp/dsp/cic/cic_lfr_control.vhd +++ b/lib/lpp/dsp/cic/cic_lfr_control.vhd @@ -39,20 +39,8 @@ ENTITY cic_lfr_control IS data_in_valid : IN STD_LOGIC; data_out_16_valid : OUT STD_LOGIC; data_out_256_valid : OUT STD_LOGIC; - -- dataflow - sel_sample : OUT STD_LOGIC_VECTOR(2 DOWNTO 0); -- - op_valid : OUT STD_LOGIC; - op_ADD_SUBn : OUT STD_LOGIC; - -- - r_addr_init : OUT STD_LOGIC; - r_addr_base : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); - r_addr_add1 : OUT STD_LOGIC; - -- - w_en : OUT STD_LOGIC; - w_addr_init : OUT STD_LOGIC; - w_addr_base : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); - w_addr_add1 : OUT STD_LOGIC + OPERATION : OUT STD_LOGIC_VECTOR(14 DOWNTO 0) ); END cic_lfr_control; @@ -60,222 +48,163 @@ END cic_lfr_control; ARCHITECTURE beh OF cic_lfr_control IS TYPE STATE_CIC_LFR_TYPE IS (IDLE, - - INT_0_d0, INT_1_d0, INT_2_d0, - INT_0_d1, INT_1_d1, INT_2_d1, - INT_0_d2, INT_1_d2, INT_2_d2, - - WAIT_INT_to_COMB_16, - - COMB_0_16_d0, COMB_1_16_d0, COMB_2_16_d0, - COMB_0_16_d1, COMB_1_16_d1, COMB_2_16_d1, - - COMB_0_256_d0, COMB_1_256_d0, COMB_2_256_d0, - COMB_0_256_d1, COMB_1_256_d1, COMB_2_256_d1, - COMB_0_256_d2, COMB_1_256_d2, COMB_2_256_d2, - - READ_INT_2_d0, - READ_INT_2_d1, - - Wait_step, - INT_0, INT_1, INT_2 + RUN_PROG_I, + RUN_PROG_C16, + RUN_PROG_C256 ); SIGNAL STATE_CIC_LFR : STATE_CIC_LFR_TYPE; - SIGNAL STATE_CIC_LFR_pre : STATE_CIC_LFR_TYPE; + + SIGNAL nb_data_receipt : INTEGER := 0; + SIGNAL current_cmd : INTEGER := 0; + SIGNAL current_channel : INTEGER := 0; + SIGNAL sample_16_odd : STD_LOGIC; + SIGNAL sample_256_odd : STD_LOGIC; - SIGNAL nb_data_receipt : INTEGER; - SIGNAL current_channel : INTEGER; + TYPE PROGRAM_ARRAY IS ARRAY (INTEGER RANGE <>) OF STD_LOGIC_VECTOR(11 DOWNTO 0); + --OPERATION( 8 DOWNTO 0) <= PROGRAM_ARRAY( 8 DOWNTO 0) sauf pour PROG_I(0) + --OPERATION(13 DOWNTO 12) <= PROGRAM_ARRAY(10 DOWNTO 9) + --OPERATION(11 DOWNTO 9) <= current_channel + --OPERATION(14) <= PROGRAM_ARRAY(11) selon sample_X_odd et l'etat + CONSTANT PROG : PROGRAM_ARRAY(0 TO 28) := + ( + --PROG I + "0001"&X"C0", --0 + "0001"&X"70", --1 + "0001"&X"70", --2 + "0001"&X"7A", --3 + "0001"&X"7A", --4 + "0001"&X"7A", --5 + "0001"&X"7A", --6 + "0001"&X"7A", --7 + "0001"&X"7A", --8 + --PROG_C16 + "0010"&X"38", --9 + "1001"&X"71", --10 + "1001"&X"71", --11 + "1001"&X"71", --12 + "0100"&X"38", --13 + "1001"&X"77", --14 + "1001"&X"77", --15 + "1001"&X"77", --16 + --PROG_C256 + "0010"&X"38", --17 + "1001"&X"71", --18 + "1001"&X"71", --19 + "1001"&X"71", --20 + "0100"&X"38", --21 + "1001"&X"77", --22 + "1001"&X"77", --23 + "1001"&X"77", --24 + "0110"&X"38", --25 + "1001"&X"77", --26 + "1001"&X"77", --27 + "1001"&X"77" --28 + ); - TYPE ARRAY_OF_ADDR IS ARRAY (5 DOWNTO 0) OF STD_LOGIC_VECTOR(7 DOWNTO 0); - SIGNAL base_addr_INT : ARRAY_OF_ADDR; - CONSTANT base_addr_delta : INTEGER := 40; - - CONSTANT SEL_OUT : INTEGER := 6; + CONSTANT PROG_START_I : INTEGER := 0; + CONSTANT PROG_END_I : INTEGER := 8; + CONSTANT PROG_START_C16 : INTEGER := 9; + CONSTANT PROG_END_C16 : INTEGER := 16; + CONSTANT PROG_START_C256 : INTEGER := 17; + CONSTANT PROG_END_C256 : INTEGER := 28; - signal nb_cycle_wait : integer; BEGIN - all_channel: FOR I IN 5 DOWNTO 0 GENERATE - all_bit: FOR J IN 7 DOWNTO 0 GENERATE - base_addr_INT(I)(J) <= '1' WHEN (base_addr_delta * I/(2**J)) MOD 2 = 1 ELSE '0'; - END GENERATE all_bit; - END GENERATE all_channel; + OPERATION( 1 DOWNTO 0) <= PROG(current_cmd)( 1 DOWNTO 0); + OPERATION( 2 ) <= '0' WHEN STATE_CIC_LFR = IDLE ELSE + PROG(current_cmd)( 2 ); + OPERATION( 5 DOWNTO 3) <= STD_LOGIC_VECTOR(to_unsigned(current_channel,3)) WHEN STATE_CIC_LFR = RUN_PROG_I AND current_cmd = 0 ELSE + PROG(current_cmd)(5 DOWNTO 3); + OPERATION( 8 DOWNTO 6) <= "000" WHEN STATE_CIC_LFR = IDLE ELSE + PROG(current_cmd)( 8 DOWNTO 6); + OPERATION(11 DOWNTO 9) <= STD_LOGIC_VECTOR(to_unsigned(current_channel,3)); + OPERATION(13 DOWNTO 12) <= PROG(current_cmd)(10 DOWNTO 9); + OPERATION(14) <= PROG(current_cmd)(11) AND sample_16_odd WHEN STATE_CIC_LFR = RUN_PROG_C16 ELSE + PROG(current_cmd)(11) AND sample_256_odd WHEN STATE_CIC_LFR = RUN_PROG_C256 ELSE '0'; PROCESS (clk, rstn) - BEGIN -- PROCESS - IF rstn = '0' THEN -- asynchronous reset (active low) - STATE_CIC_LFR <= IDLE; - -- + BEGIN + IF rstn = '0' THEN + STATE_CIC_LFR <= IDLE; + nb_data_receipt <= 0; + current_channel <= 0; + current_cmd <= 0; + sample_16_odd <= '0'; + sample_256_odd <= '0'; data_out_16_valid <= '0'; - data_out_256_valid <= '0'; - -- - sel_sample <= (OTHERS => '0'); - -- - op_valid <= '0'; - op_ADD_SUBn <= '0'; - -- - r_addr_init <= '0'; - r_addr_base <= (OTHERS => '0'); - r_addr_add1 <= '0'; - -- - w_en <= '1'; - w_addr_init <= '0'; - w_addr_base <= (OTHERS => '0'); - w_addr_add1 <= '0'; - -- - nb_data_receipt <= 0; - ELSIF clk'event AND clk = '1' THEN -- rising clock edge + data_out_256_valid <= '0'; + + ELSIF clk'event AND clk = '1' THEN data_out_16_valid <= '0'; - data_out_256_valid <= '0'; - op_valid <= '0'; - op_ADD_SUBn <= '0'; - r_addr_init <= '0'; - r_addr_base <= (OTHERS => '0'); - r_addr_add1 <= '0'; - w_en <= '1'; - w_addr_init <= '0'; - w_addr_base <= (OTHERS => '0'); - w_addr_add1 <= '0'; - - IF run = '0' THEN - STATE_CIC_LFR <= IDLE; - -- - data_out_16_valid <= '0'; - data_out_256_valid <= '0'; - -- - sel_sample <= (OTHERS => '0'); - -- - op_valid <= '0'; - op_ADD_SUBn <= '0'; - -- - r_addr_init <= '0'; - r_addr_base <= (OTHERS => '0'); - r_addr_add1 <= '0'; - -- - w_en <= '1'; - w_addr_init <= '0'; - w_addr_base <= (OTHERS => '0'); - w_addr_add1 <= '0'; - -- - nb_data_receipt <= 0; - current_channel <= 0; - ELSE - CASE STATE_CIC_LFR IS - WHEN IDLE => - data_out_16_valid <= '0'; - data_out_256_valid <= '0'; - -- - sel_sample <= (OTHERS => '0'); - -- - op_valid <= '0'; - op_ADD_SUBn <= '0'; - -- - r_addr_init <= '0'; - r_addr_base <= (OTHERS => '0'); - r_addr_add1 <= '0'; - -- - w_en <= '1'; - w_addr_init <= '0'; - w_addr_base <= (OTHERS => '0'); - w_addr_add1 <= '0'; - -- - IF data_in_valid = '1' THEN - nb_data_receipt <= nb_data_receipt+1; - current_channel <= 0; - STATE_CIC_LFR <= INT_0_d0; - END IF; - + data_out_256_valid <= '0'; + CASE STATE_CIC_LFR IS + WHEN IDLE => + IF data_in_valid = '1' THEN + STATE_CIC_LFR <= RUN_PROG_I; + current_cmd <= PROG_START_I; + current_channel <= 0; + nb_data_receipt <= nb_data_receipt + 1; + END IF; - WHEN WAIT_step => --------------------------------------------------- - IF nb_cycle_wait > 0 THEN - nb_cycle_wait <= nb_cycle_wait -1; - ELSE - STATE_CIC_LFR <= STATE_CIC_LFR_pre; - END IF; - - - WHEN INT_0 => ------------------------------------------------------- - sel_sample <= STD_LOGIC_VECTOR(to_unsigned(current_channel, 3)); - r_addr_init <= '1'; - r_addr_base <= base_addr_INT(current_channel); - nb_cycle_wait <= 1; - op_ADD_SUBn <= '1'; - op_valid <= '1'; - STATE_CIC_LFR <= WAIT_step; - STATE_CIC_LFR_pre <= INT_1; - - WHEN INT_1 => - sel_sample <= STD_LOGIC_VECTOR(to_unsigned(SEL_OUT, 3)); - r_addr_add1 <= '1'; - nb_cycle_wait <= 3; - op_ADD_SUBn <= '1'; - op_valid <= '1'; - STATE_CIC_LFR <= INT_2; - - WHEN INT_2 => - sel_sample <= STD_LOGIC_VECTOR(to_unsigned(SEL_OUT, 3)); - r_addr_add1 <= '1'; - nb_cycle_wait <= 3; - op_ADD_SUBn <= '1'; - op_valid <= '1'; - IF nb_data_receipt = 256 THEN - STATE_CIC_LFR <= COMB_0_256_d0; - ELSIF (nb_data_receipt mod 16) = 0 THEN - STATE_CIC_LFR <= WAIT_INT_to_COMB_16; - ELSE - IF current_channel = 5 THEN + WHEN RUN_PROG_I => + IF current_cmd = PROG_END_I THEN + IF current_channel = 5 THEN + current_channel <= 0; + IF nb_data_receipt MOD 16 = 0 THEN + STATE_CIC_LFR <= RUN_PROG_C16; + current_cmd <= PROG_START_C16; + sample_16_odd <= NOT sample_16_odd; + ELSE STATE_CIC_LFR <= IDLE; - ELSE - current_channel <= current_channel +1; - STATE_CIC_LFR <= INT_0; - END IF; - END IF; - - ------------------------------------------------------------------- - WHEN WAIT_INT_to_COMB_16 => - STATE_CIC_LFR <= COMB_0_16_d0; - - WHEN COMB_0_16_d0 => STATE_CIC_LFR <= COMB_0_16_d1; - WHEN COMB_0_16_d1 => STATE_CIC_LFR <= COMB_1_16_d0; - - WHEN COMB_1_16_d0 => STATE_CIC_LFR <= COMB_1_16_d1; - WHEN COMB_1_16_d1 => STATE_CIC_LFR <= COMB_2_16_d0; - - WHEN COMB_2_16_d0 => STATE_CIC_LFR <= COMB_2_16_d1; - WHEN COMB_2_16_d1 => - IF current_channel = 5 THEN - STATE_CIC_LFR <= IDLE; - IF nb_data_receipt = 256 THEN - nb_data_receipt <= 0; - END IF; + END IF; ELSE current_channel <= current_channel +1; - STATE_CIC_LFR <= INT_0_d0; + current_cmd <= PROG_START_I; + END IF; + ELSE + current_cmd <= current_cmd +1; + END IF; + + WHEN RUN_PROG_C16 => + IF current_cmd = PROG_END_C16 THEN + data_out_16_valid <= '1'; + IF current_channel = 5 THEN + current_channel <= 0; + IF nb_data_receipt MOD 256 = 0 THEN + sample_256_odd <= NOT sample_256_odd; + STATE_CIC_LFR <= RUN_PROG_C256; + current_cmd <= PROG_START_C256; + ELSE + STATE_CIC_LFR <= IDLE; + END IF; + ELSE + current_channel <= current_channel +1; + current_cmd <= PROG_START_C16; END IF; - - ------------------------------------------------------------------- - WHEN COMB_0_256_d0 => STATE_CIC_LFR <= COMB_0_256_d1; - WHEN COMB_0_256_d1 => STATE_CIC_LFR <= COMB_0_256_d2; - WHEN COMB_0_256_d2 => STATE_CIC_LFR <= COMB_1_256_d0; - - WHEN COMB_1_256_d0 => STATE_CIC_LFR <= COMB_1_256_d1; - WHEN COMB_1_256_d1 => STATE_CIC_LFR <= COMB_1_256_d2; - WHEN COMB_1_256_d2 => STATE_CIC_LFR <= COMB_2_256_d0; - - WHEN COMB_2_256_d0 => STATE_CIC_LFR <= COMB_2_256_d1; - WHEN COMB_2_256_d1 => STATE_CIC_LFR <= COMB_2_256_d2; - WHEN COMB_2_256_d2 => STATE_CIC_LFR <= READ_INT_2_d0; - - ------------------------------------------------------------------- - WHEN READ_INT_2_d0 => STATE_CIC_LFR <= READ_INT_2_d1; - WHEN READ_INT_2_d1 => STATE_CIC_LFR <= COMB_0_16_d0; - - WHEN OTHERS => NULL; - END CASE; - END IF; + ELSE + current_cmd <= current_cmd +1; + END IF; + + WHEN RUN_PROG_C256 => + IF current_cmd = PROG_END_C256 THEN + data_out_256_valid <= '1'; + IF current_channel = 5 THEN + nb_data_receipt <= 0; + current_channel <= 0; + STATE_CIC_LFR <= IDLE; + ELSE + current_channel <= current_channel +1; + current_cmd <= PROG_START_C256; + END IF; + ELSE + current_cmd <= current_cmd +1; + END IF; + + WHEN OTHERS => NULL; + END CASE; END IF; END PROCESS; - + END beh; diff --git a/lib/lpp/dsp/cic/cic_pkg.vhd b/lib/lpp/dsp/cic/cic_pkg.vhd --- a/lib/lpp/dsp/cic/cic_pkg.vhd +++ b/lib/lpp/dsp/cic/cic_pkg.vhd @@ -24,6 +24,9 @@ LIBRARY ieee; USE ieee.std_logic_1164.ALL; +LIBRARY lpp; +USE lpp.data_type_pkg.ALL; + PACKAGE cic_pkg IS ----------------------------------------------------------------------------- @@ -88,6 +91,22 @@ PACKAGE cic_pkg IS ----------------------------------------------------------------------------- + COMPONENT cic_lfr + GENERIC ( + tech : INTEGER; + use_RAM_nCEL : INTEGER); + PORT ( + clk : IN STD_LOGIC; + rstn : IN STD_LOGIC; + run : IN STD_LOGIC; + data_in : IN sample_vector(5 DOWNTO 0, 15 DOWNTO 0); + data_in_valid : IN STD_LOGIC; + data_out_16 : OUT sample_vector(5 DOWNTO 0, 15 DOWNTO 0); + data_out_16_valid : OUT STD_LOGIC; + data_out_256 : OUT sample_vector(5 DOWNTO 0, 15 DOWNTO 0); + data_out_256_valid : OUT STD_LOGIC); + END COMPONENT; + COMPONENT cic_lfr_control PORT ( clk : IN STD_LOGIC; @@ -96,16 +115,33 @@ PACKAGE cic_pkg IS data_in_valid : IN STD_LOGIC; data_out_16_valid : OUT STD_LOGIC; data_out_256_valid : OUT STD_LOGIC; - sel_sample : OUT STD_LOGIC_VECTOR(2 DOWNTO 0); - op_valid : OUT STD_LOGIC; - op_ADD_SUBn : OUT STD_LOGIC; - r_addr_init : OUT STD_LOGIC; - r_addr_base : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); - r_addr_add1 : OUT STD_LOGIC; - w_en : OUT STD_LOGIC; - w_addr_init : OUT STD_LOGIC; - w_addr_base : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); - w_addr_add1 : OUT STD_LOGIC); + OPERATION : OUT STD_LOGIC_VECTOR(14 DOWNTO 0)); END COMPONENT; + + COMPONENT cic_lfr_add_sub + PORT ( + clk : IN STD_LOGIC; + rstn : IN STD_LOGIC; + run : IN STD_LOGIC; + OP : IN STD_LOGIC_VECTOR( 1 DOWNTO 0); + data_in_A : IN STD_LOGIC_VECTOR(15 DOWNTO 0); + data_in_B : IN STD_LOGIC_VECTOR(15 DOWNTO 0); + data_in_Carry : IN STD_LOGIC; + data_out : OUT STD_LOGIC_VECTOR(15 DOWNTO 0); + data_out_Carry : OUT STD_LOGIC); + END COMPONENT; + + COMPONENT cic_lfr_address_gen + PORT ( + clk : IN STD_LOGIC; + rstn : IN STD_LOGIC; + run : IN STD_LOGIC; + addr_base : IN STD_LOGIC_VECTOR(7 DOWNTO 0); + addr_init : IN STD_LOGIC; + addr_add_1 : IN STD_LOGIC; + addr : OUT STD_LOGIC_VECTOR(7 DOWNTO 0)); + END COMPONENT; + + ----------------------------------------------------------------------------- END cic_pkg; diff --git a/lib/lpp/dsp/cic/vhdlsyn.txt b/lib/lpp/dsp/cic/vhdlsyn.txt --- a/lib/lpp/dsp/cic/vhdlsyn.txt +++ b/lib/lpp/dsp/cic/vhdlsyn.txt @@ -5,3 +5,5 @@ cic_downsampler.vhd cic_comb.vhd cic_lfr.vhd cic_lfr_control.vhd +cic_lfr_add_sub.vhd +cic_lfr_address_gen.vhd