diff --git a/libraries/dsp/st/src/vhdl/mms_st_histogram.vhd b/libraries/dsp/st/src/vhdl/mms_st_histogram.vhd new file mode 100644 index 0000000000000000000000000000000000000000..b14f6e5dd331737958350e968d94df9e224ff1ad --- /dev/null +++ b/libraries/dsp/st/src/vhdl/mms_st_histogram.vhd @@ -0,0 +1,103 @@ +------------------------------------------------------------------------------- +-- +-- Copyright 2020 +-- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/> +-- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +-- +-- Author: J.W.E. Oudman +-- Purpose: Create a histogram from the input data and present it to the MM bus +-- Description: +-- +-- +-- +------------------------------------------------------------------------------- + +LIBRARY IEEE, common_lib, mm_lib, technology_lib, dp_lib; +USE IEEE.std_logic_1164.ALL; +USE common_lib.common_pkg.ALL; +USE common_lib.common_mem_pkg.ALL; +USE dp_lib.dp_stream_pkg.ALL; +USE technology_lib.technology_select_pkg.ALL; + +ENTITY mms_st_histogram IS + GENERIC ( + g_in_data_w : NATURAL := 14; -- >= 9 when g_nof_bins is 512; (max. c_dp_stream_data_w =768) + g_nof_bins : NATURAL := 512; -- is a power of 2 and g_nof_bins <= c_data_span; max. 512 + g_nof_data : NATURAL; -- + g_str : STRING := "freq.density" -- to select output to MM bus ("frequency" or "freq.density") + ); + PORT ( + dp_rst : IN STD_LOGIC; + dp_clk : IN STD_LOGIC; + mm_rst : IN STD_LOGIC; + mm_clk : IN STD_LOGIC; + + -- Streaming + snk_in : IN t_dp_sosi; + + -- Memory Mapped + ram_mosi : IN t_mem_mosi; + ram_miso : OUT t_mem_miso + ); +END mms_st_histogram; + +ARCHITECTURE str OF mms_st_histogram IS + + SIGNAL ram_st_histogram_mosi : t_mem_mosi; + SIGNAL ram_st_histogram_miso : t_mem_miso; + +BEGIN + + u_st_histogram : ENTITY work.st_histogram + GENERIC MAP( + g_in_data_w => g_in_data_w, + g_nof_bins => g_nof_bins, + g_nof_data => g_nof_data, + g_str => g_str + ) + PORT MAP ( + dp_rst => dp_rst, + dp_clk => dp_clk, + + snk_in => snk_in, + sla_in_ram_mosi => ram_st_histogram_mosi, + sla_out_ram_miso => ram_st_histogram_miso + ); + + u_st_histogram_reg : ENTITY work.st_histogram_reg +-- GENERIC MAP( +-- g_in_data_w => +-- g_nof_bins => +-- g_nof_data => +-- g_str => +-- ) + PORT MAP ( + dp_rst => dp_rst, + dp_clk => dp_clk, + mm_rst => mm_rst, + mm_clk => mm_clk, + + mas_out_ram_mosi => ram_st_histogram_mosi, + mas_in_ram_miso => ram_st_histogram_miso, + + ram_mosi => ram_mosi, + ram_miso => ram_miso + ); + +END str; diff --git a/libraries/dsp/st/src/vhdl/st_histogram_reg.vhd b/libraries/dsp/st/src/vhdl/st_histogram_reg.vhd new file mode 100644 index 0000000000000000000000000000000000000000..a00ed5ddf17565986969e5cf5dcbdaf45e010915 --- /dev/null +++ b/libraries/dsp/st/src/vhdl/st_histogram_reg.vhd @@ -0,0 +1,161 @@ +------------------------------------------------------------------------------- +-- +-- Copyright 2020 +-- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/> +-- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +-- +-- Author: J.W.E. Oudman +-- Purpose: Provide MM slave register for st_histogram +-- Description: +-- +-- +------------------------------------------------------------------------------- + +LIBRARY IEEE, common_lib, dp_lib;-- mm_lib, technology_lib, +USE IEEE.std_logic_1164.ALL; +USE common_lib.common_pkg.ALL; +USE common_lib.common_mem_pkg.ALL; +USE dp_lib.dp_stream_pkg.ALL; +--USE technology_lib.technology_select_pkg.ALL; + +ENTITY st_histogram_reg IS + GENERIC ( +-- g_in_data_w : NATURAL := 14; -- >= 9 when g_nof_bins is 512; (max. c_dp_stream_data_w =768) +-- g_nof_bins : NATURAL := 512; -- is a power of 2 and g_nof_bins <= c_data_span; max. 512 +-- g_nof_data : NATURAL; -- + g_str : STRING := "freq.density" -- to select output to MM bus ("frequency" or "freq.density") + ); + PORT ( + dp_rst : IN STD_LOGIC; + dp_clk : IN STD_LOGIC; + mm_rst : IN STD_LOGIC; + mm_clk : IN STD_LOGIC; + + -- DP clocked memory bus + mas_out_ram_mosi : OUT t_mem_mosi ;--:= c_mem_mosi_rst; -- Beware, works in dp clock domain ! + mas_in_ram_miso : IN t_mem_miso ;--:= c_mem_miso_rst; -- '' ! +-- ram_st_histogram_mosi : OUT t_mem_mosi; -- Beware, works in dp clock domain ! +-- ram_st_histogram_miso : IN t_mem_miso; -- '' ! + + -- Memory Mapped + ram_mosi : IN t_mem_mosi; + ram_miso : OUT t_mem_miso + ); +END st_histogram_reg; + +ARCHITECTURE str OF st_histogram_reg IS + +-- CONSTANT c_mm_reg : t_c_mem := (latency => 1, +-- adr_w => 1, +-- dat_w => c_word_w, +-- nof_dat => 1, +-- init_sl => g_default_value); + +-- SIGNAL mm_xonoff_reg : STD_LOGIC_VECTOR(0 DOWNTO 0); + SIGNAL rd_en : STD_LOGIC_VECTOR(0 DOWNTO 0); + SIGNAL rd_val : STD_LOGIC_VECTOR(0 DOWNTO 0); + +BEGIN + +-- u_common_spulse_mosi_rd : ENTITY common_lib.common_spulse +-- PORT MAP ( +-- in_rst => mm_rst, +-- in_clk => mm_clk, +---- in_clken => +-- in_pulse => ram_mosi.rd, +-- in_busy => OPEN, +-- out_rst => dp_rst, +-- out_clk => dp_clk, +---- out_clken => +-- out_pulse => mas_out_ram_mosi.rd +-- ); + +-- u_common_reg_cross_domain_mosi_rd : ENTITY common_lib.common_reg_cross_domain +-- PORT MAP ( +-- in_rst => mm_rst, +-- in_clk => mm_clk, +-- +-- in_dat => slv(ram_mosi.rd), +-- +-- out_rst => dp_rst, +-- out_clk => dp_clk, +-- +-- out_dat => rd_en +-- ); +-- +-- mas_out_ram_mosi.rd <= rd_en(0); + + u_common_reg_cross_domain_mosi_address : ENTITY common_lib.common_reg_cross_domain + PORT MAP ( + in_rst => mm_rst, + in_clk => mm_clk, + + in_new => ram_mosi.rd, + in_dat => ram_mosi.address, + + out_rst => dp_rst, + out_clk => dp_clk, + + out_dat => mas_out_ram_mosi.address, + out_new => mas_out_ram_mosi.rd + ); + +-- u_common_spulse_miso_rdval : ENTITY common_lib.common_spulse +-- PORT MAP ( +-- in_rst => dp_rst, +-- in_clk => dp_clk, +---- in_clken => +-- in_pulse => mas_in_ram_miso.rdval, +-- in_busy => OPEN, +-- out_rst => mm_rst, +-- out_clk => mm_clk, +---- out_clken => +-- out_pulse => ram_miso.rdval +-- ); + +-- u_reg_cross_domain_miso_rdval : ENTITY common_lib.common_reg_cross_domain +-- PORT MAP ( +-- in_rst => dp_rst, +-- in_clk => dp_clk, +-- +-- in_dat => slv(mas_in_ram_miso.rdval), +-- +-- out_rst => mm_rst, +-- out_clk => mm_clk, +-- +-- out_dat => rd_val +-- ); + +-- ram_miso.rdval <= rd_val(0); + + u_reg_cross_domain_miso_rddata : ENTITY common_lib.common_reg_cross_domain + PORT MAP ( + in_rst => dp_rst, + in_clk => dp_clk, + + in_new => mas_in_ram_miso.rdval, + in_dat => mas_in_ram_miso.rddata, + + out_rst => mm_rst, + out_clk => mm_clk, + + out_dat => ram_miso.rddata, + out_new => ram_miso.rdval + ); +END str; diff --git a/libraries/dsp/st/tb/vhdl/tb_mms_st_histogram.vhd b/libraries/dsp/st/tb/vhdl/tb_mms_st_histogram.vhd new file mode 100644 index 0000000000000000000000000000000000000000..8c74592e65fa4a7776fe01c12e73c17808437444 --- /dev/null +++ b/libraries/dsp/st/tb/vhdl/tb_mms_st_histogram.vhd @@ -0,0 +1,302 @@ +------------------------------------------------------------------------------- +-- +-- Copyright 2020 +-- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/> +-- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); +-- you may not use this file except in compliance with the License. +-- You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, +-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +-- +-- Author: J.W.E. Oudman +-- Purpose: Create a histogram from the input data and present it to the MM bus +-- Description: +-- +-- +-- +------------------------------------------------------------------------------- + +LIBRARY IEEE, common_lib, mm_lib, dp_lib; +USE IEEE.std_logic_1164.ALL; +USE common_lib.common_pkg.ALL; +USE common_lib.tb_common_pkg.ALL; +USE common_lib.common_mem_pkg.ALL; +USE common_lib.tb_common_mem_pkg.ALL; +USE dp_lib.dp_stream_pkg.ALL; + +ENTITY tb_mms_st_histogram IS + GENERIC( + g_sync_length : NATURAL := 338; + g_nof_sync : NATURAL := 3; + g_data_w : NATURAL := 4; + g_nof_bins : NATURAL := 8; + g_nof_data : NATURAL := 338; + g_str : STRING := "freq.density"; + g_valid_gap : BOOLEAN := FALSE; + g_snk_in_data_sim_type : STRING := "counter" -- "counter" or "toggle" + ); +END tb_mms_st_histogram; + + +ARCHITECTURE tb OF tb_mms_st_histogram IS + + CONSTANT c_adr_w : NATURAL := ceil_log2(g_nof_bins); + + CONSTANT c_mm_init_time : NATURAL := 5; + CONSTANT c_dp_inti_time : NATURAL := 5; + + SIGNAL tb_end : STD_LOGIC := '0'; + SIGNAL first_sync : STD_LOGIC := '0'; + + ---------------------------------------------------------------------------- + -- Clocks and resets + ---------------------------------------------------------------------------- + CONSTANT c_mm_clk_period : TIME := 20 ns; + CONSTANT c_dp_clk_period : TIME := 5 ns; + + + SIGNAL mm_rst : STD_LOGIC := '1'; + SIGNAL mm_clk : STD_LOGIC := '1'; + + SIGNAL dp_rst : STD_LOGIC; + SIGNAL dp_clk : STD_LOGIC := '1'; + + + + + ---------------------------------------------------------------------------- + -- Streaming Input + ---------------------------------------------------------------------------- + + SIGNAL st_histogram_snk_in : t_dp_sosi; + + ---------------------------------------------------------------------------- + -- Memory Mapped Input + ---------------------------------------------------------------------------- + + SIGNAL st_histogram_ram_mosi : t_mem_mosi; + SIGNAL st_histogram_ram_miso : t_mem_miso; + + +BEGIN + + ---------------------------------------------------------------------------- + -- Clock and reset generation + ---------------------------------------------------------------------------- + mm_clk <= NOT mm_clk OR tb_end AFTER c_mm_clk_period/2; + mm_rst <= '1', '0' AFTER c_mm_clk_period*c_mm_init_time; + + dp_clk <= NOT dp_clk OR tb_end AFTER c_dp_clk_period/2; + dp_rst <= '1', '0' AFTER c_dp_clk_period*c_dp_inti_time; + + + + + ---------------------------------------------------------------------------- + -- Source: counter stimuli + ---------------------------------------------------------------------------- + + p_data : PROCESS(dp_rst, dp_clk, st_histogram_snk_in) + BEGIN + IF g_snk_in_data_sim_type = "counter" THEN + IF dp_rst='1' THEN + st_histogram_snk_in.data(g_data_w-1 DOWNTO 0) <= (OTHERS=>'0'); + ELSIF rising_edge(dp_clk) AND st_histogram_snk_in.valid='1' THEN + st_histogram_snk_in.data(g_data_w-1 DOWNTO 0) <= INCR_UVEC(st_histogram_snk_in.data(g_data_w-1 DOWNTO 0), 1); + END IF; + ELSIF g_snk_in_data_sim_type = "toggle" THEN + IF dp_rst='1' THEN + st_histogram_snk_in.data(g_data_w-1 DOWNTO 0) <= (OTHERS=>'0'); + ELSIF rising_edge(dp_clk) AND st_histogram_snk_in.valid='1' THEN + IF st_histogram_snk_in.data(g_data_w-1 DOWNTO 0) = TO_UVEC(0, g_data_w) THEN + st_histogram_snk_in.data(g_data_w-1 DOWNTO 0) <= TO_UVEC(1, g_data_w); + ELSE + st_histogram_snk_in.data(g_data_w-1 DOWNTO 0) <= TO_UVEC(0, g_data_w); + END IF; + END IF; + END IF; + END PROCESS; + + p_stimuli : PROCESS + BEGIN + IF g_valid_gap = FALSE THEN +-- dp_rst <= '1'; + st_histogram_snk_in.sync <= '0'; + st_histogram_snk_in.valid <= '0'; + WAIT UNTIL rising_edge(dp_clk); +-- FOR I IN 0 TO 9 LOOP WAIT UNTIL rising_edge(dp_clk); END LOOP; +-- dp_rst <= '0'; + FOR I IN 0 TO 9 LOOP WAIT UNTIL rising_edge(dp_clk); END LOOP; + st_histogram_snk_in.valid <= '1'; + + + FOR I IN 0 TO g_nof_sync-1 LOOP + st_histogram_snk_in.sync <= '1'; + WAIT UNTIL rising_edge(dp_clk); + st_histogram_snk_in.sync <= '0'; + FOR I IN 0 TO g_sync_length-1 LOOP WAIT UNTIL rising_edge(dp_clk); END LOOP; + + END LOOP; + FOR I IN 0 TO 9 LOOP WAIT UNTIL rising_edge(dp_clk); END LOOP; + tb_end <= '1'; + WAIT; + + ELSIF g_valid_gap = TRUE THEN +-- dp_rst <= '1'; + st_histogram_snk_in.sync <= '0'; + st_histogram_snk_in.valid <= '0'; + WAIT UNTIL rising_edge(dp_clk); +-- FOR I IN 0 TO 9 LOOP WAIT UNTIL rising_edge(dp_clk); END LOOP; +-- dp_rst <= '0'; + FOR I IN 0 TO 9 LOOP WAIT UNTIL rising_edge(dp_clk); END LOOP; + st_histogram_snk_in.valid <= '1'; + + + FOR I IN 0 TO g_nof_sync-2 LOOP + st_histogram_snk_in.sync <= '1'; + WAIT UNTIL rising_edge(dp_clk); + st_histogram_snk_in.sync <= '0'; + FOR I IN 0 TO (g_sync_length/2)-1 LOOP WAIT UNTIL rising_edge(dp_clk); END LOOP; + st_histogram_snk_in.valid <= '0'; + WAIT UNTIL rising_edge(dp_clk); + --WAIT UNTIL rising_edge(dp_clk); + --WAIT UNTIL rising_edge(dp_clk); + st_histogram_snk_in.valid <= '1'; + FOR I IN 0 TO (g_sync_length/4)-1 LOOP WAIT UNTIL rising_edge(dp_clk); END LOOP; + st_histogram_snk_in.valid <= '0'; + WAIT UNTIL rising_edge(dp_clk); + --st_histogram_snk_in.valid <= '0'; + st_histogram_snk_in.sync <= '1'; + WAIT UNTIL rising_edge(dp_clk); + st_histogram_snk_in.valid <= '1'; + st_histogram_snk_in.sync <= '0'; + FOR I IN 0 TO (g_sync_length/4)-1 LOOP WAIT UNTIL rising_edge(dp_clk); END LOOP; + + END LOOP; + FOR I IN 0 TO 9 LOOP WAIT UNTIL rising_edge(dp_clk); END LOOP; + tb_end <= '1'; + WAIT; + END IF; + END PROCESS; + + ---------------------------------------------------------------------------- + -- Source: read MM bus stimuli + ---------------------------------------------------------------------------- + +-- p_mm_stimuli : PROCESS --(st_histogram_snk_in.sync) +-- BEGIN +-- IF mm_rst='1' THEN +-- st_histogram_ram_mosi <= c_mem_mosi_rst; --.address(c_adr_w-1 DOWNTO 0) <= (OTHERS=>'0'); +---- ELSIF rising_edge(mm_clk) THEN --AND st_histogram_snk_in.valid='1' +-- ELSE +-- IF first_sync = '0' THEN +-- WAIT UNTIL st_histogram_snk_in.sync = '1'; +-- first_sync <= '1'; +-- -- wait till one RAM block is written +-- FOR I IN 0 TO (g_sync_length/4) LOOP WAIT UNTIL rising_edge(mm_clk); END LOOP; +-- -- wait for some more cycles +-- FOR I IN 0 TO 9 LOOP WAIT UNTIL rising_edge(mm_clk); END LOOP; +---- ELSIF rising_edge(mm_clk) THEN +-- ELSE +-- FOR I IN 0 TO g_nof_bins-1 +-- -- +-- st_histogram_ram_mosi.rd <= '1'; +-- st_histogram_ram_mosi.address(c_adr_w-1 DOWNTO 0) <= INCR_UVEC(st_histogram_ram_mosi.address(c_adr_w-1 DOWNTO 0), 1); +-- END IF; +-- END IF; +-- END PROCESS; + + p_mm_stimuli : PROCESS --(st_histogram_snk_in.sync) + BEGIN + --IF mm_rst='1' THEN + st_histogram_ram_mosi <= c_mem_mosi_rst; --.address(c_adr_w-1 DOWNTO 0) <= (OTHERS=>'0'); +-- ELSIF rising_edge(mm_clk) THEN --AND st_histogram_snk_in.valid='1' + --ELSE + --IF first_sync = '0' THEN + WAIT UNTIL st_histogram_snk_in.sync = '1'; + --first_sync <= '1'; + -- wait till one RAM block is written + FOR I IN 0 TO (g_sync_length/4) LOOP WAIT UNTIL rising_edge(mm_clk); END LOOP; + -- wait for some more cycles + FOR I IN 0 TO 2 LOOP WAIT UNTIL rising_edge(mm_clk); END LOOP; +-- ELSIF rising_edge(mm_clk) THEN + --ELSE + FOR I IN 0 TO g_nof_bins-1 LOOP + proc_mem_mm_bus_rd(I, mm_clk, st_histogram_ram_mosi); + proc_common_wait_some_cycles(mm_clk, 11); + -- miso.rddata arrives + END LOOP; + -- + --st_histogram_ram_mosi.rd <= '1'; + --st_histogram_ram_mosi.address(c_adr_w-1 DOWNTO 0) <= INCR_UVEC(st_histogram_ram_mosi.address(c_adr_w-1 DOWNTO 0), 1); + --END IF; + --END IF; + END PROCESS; + +-- -- Read data request to the MM bus +-- -- Use proc_mem_mm_bus_rd_latency() to wait for the MM MISO rd_data signal +-- -- to show the data after some read latency +-- PROCEDURE proc_mem_mm_bus_rd(CONSTANT rd_addr : IN NATURAL; +-- SIGNAL mm_clk : IN STD_LOGIC; +-- SIGNAL mm_miso : IN t_mem_miso; +-- SIGNAL mm_mosi : OUT t_mem_mosi) IS +-- BEGIN +-- mm_mosi.address <= TO_MEM_ADDRESS(rd_addr); +-- proc_mm_access(mm_clk, mm_miso.waitrequest, mm_mosi.rd); +-- END proc_mem_mm_bus_rd; + +---- Issues a rd or a wr MM access and wait for it to have finished +-- PROCEDURE proc_mm_access(SIGNAL mm_clk : IN STD_LOGIC; +-- SIGNAL mm_waitreq : IN STD_LOGIC; +-- SIGNAL mm_access : OUT STD_LOGIC) IS +-- BEGIN +-- mm_access <= '1'; +-- WAIT UNTIL rising_edge(mm_clk); +-- WHILE mm_waitreq='1' LOOP +-- WAIT UNTIL rising_edge(mm_clk); +-- END LOOP; +-- mm_access <= '0'; +-- END proc_mm_access; + +-- proc_mem_mm_bus_rd(0, mm_clk, mm_mosi); -- Read nof_early_syncs +-- proc_common_wait_some_cycles(mm_clk, 1); +-- mm_nof_early_syncs <= mm_miso.rddata(c_word_w-1 DOWNTO 0); + + ---------------------------------------------------------------------------- + -- DUT: Device Under Test + ---------------------------------------------------------------------------- + + u_mms_st_histogram : ENTITY work.mms_st_histogram + GENERIC MAP( + g_in_data_w => g_data_w, + g_nof_bins => g_nof_bins, + g_nof_data => g_nof_data, + g_str => g_str + ) + PORT MAP ( + dp_rst => dp_rst, + dp_clk => dp_clk, + mm_rst => mm_rst, + mm_clk => mm_clk, + + -- Streaming + snk_in => st_histogram_snk_in, + + -- Memory Mapped + ram_mosi => st_histogram_ram_mosi, + ram_miso => st_histogram_ram_miso --OPEN + ); + +END tb;