Add Makefile, change original tester to be the vfpu
[ipdf/vfpu.git] / src / main.vhd
1 -- Simulates the fpu by reading signals from stdin and writing results to stdout
2 -- See COPYRIGHT.jop for the original copyright notice.
3
4 library ieee;
5 use ieee.std_logic_1164.all;
6 use ieee.std_logic_unsigned.all;
7 use ieee.math_real.all;
8 use ieee.std_logic_arith.all;
9 use ieee.std_logic_misc.all;
10 use std.textio.all;
11 use work.txt_util.all;
12
13         -- fpu operations (fpu_op_i):
14                 -- ========================
15                 -- 000 = add, 
16                 -- 001 = substract, 
17                 -- 010 = multiply, 
18                 -- 011 = divide,
19                 -- 100 = square root
20                 -- 101 = unused
21                 -- 110 = unused
22                 -- 111 = unused
23                 
24         -- Rounding Mode: 
25         -- ==============
26         -- 00 = round to nearest even(default), 
27         -- 01 = round to zero, 
28         -- 10 = round up, 
29         -- 11 = round down
30
31
32 entity main is
33 end main;
34
35 architecture rtl of main is
36
37 component fpu 
38     port (
39         clk_i           : in std_logic;
40         opa_i           : in std_logic_vector(31 downto 0);   
41         opb_i           : in std_logic_vector(31 downto 0);
42         fpu_op_i                : in std_logic_vector(2 downto 0);
43         rmode_i                 : in std_logic_vector(1 downto 0);  
44         output_o        : out std_logic_vector(31 downto 0);
45                 ine_o                   : out std_logic;
46         overflow_o      : out std_logic;
47         underflow_o     : out std_logic;
48         div_zero_o      : out std_logic;
49         inf_o                   : out std_logic;
50         zero_o                  : out std_logic;
51         qnan_o                  : out std_logic;
52         snan_o                  : out std_logic;
53         start_i                 : in  std_logic;
54         ready_o                 : out std_logic 
55         );   
56 end component;
57
58
59 signal clk_i : std_logic:= '1';
60 signal opa_i, opb_i : std_logic_vector(31 downto 0) := (others => '0');
61 signal fpu_op_i         : std_logic_vector(2 downto 0) := (others => '0');
62 signal rmode_i : std_logic_vector(1 downto 0) := (others => '0');
63 signal output_o : std_logic_vector(31 downto 0) := (others => '0');
64 signal start_i, ready_o : std_logic := '0';
65 signal ine_o, overflow_o, underflow_o, div_zero_o, inf_o, zero_o, qnan_o, snan_o: std_logic := '0';
66
67
68
69 signal slv_out : std_logic_vector(31 downto 0);
70
71 constant CLK_PERIOD :time := 10 ns; -- period of clk period
72
73
74 begin
75
76     -- instantiate fpu
77     i_fpu: fpu port map (
78                         clk_i => clk_i,
79                         opa_i => opa_i,
80                         opb_i => opb_i,
81                         fpu_op_i =>     fpu_op_i,
82                         rmode_i => rmode_i,     
83                         output_o => output_o,  
84                         ine_o => ine_o,
85                         overflow_o => overflow_o,
86                         underflow_o => underflow_o,             
87                 div_zero_o => div_zero_o,
88                 inf_o => inf_o,
89                 zero_o => zero_o,               
90                 qnan_o => qnan_o,               
91                 snan_o => snan_o,
92                 start_i => start_i,
93                 ready_o => ready_o);            
94                         
95
96     ---------------------------------------------------------------------------
97     -- toggle clock
98     ---------------------------------------------------------------------------
99     clk_i <= not(clk_i) after 5 ns;
100
101
102     mainloop : process 
103                 --The operands and results are in Hex format. 
104                 file input_file: TEXT open read_mode is "STD_INPUT"; 
105
106                 variable file_line: line;
107                 variable str_in: string(8 downto 1);
108                 variable str_fpu_op: string(3 downto 1);
109                 variable str_rmode: string(2 downto 1);
110
111
112
113     begin
114                 -- Read ops from input_file
115                 start_i <= '0';
116                 while not endfile(input_file) loop
117
118                         wait for CLK_PERIOD; 
119                         start_i <= '1';
120                         
121                         str_read(input,str_in);
122                         opa_i <= strhex_to_slv(str_in);
123                         
124                         str_read(input,str_in);
125                         opb_i <= strhex_to_slv(str_in);
126
127                         str_read(input_file,str_fpu_op);
128                         fpu_op_i <= to_std_logic_vector(str_fpu_op);
129                         
130                         str_read(input_file,str_rmode);
131                         rmode_i <= to_std_logic_vector(str_rmode);
132                         
133                         str_read(input_file,str_in);
134                         slv_out <= strhex_to_slv(str_in);
135
136                         wait for CLK_PERIOD;
137                         start_i <= '0'; 
138                         wait until ready_o='1';
139                         
140                         
141                         print(hstr(output_o));
142                         
143                 end loop;               
144         wait;
145     end process mainloop;
146
147 end rtl;

UCC git Repository :: git.ucc.asn.au