diff --git a/libraries/io/fpga_sense/src/vhdl/fpga_sense.vhd b/libraries/io/fpga_sense/src/vhdl/fpga_sense.vhd index 727e24c05c3086c91471108735e1cc74e2d0913e..793f641808f424c86fc427fc49f2abb4462630a7 100644 --- a/libraries/io/fpga_sense/src/vhdl/fpga_sense.vhd +++ b/libraries/io/fpga_sense/src/vhdl/fpga_sense.vhd @@ -24,7 +24,7 @@ -- -LIBRARY IEEE, common_lib, technology_lib, tech_fpga_temp_sens_lib; +LIBRARY IEEE, common_lib, technology_lib, tech_fpga_temp_sens_lib, tech_fpga_voltage_sens_lib; USE IEEE.std_logic_1164.ALL; USE IEEE.numeric_std.ALL; USE common_lib.common_pkg.ALL; @@ -34,7 +34,7 @@ USE technology_lib.technology_pkg.ALL; --USE tech_temp_sense_lib.tech_temp_sense_component_pkg.ALL; -ENTITY fpga_temp_sens IS +ENTITY fpga_sense IS GENERIC ( g_technology : NATURAL := c_tech_select_default; g_sim : BOOLEAN @@ -46,18 +46,28 @@ ENTITY fpga_temp_sens IS start_sense : IN STD_LOGIC; - reg_mosi : IN t_mem_mosi := c_mem_mosi_rst; - reg_miso : OUT t_mem_miso + reg_temp_mosi : IN t_mem_mosi := c_mem_mosi_rst; + reg_temp_miso : OUT t_mem_miso; + + reg_voltage_store_mosi : IN t_mem_mosi := c_mem_mosi_rst; + reg_voltage_store_miso : OUT t_mem_miso ); -END fpga_temp_sens; +END fpga_sense; + +ARCHITECTURE str OF fpga_sense IS -ARCHITECTURE str OF fpga_temp_sens IS + -- constants for the temperature sensor + CONSTANT c_mem_reg_temp_adr_w : NATURAL := 1; + CONSTANT c_mem_reg_temp_dat_w : NATURAL := 32; + 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'); - CONSTANT c_mem_reg_adr_w : NATURAL := 1; - CONSTANT c_mem_reg_dat_w : NATURAL := 32; - CONSTANT c_mem_reg_nof_data : NATURAL := 1; - CONSTANT c_mem_reg_temp_data : t_c_mem := (c_mem_reg_rd_latency, c_mem_reg_adr_w , c_mem_reg_dat_w , c_mem_reg_nof_data, 'X'); + -- constants for the voltage sensor + CONSTANT c_mem_reg_voltage_adr_w : NATURAL := 1; + CONSTANT c_mem_reg_voltage_dat_w : NATURAL := 32; + CONSTANT c_mem_reg_voltage_nof_data : NATURAL := 1; + CONSTANT c_mem_reg_voltage_data : t_c_mem := (c_mem_reg_rd_latency, c_mem_reg_voltage_adr_w , c_mem_reg_voltage_dat_w , c_mem_reg_voltage_nof_data, 'X'); SIGNAL mm_reg_temp_data : STD_LOGIC_VECTOR(c_mem_reg_dat_w-1 downto 0); SIGNAL temp_data : STD_LOGIC_VECTOR(9 downto 0); @@ -65,6 +75,8 @@ ARCHITECTURE str OF fpga_temp_sens IS BEGIN + -- temperature sensor + 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 ( @@ -88,19 +100,15 @@ BEGIN END GENERATE; - - gen_no_tech_fpga_temp_sens: IF g_sim=TRUE GENERATE - temp_data <= RESIZE_UVEC(x"45",10); + + -- 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_data <= RESIZE_UVEC(x"45",10); mm_reg_temp_data <= RESIZE_UVEC(temp_data,c_mem_reg_dat_w); END GENERATE; - - - - - - u_reg_map : ENTITY common_lib.common_reg_r_w_dc GENERIC MAP ( g_cross_clock_domain => FALSE, @@ -117,8 +125,8 @@ BEGIN st_clk => mm_clk, -- Memory Mapped Slave in mm_clk domain - sla_in => reg_mosi, - sla_out => reg_miso, + sla_in => reg_temp_mosi, + sla_out => reg_temp_miso, -- MM registers in st_clk domain reg_wr_arr => OPEN, @@ -127,4 +135,42 @@ BEGIN in_reg => mm_reg_temp_data, out_reg => OPEN ); + + + -- voltage sensor + + gen_tech_fpga_voltage_sens: IF g_sim=FALSE GENERATE + u_tech_fpga_voltage_sens : ENTITY tech_fpga_voltage_sens_lib.tech_fpga_voltage_sens + GENERIC MAP ( + g_technology => g_technology + ) + PORT MAP ( + clock_clk => mm_clk, + reset_sink_reset => mm_reset, + controller_csr_address => controller_csr_address, + controller_csr_read => controller_csr_read, + controller_csr_write => controller_csr_write, + controller_csr_writedata => controller_csr_writedata, + controller_csr_readdata => controller_csr_readdata, + sample_store_csr_address => reg_voltage_store_mosi.address, + sample_store_csr_read => reg_voltage_store_mosi.read, + sample_store_csr_write => reg_voltage_store_mosi.write, + sample_store_csr_writedata => reg_voltage_store_mosi.writedata, + sample_store_csr_readdata => reg_voltage_store_mosi.readdata, + sample_store_irq_irq => sample_store_irq_irq + ); + + PROCESS(eoc, mm_rst) + BEGIN + IF mm_rst = '1' THEN + mm_reg_temp_data <= (OTHERS => '0'); + ELSIF falling_edge(eoc) THEN + mm_reg_temp_data <= RESIZE_UVEC(temp_data,c_mem_reg_dat_w); + END IF; + END PROCESS; + + END GENERATE; + + + END str;