##// END OF EJS Templates
Correction de la FSM qui regule les données entrant dans la FFT
Correction de la FSM qui regule les données entrant dans la FFT

File last commit:

r521:ed390d662fa9 (MINI-LFR) WFP_MS-0-1-56 (LFR-EM) WFP_MS_1-1-56 JC
r557:7faec0eb9fbb (MINI-LFR) WFP_MS-0-1-67 (LFR-EM) WFP_MS_1-1-67 JC
Show More
cic_lfr_control.vhd
251 lines | 10.6 KiB | text/x-vhdl | VhdlLexer
/ lib / lpp / dsp / cic / cic_lfr_control.vhd
pellion
temp_CIC
r446 ------------------------------------------------------------------------------
-- This file is a part of the LPP VHDL IP LIBRARY
-- Copyright (C) 2009 - 2010, Laboratory of Plasmas Physic - CNRS
--
-- This program is free software; you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation; either version 3 of the License, or
-- (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this program; if not, write to the Free Software
-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-------------------------------------------------------------------------------
-- Author : Jean-christophe Pellion
-- Mail : jean-christophe.pellion@lpp.polytechnique.fr
-- jean-christophe.pellion@easii-ic.com
----------------------------------------------------------------------------
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
pellion
MINI_LFR-WFP_MS-0.1.30.pdb :...
r449 USE ieee.numeric_std.ALL;
pellion
temp_CIC
r446
LIBRARY lpp;
USE lpp.cic_pkg.ALL;
USE lpp.data_type_pkg.ALL;
ENTITY cic_lfr_control IS
PORT (
pellion
temp
r455 clk : IN STD_LOGIC;
rstn : IN STD_LOGIC;
run : IN STD_LOGIC;
pellion
temp_CIC
r446 --
data_in_valid : IN STD_LOGIC;
data_out_16_valid : OUT STD_LOGIC;
data_out_256_valid : OUT STD_LOGIC;
--
pellion
temp
r455 OPERATION : OUT STD_LOGIC_VECTOR(15 DOWNTO 0)
pellion
temp_CIC
r446 );
END cic_lfr_control;
ARCHITECTURE beh OF cic_lfr_control IS
pellion
MINI_LFR-WFP_MS-0.1.30.pdb :...
r449 TYPE STATE_CIC_LFR_TYPE IS (IDLE,
pellion
CIC-LFR temp
r454 RUN_PROG_I,
RUN_PROG_C16,
RUN_PROG_C256
pellion
MINI_LFR-WFP_MS-0.1.30.pdb :...
r449 );
pellion
temp
r455
SIGNAL STATE_CIC_LFR : STATE_CIC_LFR_TYPE;
pellion
CIC-LFR temp
r454
SIGNAL nb_data_receipt : INTEGER := 0;
pellion
temp
r455 SIGNAL current_cmd : INTEGER := 0;
pellion
CIC-LFR temp
r454 SIGNAL current_channel : INTEGER := 0;
pellion
temp
r455 SIGNAL sample_16_odd : STD_LOGIC;
SIGNAL sample_256_odd : STD_LOGIC;
pellion
MINI_LFR-WFP_MS-0.1.29.pdb :...
r447
pellion
temp
r455 TYPE PROGRAM_ARRAY IS ARRAY (INTEGER RANGE <>) OF STD_LOGIC_VECTOR(13 DOWNTO 0);
pellion
CIC-LFR temp
r454 --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) :=
(
pellion
temp
r456 -- DCBA 98765 43210
--PROG I------------------
pellion
CIC LFR : ok ?
r457 "0001" & "00011" & "00000", --0
"0101" & "00010" & "00001", --1
"0101" & "00010" & "00001", --2
"0001" & "00010" & "01011", --3
"0101" & "00010" & "01001", --4
"0101" & "00010" & "01001", --5
pellion
temp
r456 "0001" & "00010" & "01011", --6
"0101" & "00010" & "01001", --7
"0101" & "00010" & "01001", --8
--PROG_C16
pellion
CIC LFR : ok ?
r457 "1001" & "00100" & "10010", --9
pellion
temp
r456 "1001" & "10010" & "10101", --10
"1001" & "10010" & "10101", --11
"1010" & "10010" & "10101", --12
pellion
CIC LFR : ok ?
r457 "1001" & "01000" & "10010", --13
"1001" & "10010" & "11101", --14
"1001" & "10010" & "11101", --15
"1010" & "10010" & "11101", --16
pellion
temp
r456 --PROG_C256
pellion
CIC LFR : ok ?
r457 "1001" & "00100" & "10010", --17
pellion
Correction du CIC (probleme d'ecriture des datas des COMB 256)
r500 "1001" & "10110" & "10101", --18
"1001" & "10110" & "10101", --19
"1010" & "10110" & "10101", --20
pellion
CIC LFR : ok ?
r457 "1001" & "01000" & "10010", --21
pellion
Correction du CIC (probleme d'ecriture des datas des COMB 256)
r500 "1001" & "10110" & "11101", --22
"1001" & "10110" & "11101", --23
"1010" & "10110" & "11101", --24
pellion
CIC LFR : ok ?
r457 "1001" & "01100" & "10010", --25
pellion
Correction du CIC (probleme d'ecriture des datas des COMB 256)
r500 "1001" & "10110" & "11101", --26
"1001" & "10110" & "11101", --27
"1010" & "10110" & "11101" --28
pellion
temp
r455 );
pellion
MINI_LFR-WFP_MS-0.1.30.pdb :...
r449
pellion
temp_CIC
r446
pellion
CIC-LFR temp
r454 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;
pellion
MINI_LFR-WFP_MS-0.1.31.pdb :...
r451
pellion
temp_CIC
r446 BEGIN
pellion
temp
r456 OPERATION(2 DOWNTO 0) <= STD_LOGIC_VECTOR(to_unsigned(current_channel, 3)); --SEL_SAMPLE
OPERATION(4 DOWNTO 3) <= PROG(current_cmd)(1 DOWNTO 0); --SEL_DATA_A
OPERATION(6 DOWNTO 5) <= "00" WHEN STATE_CIC_LFR = IDLE ELSE PROG(current_cmd)(3 DOWNTO 2); --ALU_CMD
OPERATION(7) <= '0' WHEN STATE_CIC_LFR = IDLE ELSE PROG(current_cmd)(4); --CARRY_PUSH
OPERATION(8) <= PROG(current_cmd)(5); --@_init
OPERATION(9) <= PROG(current_cmd)(6); --@_add_1
pellion
Correction du CIC (probleme d'ecriture des datas des COMB 256)
r500
pellion
Correction du CIC (probleme d'ecriture des datas des COMB 256)
r501 OPERATION(10) <= PROG(current_cmd)(7) AND sample_256_odd WHEN STATE_CIC_LFR = RUN_PROG_C256 AND PROG(current_cmd)(9) = '1' ELSE
pellion
Correction du CIC (probleme d'ecriture des datas des COMB 256)
r500 PROG(current_cmd)(7); --@_sel(1..0)
OPERATION(11) <= PROG(current_cmd)(8);
OPERATION(12) <= PROG(current_cmd)(9) AND sample_16_odd WHEN STATE_CIC_LFR = RUN_PROG_C16 ELSE
--PROG(current_cmd)(9) AND sample_256_odd WHEN STATE_CIC_LFR = RUN_PROG_C256 ELSE
PROG(current_cmd)(9) WHEN STATE_CIC_LFR = RUN_PROG_C256 ELSE
'0'; --@_sel(2)
pellion
temp
r456 OPERATION(13) <= '0' WHEN STATE_CIC_LFR = IDLE ELSE PROG(current_cmd)(10); --WE
OPERATION(14) <= PROG(current_cmd)(12); -- SEL_DATA_A = data_b_reg
OPERATION(15) <= PROG(current_cmd)(13); -- WRITE_ADDR_sel
data_out_16_valid <= PROG(current_cmd)(11) WHEN STATE_CIC_LFR = RUN_PROG_C16 ELSE '0';
data_out_256_valid <= PROG(current_cmd)(11) WHEN STATE_CIC_LFR = RUN_PROG_C256 ELSE '0';
pellion
temp
r455
pellion
temp
r456
pellion
MINI_LFR-WFP_MS-0.1.30.pdb :...
r449
pellion
temp
r456
--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';
pellion
temp
r455
pellion
temp
r456 --OPERATION(15) <= PROG(current_cmd)(12);
--data_out_16_valid <= PROG(current_cmd)(13) WHEN STATE_CIC_LFR = RUN_PROG_C16 ELSE '0';
--data_out_256_valid <= PROG(current_cmd)(13) WHEN STATE_CIC_LFR = RUN_PROG_C256 ELSE '0';
pellion
temp
r455
pellion
temp_CIC
r446 PROCESS (clk, rstn)
pellion
CIC-LFR temp
r454 BEGIN
IF rstn = '0' THEN
pellion
temp
r455 STATE_CIC_LFR <= IDLE;
nb_data_receipt <= 0;
current_channel <= 0;
current_cmd <= 0;
sample_16_odd <= '0';
sample_256_odd <= '0';
pellion
CIC-LFR temp
r454
pellion
temp
r455 ELSIF clk'EVENT AND clk = '1' THEN
pellion
CIC-LFR temp
r454 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;
pellion
MINI_LFR-WFP_MS-0.1.31.pdb :...
r451
pellion
CIC-LFR temp
r454 WHEN RUN_PROG_I =>
IF current_cmd = PROG_END_I THEN
pellion
temp
r455 IF nb_data_receipt MOD 16 = 15 THEN
STATE_CIC_LFR <= RUN_PROG_C16;
current_cmd <= PROG_START_C16;
IF current_channel = 0 THEN
sample_16_odd <= NOT sample_16_odd;
END IF;
ELSE
IF current_channel = 5 THEN
current_channel <= 0;
STATE_CIC_LFR <= IDLE;
pellion
CIC-LFR temp
r454 ELSE
pellion
add r2 param to CIC_LFR IP
r521
pellion
temp
r455 current_cmd <= PROG_START_I;
current_channel <= current_channel + 1;
pellion
add r2 param to CIC_LFR IP
r521
pellion
temp
r455 END IF;
pellion
CIC-LFR temp
r454 END IF;
ELSE
current_cmd <= current_cmd +1;
END IF;
WHEN RUN_PROG_C16 =>
IF current_cmd = PROG_END_C16 THEN
pellion
temp
r455 IF nb_data_receipt MOD 256 = 255 THEN
STATE_CIC_LFR <= RUN_PROG_C256;
current_cmd <= PROG_START_C256;
IF current_channel = 0 THEN
sample_256_odd <= NOT sample_256_odd;
END IF;
ELSE
IF current_channel = 5 THEN
current_channel <= 0;
STATE_CIC_LFR <= IDLE;
pellion
CIC-LFR temp
r454 ELSE
pellion
temp
r455 STATE_CIC_LFR <= RUN_PROG_I;
current_cmd <= PROG_START_I;
current_channel <= current_channel + 1;
END IF;
pellion
MINI_LFR-WFP_MS-0.1.30.pdb :...
r449 END IF;
pellion
CIC-LFR temp
r454 ELSE
current_cmd <= current_cmd +1;
END IF;
pellion
temp
r455
pellion
CIC-LFR temp
r454 WHEN RUN_PROG_C256 =>
IF current_cmd = PROG_END_C256 THEN
pellion
temp
r455 -- data_out_256_valid <= '1';
pellion
CIC-LFR temp
r454 IF current_channel = 5 THEN
current_channel <= 0;
STATE_CIC_LFR <= IDLE;
ELSE
pellion
temp
r455 STATE_CIC_LFR <= RUN_PROG_I;
current_cmd <= PROG_START_I;
current_channel <= current_channel + 1;
pellion
CIC-LFR temp
r454 END IF;
ELSE
current_cmd <= current_cmd +1;
END IF;
WHEN OTHERS => NULL;
END CASE;
pellion
temp_CIC
r446 END IF;
END PROCESS;
pellion
CIC-LFR temp
r454
pellion
temp_CIC
r446 END beh;