Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

Help with VHDL code for multiplier

Status
Not open for further replies.

tabascorez

Junior Member level 2
Joined
Nov 11, 2013
Messages
22
Helped
0
Reputation
0
Reaction score
0
Trophy points
1
Activity points
163
Hello

Can somebody help me with the vhdl code in the attachment. When I elaborate it on design vision, I get the error below. Does anyone know why so and can help out? Thanks

error.jpg


Code VHDL - [expand]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
library ieee;
use ieee.std_logic_1164.all;
 
entity mult is
  generic (
    N    : natural :=56
  );
  port (
    a_in : in  std_logic_vector(N-1 downto 0);
    b_in : in  std_logic_vector(N-1 downto 0);
    y    : out std_logic_vector(2*N-1 downto 0)
   );
end mult;
 
architecture structural of mult is
  type ab_type is
    array(N-1 downto 0) of std_logic_vector(N-1 downto 0);
  type c_type is
    array(N-1 downto 0) of std_logic_vector(N downto 1);
  type s_type is
    array(N-1 downto 0) of std_logic_vector(N-1 downto 0);
  --
  signal ab      : ab_type; 
  signal c       : c_type;
  signal s       : s_type;
  signal d       : std_logic_vector(N+1 downto 1);
  signal an      : std_logic;
  signal bn      : std_logic;
  signal sNm1Nm1 : std_logic;
  --
  component fa
    port(
      ain  : in  std_logic;
      bin  : in  std_logic;
      cin  : in  std_logic;
      sout : out std_logic;
      cout : out std_logic
    );
  end component;
begin
 
  -- bit product
  gen_ab_i:
  for i in 0 to N-1 generate
    gen_ab_j: for j in 0 to N-1 generate
      g_abn_leftcol: if (i = N-1) and (j /= N-1) generate
        ab(i)(j) <= a_in(i) and not (b_in(j));
      end generate g_abn_leftcol;
      g_anb_btmrow: if (i /= N-1) and (j = N-1) generate
        ab(i)(j) <= not(a_in(i)) and b_in(j);
      end generate g_anb_btmrow;
      g_ab_btmleft: if (i = N-1) and (j = N-1) generate
        ab(i)(j) <= a_in(i) and b_in(j);
      end generate g_ab_btmleft;
      g_ab_middle: if (i /= N-1) and (j /= N-1) generate
        ab(i)(j) <= a_in(i) and b_in(j);
      end generate g_ab_middle;
    end generate gen_ab_j;
  end generate gen_ab_i;
  
  -- top row
  gen_c_top_row:
  for i in 0 to N-2 generate
    c(i)(1) <= '0';
  end generate gen_c_top_row;
  gen_s_top_row:
  for i in 0 to N-1 generate
    s(i)(0) <= ab(i)(0);
  end generate gen_s_top_row;
   
  -- leftmost column
  gen_s_left_col:
  for j in 1 to N-1 generate
    s(N-1)(j) <= ab(N-1)(j);
  end generate gen_s_left_col;
     
  -- full-adder matrix
  gen_fa_i:
  for i in 0 to N-2 generate
    gen_fa_j:
    for j in 1 to N-1 generate
      u_fa : fa 
        port map (
          ain  => s(i+1)(j-1),
          bin  => ab(i)(j),
          cin  => c(i)(j),
          sout => s(i)(j),
          cout => c(i)(j+1)
        );
    end generate gen_fa_j;
  end generate gen_fa_i;
           
  -- special (N-1,N-1) fa
  an <= not(a_in(N-1));
  bn <= not(b_in(N-1));
  u_fa_nm1sq : fa 
    port map (
      ain  => an,
      bin  => ab(N-1)(N-1),
      cin  => bn,
      sout => sNm1Nm1,
      cout => c(N-1)(N)
    );
      
  -- final stage adder
  gen_fsa: 
  for i in 0 to N generate
    gen_fsa_0: 
    if i = 0 generate
      u_fa_fsa_0 : fa 
        port map (
          ain  => s(i)(N-1),
          bin  => b_in(N-1),
          cin  => a_in(N-1),
          sout => y(i+N-1),
          cout => d(1)
        );
    end generate gen_fsa_0;
    gen_fsa_mid: 
    if i > 0 and i < N-1 generate
      u_fa_fsa_mid : fa 
        port map (
          ain  => s(i)(N-1),
          bin  => d(i),
          cin  => c(i-1)(N),
          sout => y(i+N-1),
          cout => d(i+1)
        );
    end generate gen_fsa_mid;
    gen_fsa_n : if i = N-1 generate
      u_fa_fsa_n : fa 
        port map (
          ain  => sNm1Nm1,
          bin  => d(i),
          cin  => c(i-1)(N),
          sout => y(i+N-1),
          cout => d(i+1)
        );
    end generate gen_fsa_n;
    gen_fsa_np1 : if i = N generate
      u_fa_fsa_np1 : fa 
        port map (
          ain  => '1',
          bin  => d(i),
          cin  => c(i-1)(N),
          sout => y(i+N-1),
          cout => d(i+1)
        );
    end generate gen_fsa_np1;
  end generate gen_fsa;
               
  -- bottom row and output (lower half)
  gen_out:
  for j in 0 to N-2 generate
    y(j) <= s(0)(j);
  end generate gen_out;
   
end structural;

 

M not getting the error with ur code, btw, which synthesis tool are you using ?
 

No issue after I added a fa.vhd file to the design. You do know this is a very large combinational circuit. Using Vivado it ends up with >60 levels of logic (LUTs) from a_in to y. Of course I didn't add any constraints to try and improve the timing.
e.g.
Capture.PNG

Regards
 

Status
Not open for further replies.

Similar threads

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top