# HG changeset patch # User pellion # Date 2015-03-25 13:55:08 # Node ID de50ded4e0dae1fddac51894c42130529903f050 # Parent 5d1455cd50ac0ffbd32a4ad2e91acceac7c2f7c9 EQM debug diff --git a/boards/LFR-EQM/LFR_EQM_A3PE3000_debug.pdc b/boards/LFR-EQM/LFR_EQM_A3PE3000_debug.pdc new file mode 100644 --- /dev/null +++ b/boards/LFR-EQM/LFR_EQM_A3PE3000_debug.pdc @@ -0,0 +1,124 @@ +#set_io clk49_152MHz -pinname D5 -fixed yes -DIRECTION Inout +set_io clk50MHz -pinname B3 -fixed yes -DIRECTION Inout +set_io reset -pinname R4 -fixed yes -DIRECTION Inout + +set_io {address[0]} -pinname U3 -fixed yes -DIRECTION Inout +set_io {address[1]} -pinname V14 -fixed yes -DIRECTION Inout +set_io {address[2]} -pinname V13 -fixed yes -DIRECTION Inout +set_io {address[3]} -pinname V16 -fixed yes -DIRECTION Inout +set_io {address[4]} -pinname N9 -fixed yes -DIRECTION Inout +set_io {address[5]} -pinname T11 -fixed yes -DIRECTION Inout +set_io {address[6]} -pinname U13 -fixed yes -DIRECTION Inout +set_io {address[7]} -pinname R5 -fixed yes -DIRECTION Inout +set_io {address[8]} -pinname U2 -fixed yes -DIRECTION Inout +set_io {address[9]} -pinname N11 -fixed yes -DIRECTION Inout +set_io {address[10]} -pinname R13 -fixed yes -DIRECTION Inout +set_io {address[11]} -pinname R12 -fixed yes -DIRECTION Inout +set_io {address[12]} -pinname M15 -fixed yes -DIRECTION Inout +set_io {address[13]} -pinname T12 -fixed yes -DIRECTION Inout +set_io {address[14]} -pinname M13 -fixed yes -DIRECTION Inout +set_io {address[15]} -pinname T13 -fixed yes -DIRECTION Inout +set_io {address[16]} -pinname L13 -fixed yes -DIRECTION Inout +set_io {address[17]} -pinname V17 -fixed yes -DIRECTION Inout +set_io {address[18]} -pinname V15 -fixed yes -DIRECTION Inout + +set_io {data[0]} -pinname V4 -fixed yes -DIRECTION Inout +set_io {data[1]} -pinname V3 -fixed yes -DIRECTION Inout +set_io {data[2]} -pinname V2 -fixed yes -DIRECTION Inout +set_io {data[3]} -pinname T3 -fixed yes -DIRECTION Inout +set_io {data[4]} -pinname N6 -fixed yes -DIRECTION Inout +set_io {data[5]} -pinname P6 -fixed yes -DIRECTION Inout +set_io {data[6]} -pinname R6 -fixed yes -DIRECTION Inout +set_io {data[7]} -pinname T4 -fixed yes -DIRECTION Inout +set_io {data[8]} -pinname T1 -fixed yes -DIRECTION Inout +set_io {data[9]} -pinname R1 -fixed yes -DIRECTION Inout +set_io {data[10]} -pinname P1 -fixed yes -DIRECTION Inout +set_io {data[11]} -pinname N2 -fixed yes -DIRECTION Inout +set_io {data[12]} -pinname R3 -fixed yes -DIRECTION Inout +set_io {data[13]} -pinname P4 -fixed yes -DIRECTION Inout +set_io {data[14]} -pinname N4 -fixed yes -DIRECTION Inout +set_io {data[15]} -pinname N3 -fixed yes -DIRECTION Inout +set_io {data[16]} -pinname G12 -fixed yes -DIRECTION Inout +set_io {data[17]} -pinname G15 -fixed yes -DIRECTION Inout +set_io {data[18]} -pinname H15 -fixed yes -DIRECTION Inout +set_io {data[19]} -pinname F17 -fixed yes -DIRECTION Inout +set_io {data[20]} -pinname F18 -fixed yes -DIRECTION Inout +set_io {data[21]} -pinname G17 -fixed yes -DIRECTION Inout +set_io {data[22]} -pinname H18 -fixed yes -DIRECTION Inout +set_io {data[23]} -pinname J18 -fixed yes -DIRECTION Inout +set_io {data[24]} -pinname R18 -fixed yes -DIRECTION Inout +set_io {data[25]} -pinname N18 -fixed yes -DIRECTION Inout +set_io {data[26]} -pinname P17 -fixed yes -DIRECTION Inout +set_io {data[27]} -pinname N17 -fixed yes -DIRECTION Inout +set_io {data[28]} -pinname T18 -fixed yes -DIRECTION Inout +set_io {data[29]} -pinname M17 -fixed yes -DIRECTION Inout +set_io {data[30]} -pinname U18 -fixed yes -DIRECTION Inout +set_io {data[31]} -pinname L18 -fixed yes -DIRECTION Inout + +set_io nSRAM_MBE -pinname E4 -fixed yes -DIRECTION Inout +set_io nSRAM_E1 -pinname D1 -fixed yes -DIRECTION Inout +set_io nSRAM_E2 -pinname C1 -fixed yes -DIRECTION Inout +#set_io nSRAM_SCRUB -pinname C2 -fixed yes -DIRECTION Inout +set_io nSRAM_W -pinname D4 -fixed yes -DIRECTION Inout +set_io nSRAM_G -pinname E1 -fixed yes -DIRECTION Inout +set_io nSRAM_BUSY -pinname F4 -fixed yes -DIRECTION Inout + +set_io spw1_en -pinname G4 -fixed yes -DIRECTION Inout +set_io spw1_din -pinname D13 -fixed yes -DIRECTION Inout +set_io spw1_sin -pinname D14 -fixed yes -DIRECTION Inout +set_io spw1_dout -pinname C16 -fixed yes -DIRECTION Inout +set_io spw1_sout -pinname C4 -fixed yes -DIRECTION Inout + +set_io spw2_en -pinname G3 -fixed yes -DIRECTION Inout +set_io spw2_din -pinname E6 -fixed yes -DIRECTION Inout +set_io spw2_sin -pinname C15 -fixed yes -DIRECTION Inout +set_io spw2_dout -pinname B7 -fixed yes -DIRECTION Inout +set_io spw2_sout -pinname D7 -fixed yes -DIRECTION Inout + +set_io TAG1 -pinname J12 -fixed yes -DIRECTION Inout +set_io TAG2 -pinname K12 -fixed yes -DIRECTION Inout +set_io TAG3 -pinname K13 -fixed yes -DIRECTION Inout +set_io TAG4 -pinname L16 -fixed yes -DIRECTION Inout +#set_io TAG5 -pinname L15 -fixed yes -DIRECTION Inout +#set_io TAG6 -pinname M16 -fixed yes -DIRECTION Inout +#set_io TAG7 -pinname J14 -fixed yes -DIRECTION Inout +set_io TAG8 -pinname K15 -fixed yes -DIRECTION Inout +#set_io TAG9 -pinname J17 -fixed yes -DIRECTION Inout + +set_io bias_fail_sw -pinname A3 -fixed yes -DIRECTION Inout + +set_io {ADC_OEB_bar_CH[0]} -pinname A10 -fixed yes -DIRECTION Inout +set_io {ADC_OEB_bar_CH[1]} -pinname B10 -fixed yes -DIRECTION Inout +set_io {ADC_OEB_bar_CH[2]} -pinname B12 -fixed yes -DIRECTION Inout +set_io {ADC_OEB_bar_CH[3]} -pinname A11 -fixed yes -DIRECTION Inout +set_io {ADC_OEB_bar_CH[4]} -pinname B13 -fixed yes -DIRECTION Inout +set_io {ADC_OEB_bar_CH[5]} -pinname C6 -fixed yes -DIRECTION Inout +set_io {ADC_OEB_bar_CH[6]} -pinname A13 -fixed yes -DIRECTION Inout +set_io {ADC_OEB_bar_CH[7]} -pinname A14 -fixed yes -DIRECTION Inout + +set_io ADC_smpclk -pinname A15 -fixed yes -DIRECTION Inout + +set_io HK_smpclk -pinname R11 -fixed yes -DIRECTION Inout +set_io ADC_OEB_bar_HK -pinname D6 -fixed yes -DIRECTION Inout +set_io {HK_SEL[0]} -pinname C3 -fixed yes -DIRECTION Inout +set_io {HK_SEL[1]} -pinname A2 -fixed yes -DIRECTION Inout + +#set_io {ADC_data[0]} -pinname G13 -fixed yes -DIRECTION Inout +#set_io {ADC_data[1]} -pinname G16 -fixed yes -DIRECTION Inout +#set_io {ADC_data[2]} -pinname F16 -fixed yes -DIRECTION Inout +#set_io {ADC_data[3]} -pinname E15 -fixed yes -DIRECTION Inout +#set_io {ADC_data[4]} -pinname F13 -fixed yes -DIRECTION Inout +#set_io {ADC_data[5]} -pinname F15 -fixed yes -DIRECTION Inout +#set_io {ADC_data[6]} -pinname D16 -fixed yes -DIRECTION Inout +#set_io {ADC_data[7]} -pinname D15 -fixed yes -DIRECTION Inout +#set_io {ADC_data[8]} -pinname B17 -fixed yes -DIRECTION Inout +#set_io {ADC_data[9]} -pinname A17 -fixed yes -DIRECTION Inout +#set_io {ADC_data[10]} -pinname A16 -fixed yes -DIRECTION Inout +#set_io {ADC_data[11]} -pinname B16 -fixed yes -DIRECTION Inout +#set_io {ADC_data[12]} -pinname C12 -fixed yes -DIRECTION Inout +#set_io {ADC_data[13]} -pinname C13 -fixed yes -DIRECTION Inout + +set_io DAC_SDO -pinname A4 -fixed yes -DIRECTION Inout +set_io DAC_SCK -pinname A5 -fixed yes -DIRECTION Inout +set_io DAC_SYNC -pinname B6 -fixed yes -DIRECTION Inout +set_io DAC_CAL_EN -pinname A6 -fixed yes -DIRECTION Inout diff --git a/boards/LFR-EQM/LFR_EQM_place_and_route.sdc b/boards/LFR-EQM/LFR_EQM_place_and_route.sdc new file mode 100644 --- /dev/null +++ b/boards/LFR-EQM/LFR_EQM_place_and_route.sdc @@ -0,0 +1,30 @@ +# Top Level Design Parameters + +# Clocks + +create_clock -period 20.000000 -waveform {0.000000 10.000000} clk50MHz +create_clock -period 20.344999 -waveform {0.000000 10.172500} clk49_152MHz +create_clock -period 40.000000 -waveform {0.000000 20.000000} clk_25:Q +create_clock -period 40.690000 -waveform {0.000000 20.345100} clk_24:Q +create_clock -name SPW_CLOCK -period 100.000000 -waveform {0.000000 50.000000} {spw1_din spw1_sin spw2_din spw2_sin} + + +# False Paths Between Clocks + + +# False Path Constraints + + +# Maximum Delay Constraints + + +# Multicycle Constraints + + +# Virtual Clocks +# Output Load Constraints +# Driving Cell Constraints +# Wire Loads +# set_wire_load_mode top + +# Other Constraints diff --git a/boards/LFR-EQM/LFR_EQM_place_and_route_test.sdc b/boards/LFR-EQM/LFR_EQM_place_and_route_test.sdc new file mode 100644 --- /dev/null +++ b/boards/LFR-EQM/LFR_EQM_place_and_route_test.sdc @@ -0,0 +1,39 @@ +# Top Level Design Parameters + +# Clocks +create_clock -name{clk_50} -period 20.000000 -waveform { 0.000 10.000000 } {clk50MHz} +create_clock -name{clk_49} -period 20.344999 -waveform { 0.000 10.172500 } {clk49_152MHz} +create_clock -name{spw_rx_clk} -period 100.00000 -waveform { 0.000 50.000000 } {spw_inputloop_0_spw_phy0/rxclki spw_inputloop_1_spw_phy0/rxclki} + +create_generated_clock -name{clk_25:Q} -divide_by 2 -source{clk_25:CLK}{clk_25:Q} +create_generated_clock -name{clk_24:Q} -divide_by 2 -source{clk_24:CLK}{clk_24:Q} + + + + +#create_clock -period 10.000000 -waveform {0.000000 5.000000} clk50MHz +#create_clock -period 20.344999 -waveform {0.000000 10.172500} clk49_152MHz +#create_clock -period 40.000000 -waveform {0.000000 20.000000} clk_25:Q +#create_clock -period 40.690000 -waveform {0.000000 20.345100} clk_24:Q +#create_clock -name SPW_CLOCK -period 100.000000 -waveform {0.000000 50.000000} {spw1_din spw1_sin spw2_din spw2_sin} + + +# False Paths Between Clocks + + +# False Path Constraints + + +# Maximum Delay Constraints + + +# Multicycle Constraints + + +# Virtual Clocks +# Output Load Constraints +# Driving Cell Constraints +# Wire Loads +# set_wire_load_mode top + +# Other Constraints diff --git a/designs/LFR-EQM-WFP_MS-debug/Constraint_EQM.odt b/designs/LFR-EQM-WFP_MS-debug/Constraint_EQM.odt new file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..085d14d2fc345d53a0040c8de7bca480293f9426 GIT binary patch literal 40329 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

n-+4- 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 diff --git a/designs/LFR-EQM-WFP_MS-debug/LFR-EQM.vhd b/designs/LFR-EQM-WFP_MS-debug/LFR-EQM.vhd new file mode 100644 --- /dev/null +++ b/designs/LFR-EQM-WFP_MS-debug/LFR-EQM.vhd @@ -0,0 +1,475 @@ +------------------------------------------------------------------------------ +-- 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 +------------------------------------------------------------------------------- +LIBRARY IEEE; +USE IEEE.numeric_std.ALL; +USE IEEE.std_logic_1164.ALL; +LIBRARY grlib; +USE grlib.amba.ALL; +USE grlib.stdlib.ALL; +LIBRARY techmap; +USE techmap.gencomp.ALL; +LIBRARY gaisler; +USE gaisler.memctrl.ALL; +USE gaisler.leon3.ALL; +USE gaisler.uart.ALL; +USE gaisler.misc.ALL; +USE gaisler.spacewire.ALL; +LIBRARY esa; +USE esa.memoryctrl.ALL; +LIBRARY lpp; +USE lpp.lpp_memory.ALL; +USE lpp.lpp_ad_conv.ALL; +USE lpp.lpp_lfr_pkg.ALL; -- contains lpp_lfr, not in the 206 rev of the VHD_Lib +USE lpp.lpp_top_lfr_pkg.ALL; -- contains top_wf_picker +USE lpp.iir_filter.ALL; +USE lpp.general_purpose.ALL; +USE lpp.lpp_lfr_management.ALL; +USE lpp.lpp_leon3_soc_pkg.ALL; + +library proasic3e; +use proasic3e.clkint; + +ENTITY LFR_EQM IS + + PORT ( + clk50MHz : IN STD_ULOGIC; + clk49_152MHz : IN STD_ULOGIC; + reset : IN STD_ULOGIC; + + -- TAG -------------------------------------------------------------------- + TAG1 : IN STD_ULOGIC; -- DSU rx data + TAG3 : OUT STD_ULOGIC; -- DSU tx data + -- UART APB --------------------------------------------------------------- + TAG2 : IN STD_ULOGIC; -- UART1 rx data + TAG4 : OUT STD_ULOGIC; -- UART1 tx data + -- RAM -------------------------------------------------------------------- + address : OUT STD_LOGIC_VECTOR(18 DOWNTO 0); + data : INOUT STD_LOGIC_VECTOR(31 DOWNTO 0); + + nSRAM_MBE : INOUT STD_LOGIC; -- new + nSRAM_E1 : OUT STD_LOGIC; -- new + nSRAM_E2 : OUT STD_LOGIC; -- new +-- nSRAM_SCRUB : OUT STD_LOGIC; -- new + nSRAM_W : OUT STD_LOGIC; -- new + nSRAM_G : OUT STD_LOGIC; -- new + nSRAM_BUSY : IN STD_LOGIC; -- new + -- SPW -------------------------------------------------------------------- + spw1_en : OUT STD_LOGIC; -- new + spw1_din : IN STD_LOGIC; + spw1_sin : IN STD_LOGIC; + spw1_dout : OUT STD_LOGIC; + spw1_sout : OUT STD_LOGIC; + spw2_en : OUT STD_LOGIC; -- new + spw2_din : IN STD_LOGIC; + spw2_sin : IN STD_LOGIC; + spw2_dout : OUT STD_LOGIC; + spw2_sout : OUT STD_LOGIC; + -- ADC -------------------------------------------------------------------- + bias_fail_sw : OUT STD_LOGIC; -- '0' + ADC_OEB_bar_CH : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); -- '1' + ADC_smpclk : OUT STD_LOGIC; -- '0' + --ADC_data : IN STD_LOGIC_VECTOR(13 DOWNTO 0); -- todo + -- DAC -------------------------------------------------------------------- + DAC_SDO : OUT STD_LOGIC; -- '1' + DAC_SCK : OUT STD_LOGIC; -- '0' + DAC_SYNC : OUT STD_LOGIC; -- '0' + DAC_CAL_EN : OUT STD_LOGIC; -- '0' + -- HK --------------------------------------------------------------------- + HK_smpclk : OUT STD_LOGIC; -- '0' + ADC_OEB_bar_HK : OUT STD_LOGIC; -- '1' + HK_SEL : OUT STD_LOGIC_VECTOR(1 DOWNTO 0); -- "00" + --------------------------------------------------------------------------- + TAG8 : OUT STD_LOGIC + ); + +END LFR_EQM; + + +ARCHITECTURE beh OF LFR_EQM IS + + SIGNAL clk_25 : STD_LOGIC := '0'; + SIGNAL clk_25_int : STD_LOGIC := '0'; + SIGNAL clk_24 : STD_LOGIC := '0'; + ----------------------------------------------------------------------------- + SIGNAL coarse_time : STD_LOGIC_VECTOR(31 DOWNTO 0); + SIGNAL fine_time : STD_LOGIC_VECTOR(15 DOWNTO 0); + + -- CONSTANTS + CONSTANT CFG_PADTECH : INTEGER := inferred; + CONSTANT NB_APB_SLAVE : INTEGER := 11; -- 3 = grspw + waveform picker + time manager, 11 allows pindex = f + CONSTANT NB_AHB_SLAVE : INTEGER := 1; + CONSTANT NB_AHB_MASTER : INTEGER := 2; -- 2 = grspw + waveform picker + + SIGNAL apbi_ext : apb_slv_in_type; + SIGNAL apbo_ext : soc_apb_slv_out_vector(NB_APB_SLAVE-1+5 DOWNTO 5) := (OTHERS => apb_none); + SIGNAL ahbi_s_ext : ahb_slv_in_type; + SIGNAL ahbo_s_ext : soc_ahb_slv_out_vector(NB_AHB_SLAVE-1+3 DOWNTO 3) := (OTHERS => ahbs_none); + SIGNAL ahbi_m_ext : AHB_Mst_In_Type; + SIGNAL ahbo_m_ext : soc_ahb_mst_out_vector(NB_AHB_MASTER-1+1 DOWNTO 1) := (OTHERS => ahbm_none); + +-- Spacewire signals + SIGNAL dtmp : STD_LOGIC_VECTOR(1 DOWNTO 0); + SIGNAL stmp : STD_LOGIC_VECTOR(1 DOWNTO 0); + SIGNAL spw_rxclk : STD_LOGIC_VECTOR(1 DOWNTO 0); + SIGNAL spw_rxtxclk : STD_ULOGIC; + SIGNAL spw_rxclkn : STD_ULOGIC; + SIGNAL spw_clk : STD_LOGIC; + SIGNAL swni : grspw_in_type; + SIGNAL swno : grspw_out_type; + +--GPIO + SIGNAL gpioi : gpio_in_type; + SIGNAL gpioo : gpio_out_type; + +-- AD Converter ADS7886 + SIGNAL sample : Samples14v(8 DOWNTO 0); + SIGNAL sample_s : Samples(8 DOWNTO 0); + SIGNAL sample_val : STD_LOGIC; + SIGNAL ADC_OEB_bar_CH_s : STD_LOGIC_VECTOR(8 DOWNTO 0); + + ----------------------------------------------------------------------------- + SIGNAL observation_reg : STD_LOGIC_VECTOR(31 DOWNTO 0); + + ----------------------------------------------------------------------------- + SIGNAL rstn_25 : STD_LOGIC; + SIGNAL rstn_24 : STD_LOGIC; + + SIGNAL LFR_soft_rstn : STD_LOGIC; + SIGNAL LFR_rstn : STD_LOGIC; + + SIGNAL ADC_smpclk_s : STD_LOGIC; + + SIGNAL nSRAM_CE : STD_LOGIC_VECTOR(1 DOWNTO 0); + + SIGNAL clk50MHz_int : STD_LOGIC := '0'; + + component clkint port(A : in std_ulogic; Y :out std_ulogic); end component; + +BEGIN -- beh + + ----------------------------------------------------------------------------- + -- CLK + ----------------------------------------------------------------------------- + rst_domain25 : rstgen PORT MAP (reset, clk_25, '1', rstn_25, OPEN); + rst_domain24 : rstgen PORT MAP (reset, clk_24, '1', rstn_24, OPEN); + + --clk_pad : clkint port map (A => clk50MHz, Y => clk50MHz_int ); + clk50MHz_int <= clk50MHz; + PROCESS(clk50MHz_int) + BEGIN + IF clk50MHz_int'EVENT AND clk50MHz_int = '1' THEN + clk_25_int <= NOT clk_25_int; + END IF; + END PROCESS; + clk_pad : clkint port map (A => clk_25_int, Y => clk_25 ); + + PROCESS(clk49_152MHz) + BEGIN + IF clk49_152MHz'EVENT AND clk49_152MHz = '1' THEN + clk_24 <= NOT clk_24; + END IF; + END PROCESS; + + ----------------------------------------------------------------------------- + -- + leon3_soc_1 : leon3_soc + GENERIC MAP ( + fabtech => apa3e, + memtech => apa3e, + padtech => inferred, + clktech => inferred, + disas => 0, + dbguart => 0, + pclow => 2, + clk_freq => 25000, + IS_RADHARD => 0, + NB_CPU => 1, + ENABLE_FPU => 1, + FPU_NETLIST => 0, + ENABLE_DSU => 1, + ENABLE_AHB_UART => 1, + ENABLE_APB_UART => 1, + ENABLE_IRQMP => 1, + ENABLE_GPT => 1, + NB_AHB_MASTER => NB_AHB_MASTER, + NB_AHB_SLAVE => NB_AHB_SLAVE, + NB_APB_SLAVE => NB_APB_SLAVE, + ADDRESS_SIZE => 19, + USES_IAP_MEMCTRLR => 1) + PORT MAP ( + clk => clk_25, + reset => rstn_25, + errorn => OPEN, + + ahbrxd => TAG1, + ahbtxd => TAG3, + urxd1 => TAG2, + utxd1 => TAG4, + + address => address, + data => data, + nSRAM_BE0 => OPEN, + nSRAM_BE1 => OPEN, + nSRAM_BE2 => OPEN, + nSRAM_BE3 => OPEN, + nSRAM_WE => nSRAM_W, + nSRAM_CE => nSRAM_CE, + nSRAM_OE => nSRAM_G, + nSRAM_READY => nSRAM_BUSY, + SRAM_MBE => nSRAM_MBE, + + apbi_ext => apbi_ext, + apbo_ext => apbo_ext, + ahbi_s_ext => ahbi_s_ext, + ahbo_s_ext => ahbo_s_ext, + ahbi_m_ext => ahbi_m_ext, + ahbo_m_ext => ahbo_m_ext); + + + nSRAM_E1 <= nSRAM_CE(0); + nSRAM_E2 <= nSRAM_CE(1); + +------------------------------------------------------------------------------- +-- APB_LFR_TIME_MANAGEMENT ---------------------------------------------------- +------------------------------------------------------------------------------- + --apb_lfr_management_1 : apb_lfr_management + -- GENERIC MAP ( + -- tech => apa3e, + -- pindex => 6, + -- paddr => 6, + -- pmask => 16#fff#, + -- FIRST_DIVISION => 374, -- ((49.152/2) /2^16) - 1 = 375 - 1 = 374 + -- NB_SECOND_DESYNC => 60) -- 60 secondes of desynchronization before CoarseTime's MSB is Set + -- PORT MAP ( + -- clk25MHz => clk_25, + -- resetn_25MHz => rstn_25, -- TODO + -- clk24_576MHz => clk_24, -- 49.152MHz/2 + -- resetn_24_576MHz => rstn_24, -- TODO + + -- grspw_tick => swno.tickout, + -- apbi => apbi_ext, + -- apbo => apbo_ext(6), + + -- HK_sample => sample_s(8), + -- HK_val => sample_val, + -- HK_sel => HK_SEL, + + -- DAC_SDO => DAC_SDO, + -- DAC_SCK => DAC_SCK, + -- DAC_SYNC => DAC_SYNC, + -- DAC_CAL_EN => DAC_CAL_EN, + + -- coarse_time => coarse_time, + -- fine_time => fine_time, + -- LFR_soft_rstn => LFR_soft_rstn + -- ); + HK_sel <= "00"; + + DAC_SDO <= '1'; + DAC_SCK <= '0'; + DAC_SYNC <= '0'; + DAC_CAL_EN <= '0'; + +----------------------------------------------------------------------- +--- SpaceWire -------------------------------------------------------- +----------------------------------------------------------------------- + + ------------------------------------------------------------------------------ + -- \/\/\/\/ TODO : spacewire enable should be controled by the SPW IP \/\/\/\/ + ------------------------------------------------------------------------------ + spw1_en <= '1'; + spw2_en <= '1'; + ------------------------------------------------------------------------------ + -- /\/\/\/\ --------------------------------------------------------- /\/\/\/\ + ------------------------------------------------------------------------------ + + --spw_clk <= clk50MHz_int; + --spw_rxtxclk <= spw_clk; + --spw_rxclkn <= NOT spw_rxtxclk; + + -- PADS for SPW1 + spw1_rxd_pad : inpad GENERIC MAP (tech => inferred) + PORT MAP (spw1_din, dtmp(0)); + spw1_rxs_pad : inpad GENERIC MAP (tech => inferred) + PORT MAP (spw1_sin, stmp(0)); + spw1_txd_pad : outpad GENERIC MAP (tech => inferred) + PORT MAP (spw1_dout, swno.d(0)); + spw1_txs_pad : outpad GENERIC MAP (tech => inferred) + PORT MAP (spw1_sout, swno.s(0)); + -- PADS FOR SPW2 + spw2_rxd_pad : inpad GENERIC MAP (tech => inferred) -- bad naming of the MINI-LFR /!\ + PORT MAP (spw2_din, dtmp(1)); + spw2_rxs_pad : inpad GENERIC MAP (tech => inferred) -- bad naming of the MINI-LFR /!\ + PORT MAP (spw2_sin, stmp(1)); + spw2_txd_pad : outpad GENERIC MAP (tech => inferred) + PORT MAP (spw2_dout, swno.d(1)); + spw2_txs_pad : outpad GENERIC MAP (tech => inferred) + PORT MAP (spw2_sout, swno.s(1)); + + -- GRSPW PHY + --spw1_input: if CFG_SPW_GRSPW = 1 generate + spw_inputloop : FOR j IN 0 TO 1 GENERATE + spw_phy0 : grspw_phy + GENERIC MAP( + tech => apa3e, + rxclkbuftype => 1, + scantest => 0) + PORT MAP( + rxrst => swno.rxrst, + di => dtmp(j), + si => stmp(j), + rxclko => spw_rxclk(j), + do => swni.d(j), + ndo => swni.nd(j*5+4 DOWNTO j*5), + dconnect => swni.dconnect(j*2+1 DOWNTO j*2)); + END GENERATE spw_inputloop; + + -- SPW core + sw0 : grspwm GENERIC MAP( + tech => apa3e, + hindex => 1, + pindex => 5, + paddr => 5, + pirq => 11, + sysfreq => 25000, -- CPU_FREQ + rmap => 1, + rmapcrc => 1, + fifosize1 => 16, + fifosize2 => 16, + rxclkbuftype => 1, + rxunaligned => 0, + rmapbufs => 4, + ft => 0, + netlist => 0, + ports => 2, + --dmachan => CFG_SPW_DMACHAN, -- not used byt the spw core 1 + memtech => apa3e, + destkey => 2, + spwcore => 1 + --input_type => CFG_SPW_INPUT, -- not used byt the spw core 1 + --output_type => CFG_SPW_OUTPUT, -- not used byt the spw core 1 + --rxtx_sameclk => CFG_SPW_RTSAME -- not used byt the spw core 1 + ) + PORT MAP(rstn_25, clk_25, + spw_rxclk(0), + spw_rxclk(1), + clk50MHz_int, + clk50MHz_int, +-- spw_rxtxclk, spw_rxtxclk, + ahbi_m_ext, ahbo_m_ext(1), apbi_ext, apbo_ext(5), + swni, swno); + + swni.tickin <= '0'; + swni.rmapen <= '1'; + swni.clkdiv10 <= "00000100"; -- 10 MHz / (4 + 1) = 10 MHz + swni.tickinraw <= '0'; + swni.timein <= (OTHERS => '0'); + swni.dcrstval <= (OTHERS => '0'); + swni.timerrstval <= (OTHERS => '0'); + +------------------------------------------------------------------------------- +-- LFR ------------------------------------------------------------------------ +------------------------------------------------------------------------------- + LFR_rstn <= LFR_soft_rstn AND rstn_25; + + --lpp_lfr_1 : lpp_lfr + -- GENERIC MAP ( + -- Mem_use => use_RAM, + -- nb_data_by_buffer_size => 32, + -- --nb_word_by_buffer_size => 30, + -- nb_snapshot_param_size => 32, + -- delta_vector_size => 32, + -- delta_vector_size_f0_2 => 7, -- log2(96) + -- pindex => 15, + -- paddr => 15, + -- pmask => 16#fff#, + -- pirq_ms => 6, + -- pirq_wfp => 14, + -- hindex => 2, + -- top_lfr_version => X"020144") -- aa.bb.cc version + -- -- AA : BOARD NUMBER + -- -- 0 => MINI_LFR + -- -- 1 => EM + -- -- 2 => EQM (with A3PE3000) + -- PORT MAP ( + -- clk => clk_25, + -- rstn => LFR_rstn, + -- sample_B => sample_s(2 DOWNTO 0), + -- sample_E => sample_s(7 DOWNTO 3), + -- sample_val => sample_val, + -- apbi => apbi_ext, + -- apbo => apbo_ext(15), + -- ahbi => ahbi_m_ext, + -- ahbo => ahbo_m_ext(2), + -- coarse_time => coarse_time, + -- fine_time => fine_time, + -- data_shaping_BW => bias_fail_sw, + -- debug_vector => OPEN, + -- debug_vector_ms => OPEN); --, + + --observation_vector_0 => OPEN, + --observation_vector_1 => OPEN, + --observation_reg => observation_reg); + bias_fail_sw <= '0'; + + all_sample : FOR I IN 7 DOWNTO 0 GENERATE + sample_s(I) <= sample(I) & '0' & '0'; + END GENERATE all_sample; + sample_s(8) <= sample(8)(13) & sample(8)(13) & sample(8); + + ----------------------------------------------------------------------------- + -- + ----------------------------------------------------------------------------- + --top_ad_conv_RHF1401_withFilter_1 : top_ad_conv_RHF1401_withFilter + -- GENERIC MAP ( + -- ChanelCount => 9, + -- ncycle_cnv_high => 13, + -- ncycle_cnv => 25, + -- FILTER_ENABLED => 16#FF#) + -- PORT MAP ( + -- cnv_clk => clk_24, + -- cnv_rstn => rstn_24, + -- cnv => ADC_smpclk_s, + -- clk => clk_25, + -- rstn => rstn_25, + -- ADC_data => ADC_data, + -- ADC_nOE => ADC_OEB_bar_CH_s, + -- sample => sample, + -- sample_val => sample_val); + + --ADC_OEB_bar_CH <= ADC_OEB_bar_CH_s(7 DOWNTO 0); + ADC_OEB_bar_CH <= (OTHERS => '1'); + + --ADC_smpclk <= ADC_smpclk_s; + --HK_smpclk <= ADC_smpclk_s; + ADC_smpclk <= '0'; + HK_smpclk <= '0'; + + TAG8 <= '0'; + + ----------------------------------------------------------------------------- + -- HK + ----------------------------------------------------------------------------- + --ADC_OEB_bar_HK <= ADC_OEB_bar_CH_s(8); + ADC_OEB_bar_HK <= '1'; + +END beh; diff --git a/designs/LFR-EQM-WFP_MS-debug/Makefile b/designs/LFR-EQM-WFP_MS-debug/Makefile new file mode 100644 --- /dev/null +++ b/designs/LFR-EQM-WFP_MS-debug/Makefile @@ -0,0 +1,55 @@ +#GRLIB=../.. +VHDLIB=../.. +SCRIPTSDIR=$(VHDLIB)/scripts/ +GRLIB := $(shell sh $(VHDLIB)/scripts/lpp_relpath.sh) +TOP=LFR_EQM +BOARD=LFR-EQM +include $(VHDLIB)/boards/$(BOARD)/Makefile.inc +DEVICE=$(PART)-$(PACKAGE)$(SPEED) +UCF=$(GRLIB)/boards/$(BOARD)/$(TOP).ucf +QSF=$(GRLIB)/boards/$(BOARD)/$(TOP).qsf +EFFORT=high +XSTOPT= +SYNPOPT="set_option -pipe 0; set_option -retiming 0; set_option -write_apr_constraint 0" +#VHDLSYNFILES=config.vhd ahbrom.vhd leon3mp.vhd +#VHDLSYNFILES=config.vhd leon3mp.vhd +VHDLSYNFILES=LFR-EQM.vhd +VHDLSIMFILES=testbench.vhd +#SIMTOP=testbench +PDC=$(VHDLIB)/boards/$(BOARD)/LFR_EQM_A3PE3000_debug.pdc +#SDCFILE=$(VHDLIB)/boards/$(BOARD)/LFR_EQM_synthesis.sdc +SDC=$(VHDLIB)/boards/$(BOARD)/LFR_EQM_place_and_route-debug.sdc + +BITGEN=$(VHDLIB)/boards/$(BOARD)/default.ut +CLEAN=soft-clean + +TECHLIBS = proasic3e + +LIBSKIP = core1553bbc core1553brm core1553brt gr1553 corePCIF \ + tmtc openchip hynix ihp gleichmann micron usbhc + +DIRSKIP = b1553 pcif leon2 leon2ft crypto satcan ddr usb ata i2c \ + pci grusbhc haps slink ascs pwm coremp7 spi ac97 \ + ./amba_lcd_16x2_ctrlr \ + ./general_purpose/lpp_AMR \ + ./general_purpose/lpp_balise \ + ./general_purpose/lpp_delay \ + ./lpp_bootloader \ + ./dsp/lpp_fft_rtax \ + ./lpp_uart \ + ./lpp_usb \ + ./lpp_sim/CY7C1061DV33 \ + +FILESKIP = i2cmst.vhd \ + APB_MULTI_DIODE.vhd \ + APB_MULTI_DIODE.vhd \ + Top_MatrixSpec.vhd \ + APB_FFT.vhd\ + CoreFFT_simu.vhd \ + lpp_lfr_apbreg_simu.vhd + +include $(GRLIB)/bin/Makefile +include $(GRLIB)/software/leon3/Makefile + +################## project specific targets ########################## + diff --git a/designs/LFR-EQM-WFP_MS-debug/run.do b/designs/LFR-EQM-WFP_MS-debug/run.do new file mode 100644 --- /dev/null +++ b/designs/LFR-EQM-WFP_MS-debug/run.do @@ -0,0 +1,10 @@ +vcom -quiet -93 -work work LFR-em.vhd +vcom -quiet -93 -work work testbench.vhd + +vsim work.testbench + +log -r * + +do wave.do + +run 65 ms diff --git a/designs/LFR-EQM-WFP_MS-debug/testbench.vhd b/designs/LFR-EQM-WFP_MS-debug/testbench.vhd new file mode 100644 --- /dev/null +++ b/designs/LFR-EQM-WFP_MS-debug/testbench.vhd @@ -0,0 +1,382 @@ +LIBRARY ieee; +USE ieee.std_logic_1164.ALL; +USE ieee.numeric_std.ALL; +use IEEE.std_logic_textio.all; +LIBRARY STD; +use std.textio.all; + +LIBRARY grlib; +USE grlib.stdlib.ALL; +LIBRARY gaisler; +USE gaisler.libdcom.ALL; +USE gaisler.sim.ALL; +USE gaisler.jtagtst.ALL; +LIBRARY techmap; +USE techmap.gencomp.ALL; + +LIBRARY lpp; +USE lpp.lpp_sim_pkg.ALL; +USE lpp.lpp_lfr_sim_pkg.ALL; +USE lpp.lpp_lfr_apbreg_pkg.ALL; +USE lpp.lpp_lfr_time_management_apbreg_pkg.ALL; + + +ENTITY testbench IS +END; + +ARCHITECTURE behav OF testbench IS + + COMPONENT LFR_em + PORT ( + clk100MHz : IN STD_ULOGIC; + clk49_152MHz : IN STD_ULOGIC; + reset : IN STD_ULOGIC; + TAG1 : IN STD_ULOGIC; + TAG3 : OUT STD_ULOGIC; + TAG2 : IN STD_ULOGIC; + TAG4 : OUT STD_ULOGIC; + address : OUT STD_LOGIC_VECTOR(19 DOWNTO 0); + data : INOUT STD_LOGIC_VECTOR(31 DOWNTO 0); + nSRAM_BE0 : OUT STD_LOGIC; + nSRAM_BE1 : OUT STD_LOGIC; + nSRAM_BE2 : OUT STD_LOGIC; + nSRAM_BE3 : OUT STD_LOGIC; + nSRAM_WE : OUT STD_LOGIC; + nSRAM_CE : OUT STD_LOGIC; + nSRAM_OE : OUT STD_LOGIC; + spw1_din : IN STD_LOGIC; + spw1_sin : IN STD_LOGIC; + spw1_dout : OUT STD_LOGIC; + spw1_sout : OUT STD_LOGIC; + spw2_din : IN STD_LOGIC; + spw2_sin : IN STD_LOGIC; + spw2_dout : OUT STD_LOGIC; + spw2_sout : OUT STD_LOGIC; + bias_fail_sw : OUT STD_LOGIC; + ADC_OEB_bar_CH : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); + ADC_smpclk : OUT STD_LOGIC; + ADC_data : IN STD_LOGIC_VECTOR(13 DOWNTO 0); + HK_smpclk : OUT STD_LOGIC; + ADC_OEB_bar_HK : OUT STD_LOGIC; + HK_SEL : OUT STD_LOGIC_VECTOR(1 DOWNTO 0); + TAG8 : OUT STD_LOGIC; + led : OUT STD_LOGIC_VECTOR(2 DOWNTO 0)); + END COMPONENT; + + + --COMPONENT MINI_LFR_top + -- PORT ( + -- clk_50 : IN STD_LOGIC; + -- clk_49 : IN STD_LOGIC; + -- reset : IN STD_LOGIC; + -- BP0 : IN STD_LOGIC; + -- BP1 : IN STD_LOGIC; + -- LED0 : OUT STD_LOGIC; + -- LED1 : OUT STD_LOGIC; + -- LED2 : OUT STD_LOGIC; + -- TXD1 : IN STD_LOGIC; + -- RXD1 : OUT STD_LOGIC; + -- nCTS1 : OUT STD_LOGIC; + -- nRTS1 : IN STD_LOGIC; + -- TXD2 : IN STD_LOGIC; + -- RXD2 : OUT STD_LOGIC; + -- nCTS2 : OUT STD_LOGIC; + -- nDTR2 : IN STD_LOGIC; + -- nRTS2 : IN STD_LOGIC; + -- nDCD2 : OUT STD_LOGIC; + -- IO0 : INOUT STD_LOGIC; + -- IO1 : INOUT STD_LOGIC; + -- IO2 : INOUT STD_LOGIC; + -- IO3 : INOUT STD_LOGIC; + -- IO4 : INOUT STD_LOGIC; + -- IO5 : INOUT STD_LOGIC; + -- IO6 : INOUT STD_LOGIC; + -- IO7 : INOUT STD_LOGIC; + -- IO8 : INOUT STD_LOGIC; + -- IO9 : INOUT STD_LOGIC; + -- IO10 : INOUT STD_LOGIC; + -- IO11 : INOUT STD_LOGIC; + -- SPW_EN : OUT STD_LOGIC; + -- SPW_NOM_DIN : IN STD_LOGIC; + -- SPW_NOM_SIN : IN STD_LOGIC; + -- SPW_NOM_DOUT : OUT STD_LOGIC; + -- SPW_NOM_SOUT : OUT STD_LOGIC; + -- SPW_RED_DIN : IN STD_LOGIC; + -- SPW_RED_SIN : IN STD_LOGIC; + -- SPW_RED_DOUT : OUT STD_LOGIC; + -- SPW_RED_SOUT : OUT STD_LOGIC; + -- ADC_nCS : OUT STD_LOGIC; + -- ADC_CLK : OUT STD_LOGIC; + -- ADC_SDO : IN STD_LOGIC_VECTOR(7 DOWNTO 0); + -- SRAM_nWE : OUT STD_LOGIC; + -- SRAM_CE : OUT STD_LOGIC; + -- SRAM_nOE : OUT STD_LOGIC; + -- SRAM_nBE : OUT STD_LOGIC_VECTOR(3 DOWNTO 0); + -- SRAM_A : OUT STD_LOGIC_VECTOR(19 DOWNTO 0); + -- SRAM_DQ : INOUT STD_LOGIC_VECTOR(31 DOWNTO 0)); + --END COMPONENT; + + ----------------------------------------------------------------------------- + SIGNAL clk_50 : STD_LOGIC := '0'; + SIGNAL clk_49 : STD_LOGIC := '0'; + SIGNAL reset : STD_LOGIC; + SIGNAL BP0 : STD_LOGIC; + SIGNAL BP1 : STD_LOGIC; + SIGNAL LED0 : STD_LOGIC; + SIGNAL LED1 : STD_LOGIC; + SIGNAL LED2 : STD_LOGIC; + SIGNAL TXD1 : STD_LOGIC; + SIGNAL RXD1 : STD_LOGIC; + SIGNAL nCTS1 : STD_LOGIC; + SIGNAL nRTS1 : STD_LOGIC; + SIGNAL TXD2 : STD_LOGIC; + SIGNAL RXD2 : STD_LOGIC; + SIGNAL nCTS2 : STD_LOGIC; + SIGNAL nDTR2 : STD_LOGIC; + SIGNAL nRTS2 : STD_LOGIC; + SIGNAL nDCD2 : STD_LOGIC; + SIGNAL IO0 : STD_LOGIC; + SIGNAL IO1 : STD_LOGIC; + SIGNAL IO2 : STD_LOGIC; + SIGNAL IO3 : STD_LOGIC; + SIGNAL IO4 : STD_LOGIC; + SIGNAL IO5 : STD_LOGIC; + SIGNAL IO6 : STD_LOGIC; + SIGNAL IO7 : STD_LOGIC; + SIGNAL IO8 : STD_LOGIC; + SIGNAL IO9 : STD_LOGIC; + SIGNAL IO10 : STD_LOGIC; + SIGNAL IO11 : STD_LOGIC; + SIGNAL SPW_EN : STD_LOGIC; + SIGNAL SPW_NOM_DIN : STD_LOGIC; + SIGNAL SPW_NOM_SIN : STD_LOGIC; + SIGNAL SPW_NOM_DOUT : STD_LOGIC; + SIGNAL SPW_NOM_SOUT : STD_LOGIC; + SIGNAL SPW_RED_DIN : STD_LOGIC; + SIGNAL SPW_RED_SIN : STD_LOGIC; + SIGNAL SPW_RED_DOUT : STD_LOGIC; + SIGNAL SPW_RED_SOUT : STD_LOGIC; + SIGNAL ADC_nCS : STD_LOGIC; + SIGNAL ADC_CLK : STD_LOGIC; + SIGNAL ADC_SDO : STD_LOGIC_VECTOR(7 DOWNTO 0); + SIGNAL SRAM_nWE : STD_LOGIC; + SIGNAL SRAM_CE : STD_LOGIC; + SIGNAL SRAM_nOE : STD_LOGIC; + SIGNAL SRAM_nBE : STD_LOGIC_VECTOR(3 DOWNTO 0); + SIGNAL SRAM_A : STD_LOGIC_VECTOR(19 DOWNTO 0); + SIGNAL SRAM_DQ : STD_LOGIC_VECTOR(31 DOWNTO 0); + + ----------------------------------------------------------------------------- + + SIGNAL ADC_OEB_bar_CH : STD_LOGIC_VECTOR(7 DOWNTO 0); + SIGNAL ADC_smpclk : STD_LOGIC; + SIGNAL ADC_data : STD_LOGIC_VECTOR(13 DOWNTO 0); + SIGNAL HK_smpclk : STD_LOGIC; + SIGNAL ADC_OEB_bar_HK : STD_LOGIC; + SIGNAL HK_SEL : STD_LOGIC_VECTOR(1 DOWNTO 0); + + SIGNAL all_OEB_bar : STD_LOGIC_VECTOR(8 DOWNTO 0); + SIGNAL HK_SEL_DATA : STD_LOGIC_VECTOR(13 DOWNTO 0); + + ----------------------------------------------------------------------------- + + CONSTANT ADDR_BASE_LFR : STD_LOGIC_VECTOR(31 DOWNTO 8) := X"80000F"; + CONSTANT ADDR_BASE_TIME_MANAGMENT : STD_LOGIC_VECTOR(31 DOWNTO 8) := X"800006"; + CONSTANT ADDR_BASE_GPIO : STD_LOGIC_VECTOR(31 DOWNTO 8) := X"80000B"; + + + SIGNAL message_simu : STRING(1 TO 15) := "---------------"; + SIGNAL data_message : STRING(1 TO 15) := "---------------"; + SIGNAL data_read : STD_LOGIC_VECTOR(31 DOWNTO 0) := (OTHERS => '0'); + +BEGIN + + ----------------------------------------------------------------------------- + -- TB + ----------------------------------------------------------------------------- + PROCESS + CONSTANT txp : TIME := 320 ns; + VARIABLE data_read_v : STD_LOGIC_VECTOR(31 DOWNTO 0); + BEGIN -- PROCESS + TXD1 <= '1'; + reset <= '0'; + WAIT FOR 500 ns; + reset <= '1'; + WAIT FOR 10000 ns; + message_simu <= "0 - UART init "; + UART_INIT(TXD1,txp); + + message_simu <= "1 - UART test "; + UART_WRITE(TXD1,txp,ADDR_BASE_GPIO & "000010",X"0000FFFF"); + UART_WRITE(TXD1,txp,ADDR_BASE_GPIO & "000001",X"00000A0A"); + UART_WRITE(TXD1,txp,ADDR_BASE_GPIO & "000001",X"00000B0B"); + UART_READ(TXD1,RXD1,txp,ADDR_BASE_GPIO & "000001",data_read_v); + data_read <= data_read_v; + data_message <= "GPIO_data_write"; + + -- UNSET the LFR reset + message_simu <= "2 - LFR UNRESET"; + UNRESET_LFR(TXD1,txp,ADDR_BASE_TIME_MANAGMENT); + --UART_WRITE(TXD1,txp,ADDR_BASE_TIME_MANAGMENT & ADDR_LFR_TM_CONTROL , X"00000000"); + --UART_WRITE(TXD1,txp,ADDR_BASE_TIME_MANAGMENT & ADDR_LFR_TM_TIME_LOAD , X"00000000"); + -- + message_simu <= "3 - LFR CONFIG "; + --UART_WRITE(TXD1,txp,ADDR_BASE_LFR & ADDR_LFR_SM_F0_0_ADDR , X"00000B0B"); + LAUNCH_SPECTRAL_MATRIX(TXD1,RXD1,txp,ADDR_BASE_LFR, + X"40000000", + X"40001000", + X"40002000", + X"40003000", + X"40004000", + X"40005000"); + + + LAUNCH_WAVEFORM_PICKER(TXD1,RXD1,txp, + LFR_MODE_SBM1, + X"7FFFFFFF", -- START DATE + + "00000",--DATA_SHAPING ( 4 DOWNTO 0) + X"00012BFF",--DELTA_SNAPSHOT(31 DOWNTO 0) + X"0001280A",--DELTA_F0 (31 DOWNTO 0) + X"00000007",--DELTA_F0_2 (31 DOWNTO 0) + X"0001283F",--DELTA_F1 (31 DOWNTO 0) + X"000127FF",--DELTA_F2 (31 DOWNTO 0) + + ADDR_BASE_LFR, + X"40006000", + X"40007000", + X"40008000", + X"40009000", + X"4000A000", + X"4000B000", + X"4000C000", + X"4000D000"); + + UART_WRITE(TXD1 ,txp,ADDR_BASE_LFR & ADDR_LFR_WP_LENGTH, X"0000000F"); + UART_WRITE(TXD1 ,txp,ADDR_BASE_LFR & ADDR_LFR_WP_DATA_IN_BUFFER, X"00000050"); + + message_simu <= "4 - GO GO GO !!"; + UART_WRITE (TXD1 ,txp,ADDR_BASE_LFR & ADDR_LFR_WP_START_DATE,X"00000000"); + + READ_STATUS: LOOP + WAIT FOR 2 ms; + data_message <= "READ_NEW_STATUS"; + UART_READ(TXD1,RXD1,txp,ADDR_BASE_LFR & ADDR_LFR_SM_STATUS,data_read_v); + data_read <= data_read_v; + UART_WRITE(TXD1, txp,ADDR_BASE_LFR & ADDR_LFR_SM_STATUS,data_read_v); + + UART_READ(TXD1,RXD1,txp,ADDR_BASE_LFR & ADDR_LFR_WP_STATUS,data_read_v); + data_read <= data_read_v; + UART_WRITE(TXD1, txp,ADDR_BASE_LFR & ADDR_LFR_WP_STATUS,data_read_v); + END LOOP READ_STATUS; + + WAIT; + END PROCESS; + + ----------------------------------------------------------------------------- + -- CLOCK + ----------------------------------------------------------------------------- + clk_50 <= NOT clk_50 AFTER 5 ns; + clk_49 <= NOT clk_49 AFTER 10172 ps; + + ----------------------------------------------------------------------------- + -- DON'T CARE + ----------------------------------------------------------------------------- + BP0 <= '0'; + BP1 <= '0'; + nRTS1 <= '0' ; + + TXD2 <= '1'; + nRTS2 <= '1'; + nDTR2 <= '1'; + + SPW_NOM_DIN <= '1'; + SPW_NOM_SIN <= '1'; + SPW_RED_DIN <= '1'; + SPW_RED_SIN <= '1'; + + ADC_SDO <= x"AA"; + + SRAM_DQ <= (OTHERS => 'Z'); + --IO0 <= 'Z'; + --IO1 <= 'Z'; + --IO2 <= 'Z'; + --IO3 <= 'Z'; + --IO4 <= 'Z'; + --IO5 <= 'Z'; + --IO6 <= 'Z'; + --IO7 <= 'Z'; + --IO8 <= 'Z'; + --IO9 <= 'Z'; + --IO10 <= 'Z'; + --IO11 <= 'Z'; + + ----------------------------------------------------------------------------- + -- DUT + ----------------------------------------------------------------------------- + + LFR_em_1: LFR_em + PORT MAP ( + clk100MHz => clk_50, + clk49_152MHz => clk_49, + reset => reset, + + TAG1 => TXD1, + TAG3 => RXD1, + TAG2 => TXD2, + TAG4 => RXD2, + + address => SRAM_A, + data => SRAM_DQ, + nSRAM_BE0 => SRAM_nBE(0), + nSRAM_BE1 => SRAM_nBE(1), + nSRAM_BE2 => SRAM_nBE(2), + nSRAM_BE3 => SRAM_nBE(3), + nSRAM_WE => SRAM_nWE, + nSRAM_CE => SRAM_CE, + nSRAM_OE => SRAM_nOE, + + spw1_din => SPW_NOM_DIN, + spw1_sin => SPW_NOM_SIN, + spw1_dout => SPW_NOM_DOUT, + spw1_sout => SPW_NOM_SOUT, + spw2_din => SPW_RED_DIN, + spw2_sin => SPW_RED_SIN, + spw2_dout => SPW_RED_DOUT, + spw2_sout => SPW_RED_SOUT, + + bias_fail_sw => OPEN, + + ADC_OEB_bar_CH => ADC_OEB_bar_CH, + ADC_smpclk => ADC_smpclk, + ADC_data => ADC_data, + HK_smpclk => HK_smpclk, + ADC_OEB_bar_HK => ADC_OEB_bar_HK, + HK_SEL => HK_SEL, + + TAG8 => OPEN, + led => OPEN); + + all_OEB_bar <= ADC_OEB_bar_HK & ADC_OEB_bar_CH; + + WITH HK_SEL SELECT + HK_SEL_DATA <= + "00"&X"00F" WHEN "00", + "00"&X"01F" WHEN "01", + "00"&X"02F" WHEN "10", + "XXXXXXXXXXXXXX" WHEN OTHERS; + + WITH all_OEB_bar SELECT + ADC_data <= + "00"&X"000" WHEN "111111110", + "00"&X"001" WHEN "111111101", + "00"&X"002" WHEN "111111011", + "00"&X"003" WHEN "111110111", + "00"&X"004" WHEN "111101111", + "00"&X"005" WHEN "111011111", + "00"&X"006" WHEN "110111111", + "00"&X"007" WHEN "101111111", + HK_SEL_DATA WHEN "011111111", + "XXXXXXXXXXXXXX" WHEN OTHERS; + +END; diff --git a/designs/LFR-EQM-WFP_MS-debug/wave.do b/designs/LFR-EQM-WFP_MS-debug/wave.do new file mode 100644 --- /dev/null +++ b/designs/LFR-EQM-WFP_MS-debug/wave.do @@ -0,0 +1,28 @@ +onerror {resume} +quietly WaveActivateNextPane {} 0 +add wave -noupdate -radix hexadecimal -childformat {{/testbench/LFR_em_1/lpp_lfr_hk_1/reg_hk.temp_0 -radix hexadecimal -childformat {{/testbench/LFR_em_1/lpp_lfr_hk_1/reg_hk.temp_0(15) -radix hexadecimal} {/testbench/LFR_em_1/lpp_lfr_hk_1/reg_hk.temp_0(14) -radix hexadecimal} {/testbench/LFR_em_1/lpp_lfr_hk_1/reg_hk.temp_0(13) -radix hexadecimal} {/testbench/LFR_em_1/lpp_lfr_hk_1/reg_hk.temp_0(12) -radix hexadecimal} {/testbench/LFR_em_1/lpp_lfr_hk_1/reg_hk.temp_0(11) -radix hexadecimal} {/testbench/LFR_em_1/lpp_lfr_hk_1/reg_hk.temp_0(10) -radix hexadecimal} {/testbench/LFR_em_1/lpp_lfr_hk_1/reg_hk.temp_0(9) -radix hexadecimal} {/testbench/LFR_em_1/lpp_lfr_hk_1/reg_hk.temp_0(8) -radix hexadecimal} {/testbench/LFR_em_1/lpp_lfr_hk_1/reg_hk.temp_0(7) -radix hexadecimal} {/testbench/LFR_em_1/lpp_lfr_hk_1/reg_hk.temp_0(6) -radix hexadecimal} {/testbench/LFR_em_1/lpp_lfr_hk_1/reg_hk.temp_0(5) -radix hexadecimal} {/testbench/LFR_em_1/lpp_lfr_hk_1/reg_hk.temp_0(4) -radix hexadecimal} {/testbench/LFR_em_1/lpp_lfr_hk_1/reg_hk.temp_0(3) -radix hexadecimal} {/testbench/LFR_em_1/lpp_lfr_hk_1/reg_hk.temp_0(2) -radix hexadecimal} {/testbench/LFR_em_1/lpp_lfr_hk_1/reg_hk.temp_0(1) -radix hexadecimal} {/testbench/LFR_em_1/lpp_lfr_hk_1/reg_hk.temp_0(0) -radix hexadecimal}}} {/testbench/LFR_em_1/lpp_lfr_hk_1/reg_hk.temp_1 -radix hexadecimal} {/testbench/LFR_em_1/lpp_lfr_hk_1/reg_hk.temp_2 -radix hexadecimal}} -expand -subitemconfig {/testbench/LFR_em_1/lpp_lfr_hk_1/reg_hk.temp_0 {-radix hexadecimal -childformat {{/testbench/LFR_em_1/lpp_lfr_hk_1/reg_hk.temp_0(15) -radix hexadecimal} {/testbench/LFR_em_1/lpp_lfr_hk_1/reg_hk.temp_0(14) -radix hexadecimal} {/testbench/LFR_em_1/lpp_lfr_hk_1/reg_hk.temp_0(13) -radix hexadecimal} {/testbench/LFR_em_1/lpp_lfr_hk_1/reg_hk.temp_0(12) -radix hexadecimal} {/testbench/LFR_em_1/lpp_lfr_hk_1/reg_hk.temp_0(11) -radix hexadecimal} {/testbench/LFR_em_1/lpp_lfr_hk_1/reg_hk.temp_0(10) -radix hexadecimal} {/testbench/LFR_em_1/lpp_lfr_hk_1/reg_hk.temp_0(9) -radix hexadecimal} {/testbench/LFR_em_1/lpp_lfr_hk_1/reg_hk.temp_0(8) -radix hexadecimal} {/testbench/LFR_em_1/lpp_lfr_hk_1/reg_hk.temp_0(7) -radix hexadecimal} {/testbench/LFR_em_1/lpp_lfr_hk_1/reg_hk.temp_0(6) -radix hexadecimal} {/testbench/LFR_em_1/lpp_lfr_hk_1/reg_hk.temp_0(5) -radix hexadecimal} {/testbench/LFR_em_1/lpp_lfr_hk_1/reg_hk.temp_0(4) -radix hexadecimal} {/testbench/LFR_em_1/lpp_lfr_hk_1/reg_hk.temp_0(3) -radix hexadecimal} {/testbench/LFR_em_1/lpp_lfr_hk_1/reg_hk.temp_0(2) -radix hexadecimal} {/testbench/LFR_em_1/lpp_lfr_hk_1/reg_hk.temp_0(1) -radix hexadecimal} {/testbench/LFR_em_1/lpp_lfr_hk_1/reg_hk.temp_0(0) -radix hexadecimal}}} /testbench/LFR_em_1/lpp_lfr_hk_1/reg_hk.temp_0(15) {-radix hexadecimal} /testbench/LFR_em_1/lpp_lfr_hk_1/reg_hk.temp_0(14) {-radix hexadecimal} /testbench/LFR_em_1/lpp_lfr_hk_1/reg_hk.temp_0(13) {-radix hexadecimal} /testbench/LFR_em_1/lpp_lfr_hk_1/reg_hk.temp_0(12) {-radix hexadecimal} /testbench/LFR_em_1/lpp_lfr_hk_1/reg_hk.temp_0(11) {-radix hexadecimal} /testbench/LFR_em_1/lpp_lfr_hk_1/reg_hk.temp_0(10) {-radix hexadecimal} /testbench/LFR_em_1/lpp_lfr_hk_1/reg_hk.temp_0(9) {-radix hexadecimal} /testbench/LFR_em_1/lpp_lfr_hk_1/reg_hk.temp_0(8) {-radix hexadecimal} /testbench/LFR_em_1/lpp_lfr_hk_1/reg_hk.temp_0(7) {-radix hexadecimal} /testbench/LFR_em_1/lpp_lfr_hk_1/reg_hk.temp_0(6) {-radix hexadecimal} /testbench/LFR_em_1/lpp_lfr_hk_1/reg_hk.temp_0(5) {-radix hexadecimal} /testbench/LFR_em_1/lpp_lfr_hk_1/reg_hk.temp_0(4) {-radix hexadecimal} /testbench/LFR_em_1/lpp_lfr_hk_1/reg_hk.temp_0(3) {-radix hexadecimal} /testbench/LFR_em_1/lpp_lfr_hk_1/reg_hk.temp_0(2) {-radix hexadecimal} /testbench/LFR_em_1/lpp_lfr_hk_1/reg_hk.temp_0(1) {-radix hexadecimal} /testbench/LFR_em_1/lpp_lfr_hk_1/reg_hk.temp_0(0) {-radix hexadecimal} /testbench/LFR_em_1/lpp_lfr_hk_1/reg_hk.temp_1 {-radix hexadecimal} /testbench/LFR_em_1/lpp_lfr_hk_1/reg_hk.temp_2 {-radix hexadecimal}} /testbench/LFR_em_1/lpp_lfr_hk_1/reg_hk +add wave -noupdate /testbench/LFR_em_1/ADC_data +add wave -noupdate /testbench/LFR_em_1/ADC_data +add wave -noupdate /testbench/LFR_em_1/HK_SEL +add wave -noupdate /testbench/LFR_em_1/ADC_OEB_bar_HK +add wave -noupdate /testbench/LFR_em_1/HK_smpclk +add wave -noupdate /testbench/LFR_em_1/ADC_smpclk +add wave -noupdate /testbench/LFR_em_1/ADC_OEB_bar_CH +TreeUpdate [SetDefaultTree] +WaveRestoreCursors {{Cursor 1} {0 ps} 0} +quietly wave cursor active 0 +configure wave -namecolwidth 233 +configure wave -valuecolwidth 100 +configure wave -justifyvalue left +configure wave -signalnamewidth 0 +configure wave -snapdistance 10 +configure wave -datasetprefix 0 +configure wave -rowmargin 4 +configure wave -childrowmargin 2 +configure wave -gridoffset 0 +configure wave -gridperiod 1 +configure wave -griddelta 40 +configure wave -timeline 0 +configure wave -timelineunits ns +update +WaveRestoreZoom {934646651 ps} {1003439650 ps}