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

Subversion Repositories qfp32

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

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

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