-- Simulates the fpu by reading signals from stdin and writing results to stdout -- See COPYRIGHT.jop for the original copyright notice. library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; use ieee.math_real.all; use ieee.std_logic_arith.all; use ieee.std_logic_misc.all; use std.textio.all; use work.txt_util.all; use work.fpupack.all; -- fpu operations (fpu_op_i): -- ======================== -- 000 = add, -- 001 = substract, -- 010 = multiply, -- 011 = divide, -- 100 = square root -- 101 = unused -- 110 = unused -- 111 = unused -- Rounding Mode: -- ============== -- 00 = round to nearest even(default), -- 01 = round to zero, -- 10 = round up, -- 11 = round down entity main is end main; architecture rtl of main is component fpu port ( clk_i : in std_logic; opa_i : in std_logic_vector(31 downto 0); opb_i : in std_logic_vector(31 downto 0); fpu_op_i : in std_logic_vector(2 downto 0); rmode_i : in std_logic_vector(1 downto 0); output_o : out std_logic_vector(31 downto 0); ine_o : out std_logic; overflow_o : out std_logic; underflow_o : out std_logic; div_zero_o : out std_logic; inf_o : out std_logic; zero_o : out std_logic; qnan_o : out std_logic; snan_o : out std_logic; start_i : in std_logic; ready_o : out std_logic ); end component; -- Assigning default values doesn't seem to help the error messages :( signal clk_i : std_logic:= '1'; signal opa_i, opb_i : std_logic_vector(FP_WIDTH-1 downto 0) := (others => '0'); signal fpu_op_i : std_logic_vector(2 downto 0) := (others => '0'); signal rmode_i : std_logic_vector(1 downto 0) := (others => '0'); signal output_o : std_logic_vector(FP_WIDTH-1 downto 0) := (others => '0'); signal start_i : std_logic := '1'; signal ready_o : std_logic := '1'; signal ine_o : std_logic := '0'; signal overflow_o : std_logic := '0'; signal underflow_o : std_logic := '0'; signal div_zero_o : std_logic := '0'; signal inf_o : std_logic := '0'; signal zero_o : std_logic := '0'; signal qnan_o : std_logic := '0'; signal snan_o : std_logic := '0'; signal slv_out : std_logic_vector(FP_WIDTH-1 downto 0); constant CLK_PERIOD :time := 10 ns; -- period of clk period begin -- instantiate fpu i_fpu: fpu port map ( clk_i => clk_i, opa_i => opa_i, opb_i => opb_i, fpu_op_i => fpu_op_i, rmode_i => rmode_i, output_o => output_o, ine_o => ine_o, overflow_o => overflow_o, underflow_o => underflow_o, div_zero_o => div_zero_o, inf_o => inf_o, zero_o => zero_o, qnan_o => qnan_o, snan_o => snan_o, start_i => start_i, ready_o => ready_o); --------------------------------------------------------------------------- -- toggle clock --------------------------------------------------------------------------- clk_i <= not(clk_i) after 5 ns; mainloop : process --The operands and results are in Hex format. file input_file: TEXT open read_mode is "STD_INPUT"; variable file_line: line; variable str_in: string(FP_WIDTH/4 downto 1); variable str_fpu_op: string(3 downto 1); variable str_rmode: string(2 downto 1); begin -- Read ops from input_file --print(str(ZERO_VECTOR)); --print(str(INF)); --print(str(QNAN)); --print(str(SNAN)); start_i <= '0'; while not endfile(input_file) loop wait for CLK_PERIOD; start_i <= '1'; str_read(input_file,str_in); opa_i <= strhex_to_slv(str_in); str_read(input_file,str_in); opb_i <= strhex_to_slv(str_in); str_read(input_file,str_fpu_op); fpu_op_i <= strhex_to_slv(str_fpu_op)(2 downto 0); str_read(input_file,str_rmode); rmode_i <= strhex_to_slv(str_rmode)(1 downto 0); wait for CLK_PERIOD; start_i <= '0'; wait until ready_o='1'; --print("OpA"); print(hstr(opa_i)); --print("OpB"); print(hstr(opb_i)); --print("Opcode"); print(hstr(fpu_op_i)); --print("Rmode"); print(hstr(rmode_i)); print(hstr(output_o)); end loop; wait; end process mainloop; end rtl;