diff --git a/boards/uniboard2b/libraries/unb2b_board/hdllib.cfg b/boards/uniboard2b/libraries/unb2b_board/hdllib.cfg index f259881a91659e750efe1e23be4c9270134bd9d9..4bd8057a2fed687f925d01d3ab478d32194472d5 100644 --- a/boards/uniboard2b/libraries/unb2b_board/hdllib.cfg +++ b/boards/uniboard2b/libraries/unb2b_board/hdllib.cfg @@ -26,7 +26,6 @@ synth_files = src/vhdl/unb2b_board_hmc_ctrl.vhd src/vhdl/unb2b_board_sens.vhd src/vhdl/unb2b_board_sens_reg.vhd - src/vhdl/unb2b_fpga_sens_reg.vhd src/vhdl/mms_unb2b_board_sens.vhd src/vhdl/mms_unb2b_fpga_sens.vhd src/vhdl/unb2b_board_wdi_reg.vhd diff --git a/boards/uniboard2b/libraries/unb2b_board/src/vhdl/mms_unb2b_fpga_sens.vhd b/boards/uniboard2b/libraries/unb2b_board/src/vhdl/mms_unb2b_fpga_sens.vhd index 3b80d6548698d3f4a776987d8322c77f79185b6d..9db4496059eaa928afed5c9f0d20ed492f30fdaf 100644 --- a/boards/uniboard2b/libraries/unb2b_board/src/vhdl/mms_unb2b_fpga_sens.vhd +++ b/boards/uniboard2b/libraries/unb2b_board/src/vhdl/mms_unb2b_fpga_sens.vhd @@ -22,7 +22,7 @@ -- Purpose : MMS for unb2b_fpga_sens -- Description: See unb2b_fpga_sens.vhd -LIBRARY IEEE, technology_lib, common_lib; +LIBRARY IEEE, technology_lib, common_lib, fpga_sense_lib; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.NUMERIC_STD.ALL; USE common_lib.common_pkg.ALL; @@ -43,10 +43,10 @@ ENTITY mms_unb2b_fpga_sens IS mm_start : IN STD_LOGIC; -- Memory-mapped clock domain - reg_temp_mosi : IN t_mem_mosi := c_mem_mosi_rst; -- actual ranges defined by c_mm_reg - reg_temp_miso : OUT t_mem_miso; -- actual ranges defined by c_mm_reg - reg_voltage_mosi : IN t_mem_mosi := c_mem_mosi_rst; -- actual ranges defined by c_mm_reg - reg_voltage_miso : OUT t_mem_miso; -- actual ranges defined by c_mm_reg + reg_temp_mosi : IN t_mem_mosi := c_mem_mosi_rst; -- actual ranges defined by c_mm_reg + reg_temp_miso : OUT t_mem_miso; -- actual ranges defined by c_mm_reg + reg_voltage_mosi : IN t_mem_mosi := c_mem_mosi_rst; -- actual ranges defined by c_mm_reg + reg_voltage_miso : OUT t_mem_miso; -- actual ranges defined by c_mm_reg -- Temperature alarm output temp_alarm : OUT STD_LOGIC @@ -56,67 +56,27 @@ END mms_unb2b_fpga_sens; ARCHITECTURE str OF mms_unb2b_fpga_sens IS - CONSTANT c_sens_nof_result : NATURAL := 1; -- - CONSTANT c_temp_high_w : NATURAL := 7; -- Allow user to use only 7 (no sign, only positive) of 8 bits to set set max temp - - SIGNAL sens_err : STD_LOGIC; - SIGNAL sens_data : t_slv_8_arr(0 TO c_sens_nof_result-1); - - SIGNAL temp_high : STD_LOGIC_VECTOR(c_temp_high_w-1 DOWNTO 0); - BEGIN - u_unb2b_fpga_sens_reg : ENTITY work.unb2b_fpga_sens_reg + u_fpga_sense: ENTITY fpga_sense_lib.fpga_sense GENERIC MAP ( - g_sim => g_sim, - g_technology => g_technology, - g_sens_nof_result => c_sens_nof_result, - g_temp_high => g_temp_high + g_technology => g_technology, + g_sim => g_sim, + g_temp_high => g_temp_high ) PORT MAP ( - -- Clocks and reset - mm_rst => mm_rst, - mm_clk => mm_clk, - start => mm_start, - - -- Memory Mapped Slave in mm_clk domain - sla_temp_in => reg_temp_mosi, - sla_temp_out => reg_temp_miso, - sla_voltage_in => reg_voltage_mosi, - sla_voltage_out => reg_voltage_miso, - - -- MM registers - --sens_err => sens_err, -- using same protocol list for both node2 and all nodes implies that sens_err is only valid for node2. - --sens_data => sens_data, + mm_clk => mm_clk, + mm_rst => mm_rst, - -- Max temp threshold - temp_high => temp_high - ); - --- u_unb2b_board_sens : ENTITY work.unb2b_board_sens --- GENERIC MAP ( --- g_sim => g_sim, --- g_clk_freq => g_clk_freq, --- g_temp_high => g_temp_high, --- g_sens_nof_result => c_sens_nof_result --- ) --- PORT MAP ( --- clk => mm_clk, --- rst => mm_rst, --- start => mm_start, --- -- i2c bus --- scl => scl, --- sda => sda, --- -- read results --- sens_evt => OPEN, --- sens_err => sens_err, --- sens_data => sens_data --- ); + start_sense => mm_start, + temp_alarm => temp_alarm, - -- Temperature: 7 bits (1 bit per degree) plus sign. A faulty readout (never pulled down = all ones) - -- would produce -1 degrees so does not trigger a temperature alarm. - -- temp_high is 7 bits, preceded by a '0' to allow only positive temps to be set. - temp_alarm <= '0';--<= '1' WHEN (SIGNED(sens_data(0)) > SIGNED('0' & temp_high)) ELSE '0'; + reg_temp_mosi => reg_temp_mosi, + reg_temp_miso => reg_temp_miso, + + reg_voltage_store_mosi => reg_voltage_mosi, + reg_voltage_store_miso => reg_voltage_miso + ); END str; diff --git a/boards/uniboard2b/libraries/unb2b_board/src/vhdl/unb2b_fpga_sens_reg.vhd b/boards/uniboard2b/libraries/unb2b_board/src/vhdl/unb2b_fpga_sens_reg.vhd deleted file mode 100644 index 11dc73c393f704ef8c43addd8961186eaf41d425..0000000000000000000000000000000000000000 --- a/boards/uniboard2b/libraries/unb2b_board/src/vhdl/unb2b_fpga_sens_reg.vhd +++ /dev/null @@ -1,89 +0,0 @@ -------------------------------------------------------------------------------- --- --- Copyright (C) 2012-2014 --- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/> --- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands --- --- 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, see <http://www.gnu.org/licenses/>. --- -------------------------------------------------------------------------------- - --- Purpose: Provide MM slave register for unb2b_fpga_sens --- - -LIBRARY IEEE, common_lib, technology_lib, fpga_sense_lib; -USE IEEE.STD_LOGIC_1164.ALL; -USE IEEE.NUMERIC_STD.ALL; -USE common_lib.common_pkg.ALL; -USE common_lib.common_mem_pkg.ALL; -USE technology_lib.technology_pkg.ALL; - - -ENTITY unb2b_fpga_sens_reg IS - GENERIC ( - g_sim : BOOLEAN; - g_technology : NATURAL := c_tech_arria10; - g_sens_nof_result : NATURAL := 1; - g_temp_high : NATURAL := 85 - ); - PORT ( - -- Clocks and reset - mm_rst : IN STD_LOGIC; -- reset synchronous with mm_clk - mm_clk : IN STD_LOGIC; -- memory-mapped bus clock - start : IN STD_LOGIC; - - -- Memory Mapped Slave in mm_clk domain - sla_temp_in : IN t_mem_mosi; -- actual ranges defined by c_mm_reg - sla_temp_out : OUT t_mem_miso; -- actual ranges defined by c_mm_reg - - sla_voltage_in : IN t_mem_mosi; -- actual ranges defined by c_mm_reg - sla_voltage_out : OUT t_mem_miso; -- actual ranges defined by c_mm_reg - - -- MM registers - --sens_err : IN STD_LOGIC := '0'; - --sens_data : IN t_slv_8_arr(0 TO g_sens_nof_result-1); -- FIXME should be OUT - - -- Max temp output - temp_high : OUT STD_LOGIC_VECTOR(6 DOWNTO 0) - ); -END unb2b_fpga_sens_reg; - - -ARCHITECTURE str OF unb2b_fpga_sens_reg IS - - --SIGNAL i_temp_high : STD_LOGIC_VECTOR(6 DOWNTO 0); - -BEGIN - - temp_high <= (others => '0'); --i_temp_high; - - u_fpga_sense: ENTITY fpga_sense_lib.fpga_sense - GENERIC MAP ( - g_technology => g_technology, - g_sim => g_sim - ) - PORT MAP ( - mm_clk => mm_clk, - mm_rst => mm_rst, - - start_sense => start, - - reg_temp_mosi => sla_temp_in, - reg_temp_miso => sla_temp_out, - - reg_voltage_store_mosi => sla_voltage_in, - reg_voltage_store_miso => sla_voltage_out - ); - -END str; diff --git a/boards/uniboard2c/libraries/unb2c_board/hdllib.cfg b/boards/uniboard2c/libraries/unb2c_board/hdllib.cfg index 93583a2b56bf78bd132632a723dcbddd675cc9ac..2c8c0275e1c60cd36b8fe99c65faeb1023bafd95 100644 --- a/boards/uniboard2c/libraries/unb2c_board/hdllib.cfg +++ b/boards/uniboard2c/libraries/unb2c_board/hdllib.cfg @@ -20,7 +20,6 @@ synth_files = src/vhdl/unb2c_board_clk125_pll.vhd src/vhdl/unb2c_board_wdi_extend.vhd src/vhdl/unb2c_board_node_ctrl.vhd - src/vhdl/unb2c_fpga_sens_reg.vhd src/vhdl/mms_unb2c_fpga_sens.vhd src/vhdl/unb2c_board_wdi_reg.vhd src/vhdl/unb2c_board_qsfp_leds.vhd diff --git a/boards/uniboard2c/libraries/unb2c_board/src/vhdl/mms_unb2c_fpga_sens.vhd b/boards/uniboard2c/libraries/unb2c_board/src/vhdl/mms_unb2c_fpga_sens.vhd index 4308051f7f46c47865ba634b23626dfc79955b45..d126fa5669ae9ee868f43c8490cf7106d9b23573 100644 --- a/boards/uniboard2c/libraries/unb2c_board/src/vhdl/mms_unb2c_fpga_sens.vhd +++ b/boards/uniboard2c/libraries/unb2c_board/src/vhdl/mms_unb2c_fpga_sens.vhd @@ -22,7 +22,7 @@ -- Purpose : MMS for unb2c_fpga_sens -- Description: See unb2c_fpga_sens.vhd -LIBRARY IEEE, technology_lib, common_lib; +LIBRARY IEEE, technology_lib, common_lib, fpga_sense_lib; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.NUMERIC_STD.ALL; USE common_lib.common_pkg.ALL; @@ -43,10 +43,10 @@ ENTITY mms_unb2c_fpga_sens IS mm_start : IN STD_LOGIC; -- Memory-mapped clock domain - reg_temp_mosi : IN t_mem_mosi := c_mem_mosi_rst; -- actual ranges defined by c_mm_reg - reg_temp_miso : OUT t_mem_miso; -- actual ranges defined by c_mm_reg - reg_voltage_mosi : IN t_mem_mosi := c_mem_mosi_rst; -- actual ranges defined by c_mm_reg - reg_voltage_miso : OUT t_mem_miso; -- actual ranges defined by c_mm_reg + reg_temp_mosi : IN t_mem_mosi := c_mem_mosi_rst; -- actual ranges defined by c_mm_reg + reg_temp_miso : OUT t_mem_miso; -- actual ranges defined by c_mm_reg + reg_voltage_mosi : IN t_mem_mosi := c_mem_mosi_rst; -- actual ranges defined by c_mm_reg + reg_voltage_miso : OUT t_mem_miso; -- actual ranges defined by c_mm_reg -- Temperature alarm output temp_alarm : OUT STD_LOGIC @@ -56,67 +56,27 @@ END mms_unb2c_fpga_sens; ARCHITECTURE str OF mms_unb2c_fpga_sens IS - CONSTANT c_sens_nof_result : NATURAL := 1; -- - CONSTANT c_temp_high_w : NATURAL := 7; -- Allow user to use only 7 (no sign, only positive) of 8 bits to set set max temp - - SIGNAL sens_err : STD_LOGIC; - SIGNAL sens_data : t_slv_8_arr(0 TO c_sens_nof_result-1); - - SIGNAL temp_high : STD_LOGIC_VECTOR(c_temp_high_w-1 DOWNTO 0); - BEGIN - - u_unb2c_fpga_sens_reg : ENTITY work.unb2c_fpga_sens_reg + + u_fpga_sense: ENTITY fpga_sense_lib.fpga_sense GENERIC MAP ( - g_sim => g_sim, - g_technology => g_technology, - g_sens_nof_result => c_sens_nof_result, - g_temp_high => g_temp_high + g_technology => g_technology, + g_sim => g_sim, + g_temp_high => g_temp_high ) PORT MAP ( - -- Clocks and reset - mm_rst => mm_rst, - mm_clk => mm_clk, - start => mm_start, - - -- Memory Mapped Slave in mm_clk domain - sla_temp_in => reg_temp_mosi, - sla_temp_out => reg_temp_miso, - sla_voltage_in => reg_voltage_mosi, - sla_voltage_out => reg_voltage_miso, - - -- MM registers - --sens_err => sens_err, -- using same protocol list for both node2 and all nodes implies that sens_err is only valid for node2. - --sens_data => sens_data, + mm_clk => mm_clk, + mm_rst => mm_rst, - -- Max temp threshold - temp_high => temp_high - ); - --- u_unb2c_board_sens : ENTITY work.unb2c_board_sens --- GENERIC MAP ( --- g_sim => g_sim, --- g_clk_freq => g_clk_freq, --- g_temp_high => g_temp_high, --- g_sens_nof_result => c_sens_nof_result --- ) --- PORT MAP ( --- clk => mm_clk, --- rst => mm_rst, --- start => mm_start, --- -- i2c bus --- scl => scl, --- sda => sda, --- -- read results --- sens_evt => OPEN, --- sens_err => sens_err, --- sens_data => sens_data --- ); + start_sense => mm_start, + temp_alarm => temp_alarm, - -- Temperature: 7 bits (1 bit per degree) plus sign. A faulty readout (never pulled down = all ones) - -- would produce -1 degrees so does not trigger a temperature alarm. - -- temp_high is 7 bits, preceded by a '0' to allow only positive temps to be set. - temp_alarm <= '0';--<= '1' WHEN (SIGNED(sens_data(0)) > SIGNED('0' & temp_high)) ELSE '0'; - + reg_temp_mosi => reg_temp_mosi, + reg_temp_miso => reg_temp_miso, + + reg_voltage_store_mosi => reg_voltage_mosi, + reg_voltage_store_miso => reg_voltage_miso + ); + END str; diff --git a/boards/uniboard2c/libraries/unb2c_board/src/vhdl/unb2c_fpga_sens_reg.vhd b/boards/uniboard2c/libraries/unb2c_board/src/vhdl/unb2c_fpga_sens_reg.vhd deleted file mode 100644 index aa9686461aa060149f3ebfbc546077a52e124036..0000000000000000000000000000000000000000 --- a/boards/uniboard2c/libraries/unb2c_board/src/vhdl/unb2c_fpga_sens_reg.vhd +++ /dev/null @@ -1,89 +0,0 @@ -------------------------------------------------------------------------------- --- --- Copyright (C) 2012-2014 --- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/> --- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands --- --- 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, see <http://www.gnu.org/licenses/>. --- -------------------------------------------------------------------------------- - --- Purpose: Provide MM slave register for unb2c_fpga_sens --- - -LIBRARY IEEE, common_lib, technology_lib, fpga_sense_lib; -USE IEEE.STD_LOGIC_1164.ALL; -USE IEEE.NUMERIC_STD.ALL; -USE common_lib.common_pkg.ALL; -USE common_lib.common_mem_pkg.ALL; -USE technology_lib.technology_pkg.ALL; - - -ENTITY unb2c_fpga_sens_reg IS - GENERIC ( - g_sim : BOOLEAN; - g_technology : NATURAL := c_tech_arria10; - g_sens_nof_result : NATURAL := 1; - g_temp_high : NATURAL := 85 - ); - PORT ( - -- Clocks and reset - mm_rst : IN STD_LOGIC; -- reset synchronous with mm_clk - mm_clk : IN STD_LOGIC; -- memory-mapped bus clock - start : IN STD_LOGIC; - - -- Memory Mapped Slave in mm_clk domain - sla_temp_in : IN t_mem_mosi; -- actual ranges defined by c_mm_reg - sla_temp_out : OUT t_mem_miso; -- actual ranges defined by c_mm_reg - - sla_voltage_in : IN t_mem_mosi; -- actual ranges defined by c_mm_reg - sla_voltage_out : OUT t_mem_miso; -- actual ranges defined by c_mm_reg - - -- MM registers - --sens_err : IN STD_LOGIC := '0'; - --sens_data : IN t_slv_8_arr(0 TO g_sens_nof_result-1); -- FIXME should be OUT - - -- Max temp output - temp_high : OUT STD_LOGIC_VECTOR(6 DOWNTO 0) - ); -END unb2c_fpga_sens_reg; - - -ARCHITECTURE str OF unb2c_fpga_sens_reg IS - - --SIGNAL i_temp_high : STD_LOGIC_VECTOR(6 DOWNTO 0); - -BEGIN - - temp_high <= (others => '0'); --i_temp_high; - - u_fpga_sense: ENTITY fpga_sense_lib.fpga_sense - GENERIC MAP ( - g_technology => g_technology, - g_sim => g_sim - ) - PORT MAP ( - mm_clk => mm_clk, - mm_rst => mm_rst, - - start_sense => start, - - reg_temp_mosi => sla_temp_in, - reg_temp_miso => sla_temp_out, - - reg_voltage_store_mosi => sla_voltage_in, - reg_voltage_store_miso => sla_voltage_out - ); - -END str; diff --git a/libraries/io/fpga_sense/src/vhdl/fpga_sense.vhd b/libraries/io/fpga_sense/src/vhdl/fpga_sense.vhd index a03a8b77815e3eaf75827c842d94e0193119c9db..e12b6fc551f12a4076c06474d4261e27995deccd 100644 --- a/libraries/io/fpga_sense/src/vhdl/fpga_sense.vhd +++ b/libraries/io/fpga_sense/src/vhdl/fpga_sense.vhd @@ -21,7 +21,10 @@ -- Purpose: -- Description: --- +-- For temperature calculation see: +-- https://www.intel.com/content/dam/www/programmable/us/en/pdfs/literature/ug/ug_alttemp_sense.pdf +-- Which states Temperature = ( (A * C) / 1024 ) - B +-- Where A = 693, B = 265, C = decimal value of tempout[9..0] (unsigned) LIBRARY IEEE, common_lib, technology_lib, tech_fpga_temp_sens_lib, tech_fpga_voltage_sens_lib; @@ -37,7 +40,8 @@ USE technology_lib.technology_pkg.ALL; ENTITY fpga_sense IS GENERIC ( g_technology : NATURAL := c_tech_select_default; - g_sim : BOOLEAN + g_sim : BOOLEAN; + g_temp_high : NATURAL := 85 ); PORT ( -- MM interface @@ -45,6 +49,7 @@ ENTITY fpga_sense IS mm_clk : IN STD_LOGIC; start_sense : IN STD_LOGIC; + temp_alarm : OUT STD_LOGIC; reg_temp_mosi : IN t_mem_mosi := c_mem_mosi_rst; reg_temp_miso : OUT t_mem_miso; @@ -63,6 +68,9 @@ ARCHITECTURE str OF fpga_sense IS CONSTANT c_mem_reg_temp_nof_data : NATURAL := 1; CONSTANT c_mem_reg_temp_data : t_c_mem := (c_mem_reg_rd_latency, c_mem_reg_temp_adr_w , c_mem_reg_temp_dat_w , c_mem_reg_temp_nof_data, 'X'); + -- temp = (693 * adc)/1024 - 265 => adc = (temp + 265)*1024/693 + CONSTANT c_temp_high_raw : STD_LOGIC_VECTOR(9 downto 0) := TO_UVEC(((g_temp_high + 265) * 1024) / 693, 10); + -- constants for the voltage sensor CONSTANT c_mem_reg_voltage_adr_w : NATURAL := 1; CONSTANT c_mem_reg_voltage_dat_w : NATURAL := 32; @@ -84,7 +92,7 @@ ARCHITECTURE str OF fpga_sense IS BEGIN -- temperature sensor - + temp_alarm <= '1' WHEN (UNSIGNED(temp_data) > UNSIGNED(c_temp_high_raw)) ELSE '0'; gen_tech_fpga_temp_sens: IF g_sim=FALSE GENERATE u_tech_fpga_temp_sens : ENTITY tech_fpga_temp_sens_lib.tech_fpga_temp_sens GENERIC MAP ( @@ -97,6 +105,8 @@ BEGIN tempout => temp_data --: OUT STD_LOGIC_VECTOR(9 DOWNTO 0) ); +-- The eoc signal goes high for one clock cycle of the 1-MHz internal oscillator clock, +-- indicating end of conversion. You can latch the data on tempout at the falling edge of eoc. PROCESS(eoc, mm_rst) BEGIN IF mm_rst = '1' THEN @@ -109,8 +119,8 @@ BEGIN END GENERATE; no_tech_fpga_temp_sens: IF g_sim=TRUE GENERATE - -- temp = (708 * adc)/1024 - 273 => adc = (temp + 273)*1024/708 - temp_data <= TO_UVEC(460, temp_data'LENGTH); -- choose temp = 45 degrees so adc temp_data = 460 + -- temp = (693 * adc)/1024 - 265 => adc = (temp + 265)*1024/693 + temp_data <= TO_UVEC(458, temp_data'LENGTH); -- choose temp = 45 degrees so adc temp_data = 458 mm_reg_temp_data <= RESIZE_UVEC(temp_data,c_mem_reg_temp_dat_w); END GENERATE; @@ -173,13 +183,16 @@ BEGIN BEGIN IF mm_rst = '1' THEN controller_csr_write <= '0'; + start_sense_mm <= '0'; + start_sense_mm_d1 <= '0'; + start_sense_mm_d2 <= '0'; ELSIF rising_edge(mm_clk) THEN start_sense_mm <= start_sense; start_sense_mm_d1 <= start_sense_mm; start_sense_mm_d2 <= start_sense_mm_d1; if start_sense_mm_d1 = '1' and start_sense_mm_d2 = '0' then controller_csr_write <= '1'; - else + else controller_csr_write <= '0'; end if; END IF; diff --git a/libraries/technology/ip_arria10_e1sg/jesd204b/ip_arria10_e1sg_jesd204b.vhd b/libraries/technology/ip_arria10_e1sg/jesd204b/ip_arria10_e1sg_jesd204b.vhd index 9ede2c9dceda45d1e95f99e258ace804c1d37a2a..a887efbab77e3513f1719c8ad8fde3707ddeaa9a 100644 --- a/libraries/technology/ip_arria10_e1sg/jesd204b/ip_arria10_e1sg_jesd204b.vhd +++ b/libraries/technology/ip_arria10_e1sg/jesd204b/ip_arria10_e1sg_jesd204b.vhd @@ -101,21 +101,22 @@ ARCHITECTURE str OF ip_arria10_e1sg_jesd204b IS SIGNAL dev_lane_aligned_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); SIGNAL rx_csr_lane_powerdown_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); SIGNAL xcvr_rst_ctrl_rx_ready_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); - SIGNAL rx_xcvr_ready_in_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); - SIGNAL pll_reset_async_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); + SIGNAL rx_xcvr_ready_in_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); + SIGNAL mm_rx_xcvr_ready_in_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); + SIGNAL pll_reset_async_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); SIGNAL pll_reset_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); SIGNAL xcvr_rst_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0) := (OTHERS => '1'); - SIGNAL rx_avs_rst_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); - SIGNAL rxlink_rst_async_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); - SIGNAL rxlink_rst_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); - SIGNAL rxframe_rst_async_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); + SIGNAL rx_avs_rst_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); + SIGNAL rxlink_rst_async_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); + SIGNAL rxlink_rst_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); + SIGNAL rxframe_rst_async_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); SIGNAL rxframe_rst_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); SIGNAL rx_avs_rst_n_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); SIGNAL rxlink_rst_n_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); SIGNAL rxframe_rst_n_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); SIGNAL f2_div1_cnt_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); SIGNAL core_pll_locked : STD_LOGIC; - SIGNAL core_pll_locked_reg : STD_LOGIC; + SIGNAL mm_core_pll_locked_reg : STD_LOGIC; SIGNAL jesd204b_sysref_1 : STD_LOGIC; SIGNAL jesd204b_sysref_2 : STD_LOGIC; SIGNAL jesd204b_sysref_frameclk_1 : STD_LOGIC; @@ -128,7 +129,7 @@ ARCHITECTURE str OF ip_arria10_e1sg_jesd204b IS SIGNAL jesd204b_sync_n_internal_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); -- output to control ADC initialization/syncronization phase SIGNAL jesd204b_sync_n_enabled_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); -- output to control ADC initialization/syncronization phase - SIGNAL jesd204b_sync_n_combined_arr : STD_LOGIC_VECTOR(g_nof_sync_n-1 DOWNTO 0); -- output to control ADC initialization/syncronization phase + SIGNAL jesd204b_sync_n_combined_arr : STD_LOGIC_VECTOR(g_nof_sync_n-1 DOWNTO 0); -- output to control ADC initialization/syncronization phase -- Component declarations for the IP blocks @@ -325,16 +326,17 @@ BEGIN irq => open, clk => mm_clk, -- use clk = mm_clk for av_* port csr_reset => mm_rst, - reset1_dsrt_qual => core_pll_locked_reg, -- core pll_locked synchronised to clk = mm_clk domain + reset1_dsrt_qual => mm_core_pll_locked_reg, -- core pll_locked synchronised to clk = mm_clk domain reset2_dsrt_qual => '1', -- Tied to '1' in example design. Tx xcvr is not used. - reset5_dsrt_qual => rx_xcvr_ready_in_arr(i), + reset5_dsrt_qual => mm_rx_xcvr_ready_in_arr(i), reset_in0 => mm_rst, + -- reset_out* signals are in mm_clk domain reset_out0 => pll_reset_async_arr(i), -- Use channel 0 to reset the core pll reset_out1 => xcvr_rst_arr(i), -- Use channel 1 to reset the transceiver reset controller reset_out2 => open, reset_out3 => open, reset_out4 => open, - reset_out5 => rx_avs_rst_arr(i), -- in mm_clk domain + reset_out5 => rx_avs_rst_arr(i), reset_out6 => rxlink_rst_async_arr(i), reset_out7 => rxframe_rst_async_arr(i) ); @@ -347,8 +349,6 @@ BEGIN out_rst => pll_reset_arr(i) ); - -- No need to synchronize xcvr_rst as it is synchronized in ip_arria10_e1sg_jesd204b_rx_xcvr_reset_control_12 - -- synchronize rxlink reset u_common_areset_rxlink : ENTITY common_lib.common_areset PORT MAP ( @@ -367,12 +367,22 @@ BEGIN rx_xcvr_ready_in_arr(i) <= '1' when rx_csr_lane_powerdown_arr(i)='1' OR xcvr_rst_ctrl_rx_ready_arr(i)='1' else '0'; + -- synchronize rx_xcvr_ready_in_arr to mm_clk + u_common_areset_rx_xcvr_ready : ENTITY common_lib.common_areset + GENERIC MAP ( + g_in_rst_level => '0', -- rst is asserted immediately in_rst = '0' + g_rst_level => '0' -- When in_rst is asserted, out_rst = '0' + ) + PORT MAP ( + in_rst => rx_xcvr_ready_in_arr(i), + clk => mm_clk, + out_rst => mm_rx_xcvr_ready_in_arr(i) + ); -- Invert thr active-low resets rx_avs_rst_n_arr(i) <= not rx_avs_rst_arr(i); rxlink_rst_n_arr(i) <= not rxlink_rst_arr(i); rxframe_rst_n_arr(i) <= not rxframe_rst_arr(i); - ----------------------------------------------------------------------------- @@ -470,7 +480,7 @@ BEGIN PORT MAP ( in_rst => core_pll_locked, clk => mm_clk, - out_rst => core_pll_locked_reg + out_rst => mm_core_pll_locked_reg ); @@ -479,7 +489,7 @@ BEGIN u_ip_arria10_e1sg_jesd204b_rx_xcvr_reset_control : ip_arria10_e1sg_jesd204b_rx_xcvr_reset_control_12 PORT MAP ( - clock => rxlink_clk, + clock => rxlink_clk, reset => xcvr_rst_arr(0), -- From Reset Sequencer output1 as per example design, the reset input is synchronised internally. rx_analogreset => rx_analogreset_arr, -- output to reset RX PMA. Release before deasserting link and avs resets (Intel JESD204B-UG p70) rx_cal_busy => rx_cal_busy_arr, -- input from PHY @@ -522,8 +532,6 @@ BEGIN mosi_arr => jesd204b_mosi_arr, miso_arr => jesd204b_miso_arr ); - - END str; diff --git a/libraries/technology/ip_arria10_e2sg/jesd204b/ip_arria10_e2sg_jesd204b.vhd b/libraries/technology/ip_arria10_e2sg/jesd204b/ip_arria10_e2sg_jesd204b.vhd index a08c3e105ce6fd8604ea80f9f1af358456f90c19..71124917e549c7ae5ead18a08bf725ae44ef3a1a 100644 --- a/libraries/technology/ip_arria10_e2sg/jesd204b/ip_arria10_e2sg_jesd204b.vhd +++ b/libraries/technology/ip_arria10_e2sg/jesd204b/ip_arria10_e2sg_jesd204b.vhd @@ -101,21 +101,22 @@ ARCHITECTURE str OF ip_arria10_e2sg_jesd204b IS SIGNAL dev_lane_aligned_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); SIGNAL rx_csr_lane_powerdown_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); SIGNAL xcvr_rst_ctrl_rx_ready_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); - SIGNAL rx_xcvr_ready_in_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); - SIGNAL pll_reset_async_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); + SIGNAL rx_xcvr_ready_in_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); + SIGNAL mm_rx_xcvr_ready_in_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); + SIGNAL pll_reset_async_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); SIGNAL pll_reset_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); SIGNAL xcvr_rst_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0) := (OTHERS => '1'); - SIGNAL rx_avs_rst_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); - SIGNAL rxlink_rst_async_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); - SIGNAL rxlink_rst_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); - SIGNAL rxframe_rst_async_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); + SIGNAL rx_avs_rst_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); + SIGNAL rxlink_rst_async_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); + SIGNAL rxlink_rst_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); + SIGNAL rxframe_rst_async_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); SIGNAL rxframe_rst_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); SIGNAL rx_avs_rst_n_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); SIGNAL rxlink_rst_n_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); SIGNAL rxframe_rst_n_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); SIGNAL f2_div1_cnt_arr : STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); SIGNAL core_pll_locked : STD_LOGIC; - SIGNAL core_pll_locked_reg : STD_LOGIC; + SIGNAL mm_core_pll_locked_reg : STD_LOGIC; SIGNAL jesd204b_sysref_1 : STD_LOGIC; SIGNAL jesd204b_sysref_2 : STD_LOGIC; SIGNAL jesd204b_sysref_frameclk_1 : STD_LOGIC; @@ -325,16 +326,17 @@ BEGIN irq => open, clk => mm_clk, -- use clk = mm_clk for av_* port csr_reset => mm_rst, - reset1_dsrt_qual => core_pll_locked_reg, -- core pll_locked synchronised to clk = mm_clk domain + reset1_dsrt_qual => mm_core_pll_locked_reg, -- core pll_locked synchronised to clk = mm_clk domain reset2_dsrt_qual => '1', -- Tied to '1' in example design. Tx xcvr is not used. - reset5_dsrt_qual => rx_xcvr_ready_in_arr(i), + reset5_dsrt_qual => mm_rx_xcvr_ready_in_arr(i), reset_in0 => mm_rst, + -- reset_out* signals are in mm_clk domain reset_out0 => pll_reset_async_arr(i), -- Use channel 0 to reset the core pll reset_out1 => xcvr_rst_arr(i), -- Use channel 1 to reset the transceiver reset controller reset_out2 => open, reset_out3 => open, reset_out4 => open, - reset_out5 => rx_avs_rst_arr(i), -- in mm_clk domain + reset_out5 => rx_avs_rst_arr(i), reset_out6 => rxlink_rst_async_arr(i), reset_out7 => rxframe_rst_async_arr(i) ); @@ -347,8 +349,6 @@ BEGIN out_rst => pll_reset_arr(i) ); - -- No need to synchronize xcvr_rst as it is synchronized in ip_arria10_e1sg_jesd204b_rx_xcvr_reset_control_12 - -- synchronize rxlink reset u_common_areset_rxlink : ENTITY common_lib.common_areset PORT MAP ( @@ -365,14 +365,23 @@ BEGIN out_rst => rxframe_rst_arr(i) ); - rx_xcvr_ready_in_arr(i) <= '1' when rx_csr_lane_powerdown_arr(i)='1' OR xcvr_rst_ctrl_rx_ready_arr(i)='1' else '0'; + -- synchronize rx_xcvr_ready_in_arr to mm_clk + u_common_areset_rx_xcvr_ready : ENTITY common_lib.common_areset + GENERIC MAP ( + g_in_rst_level => '0', -- rst is asserted immediately in_rst = '0' + g_rst_level => '0' -- When in_rst is asserted, out_rst = '0' + ) + PORT MAP ( + in_rst => rx_xcvr_ready_in_arr(i), + clk => mm_clk, + out_rst => mm_rx_xcvr_ready_in_arr(i) + ); -- Invert thr active-low resets rx_avs_rst_n_arr(i) <= not rx_avs_rst_arr(i); rxlink_rst_n_arr(i) <= not rxlink_rst_arr(i); rxframe_rst_n_arr(i) <= not rxframe_rst_arr(i); - ----------------------------------------------------------------------------- @@ -470,9 +479,9 @@ BEGIN PORT MAP ( in_rst => core_pll_locked, clk => mm_clk, - out_rst => core_pll_locked_reg + out_rst => mm_core_pll_locked_reg ); - + -- Transceiver reset controller. Use g_nof_streams out of 12 channels. Receive only -- Clock set to 100MHz (use rxlink_clk) @@ -522,8 +531,6 @@ BEGIN mosi_arr => jesd204b_mosi_arr, miso_arr => jesd204b_miso_arr ); - - END str;