OpenCores
URL https://opencores.org/ocsvn/qfp32/qfp32/trunk

Subversion Repositories qfp32

[/] [qfp32/] [trunk/] [Units/] [mul.vhd] - Blame information for rev 2

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 mgraep
library IEEE;
2
use IEEE.std_logic_1164.all;
3
use IEEE.numeric_std.all;
4
 
5
library work;
6
use work.qfp_p.all;
7
 
8
entity qfp32_mul is
9
 
10
  port (
11
    clk_i     : in  std_ulogic;
12
    reset_n_i : in  std_ulogic;
13
 
14
    start_i   : in  std_ulogic;
15
    ready_o   : out std_ulogic;
16
 
17
    regA_i    : in  qfp32_t;
18
    regB_i    : in  qfp32_t;
19
 
20
    complete_o : out std_ulogic;
21
    result_o   : out qfp32_raw_t);
22
 
23
end qfp32_mul;
24
 
25
architecture Rtl of qfp32_mul is
26
 
27
  signal start_1d : std_ulogic;
28
  signal start_2d : std_ulogic;
29
 
30
  signal p1_result : unsigned(57 downto 0);
31
  signal p1_sign : std_ulogic;
32
  signal p1_exp_special : unsigned(2 downto 0);
33
 
34
  signal p2_complete : std_ulogic;
35
  signal p2_result : unsigned(57 downto 0);
36
  signal p2_sign : std_ulogic;
37
  signal p2_exp_special : unsigned(2 downto 0);
38
 
39
begin  -- Rtl
40
 
41
  -- make multiplication multicycle path => better performance
42
 
43
  process (clk_i, reset_n_i)
44
  begin  -- process
45
    if reset_n_i = '0' then             -- asynchronous reset (active low)
46
      p2_result <= to_unsigned(0,58);
47
      p2_sign <= '0';
48
      p2_exp_special <= to_unsigned(0,3);
49
      p2_complete <= '0';
50
      start_1d <= '0';
51
      start_2d <= '0';
52
    elsif clk_i'event and clk_i = '1' then  -- rising clock edge
53
      start_1d <= start_i;
54
      start_2d <= start_1d;
55
      p2_complete <= '0';
56
 
57
      -- move data to next pipeline stage
58
      if start_2d = '1' then
59
        p2_result <= p1_result;
60
        p2_sign <= p1_sign;
61
        p2_exp_special <= p1_exp_special;
62
        p2_complete <= '1';
63
      end if;
64
 
65
    end if;
66
  end process;
67
 
68
  process (p2_exp_special, p2_result, p2_sign, regA_i, regB_i)
69
  begin  -- process
70
 
71
    -- stage 1
72
    p1_result <= regA_i.mant * regB_i.mant;
73
 
74
    p1_sign <= regA_i.fmt.sign xor regB_i.fmt.sign;
75
    p1_exp_special <= ('0' & regA_i.fmt.exp)+('0' & regB_i.fmt.exp);
76
 
77
    -- stage 2
78
    result_o.sign <= p2_sign;
79
    result_o.extMant <= p2_result(52 downto 0);
80
    result_o.ov <= p2_result(57 downto 53);
81
    result_o.exp <= p2_exp_special;
82
 
83
  end process;
84
 
85
  ready_o <= not start_1d;
86
  complete_o <= p2_complete;
87
 
88
end Rtl;
89
 
90
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.