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

Subversion Repositories verilog_fixed_point_math_library

[/] [verilog_fixed_point_math_library/] [trunk/] [ReadMe.txt] - Blame information for rev 4

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 4 tomburkeii
Verilog Fixed point math library
2
 
3
Original work by Sam Skalicky, originally found here:
4
http://opencores.org/project,fixed_point_arithmetic_parameterized
5
 
6
Extended, updated, and heavily commented by Tom Burke (tomburkeii@gmail.com)
7
 
8
This library includes the basic math functions for the Verilog Language,
9
for implementation on FPGAs.
10
 
11
All units have been simulated and synthesized for Xilinx Spartan 3E devices
12
using the Xilinx ISE WebPack tools v14.7
13
 
14
These math routines use a signed magnitude Q,N format, where N is the total
15
number of bits used, and Q is the number of fractional bits used.  For
16
instance, 15,32 would represent a 32-bit number with 15 fractional bits,
17
16 integer bits, and 1 sign bit as shown below:
18
 
19
|1|<- N-Q-1 bits ->|<--- Q bits -->|
20
|S|IIIIIIIIIIIIIIII|FFFFFFFFFFFFFFF|
21
 
22
This library contains the following modules:
23
qadd.v      - Addition module; adds 2 numbers of any sign.
24
qdiv.v      - Division module; divides two numbers using a right-shift and
25
                subtract algorithm - requires an input clock
26
qmult.v     - Multiplication module; purely combinational for systems that
27
                will support it
28
qmults.v    - Multiplication module; uses a left-shift and add algorithm -
29
                requires an input clock (for systems that cannot support
30
                                the synthesis of a combinational multiplier)
31
Test_add.v  - Test fixture for the qadd.v module
32
Test_mult.v - Test fixture for the qmult.v module
33
TestDiv.v   - Test fixture for the qdiv.v module
34
TestMultS.v - Test fixture for the qmults.v module
35
 
36
These math routines default to a (Q,N) of (15,32), but are easily customizable
37
to your application by changing their input parameters.  For instance, an
38
unmodified use of (15,32) would look something like this:
39
 
40
     qadd my_adder(
41
          .a(addend_a),
42
          .b(addend_b),
43
          .c(result)
44
          );
45
 
46
To change this to an (8,23) notation, for instance, the same module would be
47
instantiated thusly:
48
 
49
     qadd #(8,23) my_adder(
50
          .a(addend_a),
51
          .b(addend_b),
52
          .c(result)
53
          );
54
 
55
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
56
The following is a description of each module
57
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
58
 
59
qadd.v - A simple combinational addition module.
60
 
61
sum = addend + addend
62
 
63
Input format:
64
|1|<- N-Q-1 bits ->|<--- Q bits -->|
65
|S|IIIIIIIIIIIIIIII|FFFFFFFFFFFFFFF|
66
 
67
Inputs:
68
     a - addend 1
69
     b - addend 2
70
 
71
Output format:
72
|1|<- N-Q-1 bits ->|<--- Q bits -->|
73
|S|IIIIIIIIIIIIIIII|FFFFFFFFFFFFFFF|
74
 
75
Output:
76
     c - result
77
 
78
NOTE:  There is no error detection for an overflow.  It is up to the designer
79
         to ensure that an overflow cannot occur!!
80
 
81
Example usage:
82
     qadd #(Q,N) my_adder(
83
          .a(addend_a),
84
          .b(addend_b),
85
          .c(result)
86
          );
87
 
88
For subtraction, set the sign bit for the negative number. (subtraction is
89
the addition of a negative, right?)
90
 
91
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
92
qmult.v - A simple combinational multiplication module.
93
 
94
Input format:
95
|1|<- N-Q-1 bits ->|<--- Q bits -->|
96
|S|IIIIIIIIIIIIIIII|FFFFFFFFFFFFFFF|
97
 
98
Inputs:
99
     i_multiplicand - multiplicand
100
         i_multiplier   - multiplier
101
 
102
Output format:
103
|1|<- N-Q-1 bits ->|<--- Q bits -->|
104
|S|IIIIIIIIIIIIIIII|FFFFFFFFFFFFFFF|
105
 
106
Output:
107
     o_result - result
108
         ovr      - overflow flag
109
 
110
NOTE:  This module assumes a system that supports the synthesis of
111
       combinational multipliers.  If your device/synthesizer does not
112
       support this for your particular application, then use the
113
       "qmults.v" module.
114
 
115
NOTE:  Notice that the output format is identical to the input format!  To
116
       properly use this module, you need to either ensure that you maximum
117
           result never exceeds the format, or incorporate the overflow flag
118
           into your design
119
 
120
Example usage:
121
     qmult #(Q,N) my_multiplier(
122
          .i_multiplicand(multiplicand),
123
          .i_multiplier(multiplier),
124
          .o_result(result),
125
          .ovr(overflow_flag)
126
          );
127
 
128
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
129
qmults.v - A multi-clock multiplication module that uses a left-shift
130
           and add algorithm.
131
 
132
result = multiplicand x multiplier
133
 
134
Input format:
135
|1|<- N-Q-1 bits ->|<--- Q bits -->|
136
|S|IIIIIIIIIIIIIIII|FFFFFFFFFFFFFFF|
137
 
138
Inputs:
139
     i_multiplicand - multiplicand
140
         i_multiplier   - multiplier
141
         i_start        - Start flag; set this bit high ("1") to start the
142
                          operation when the last operation is completed.  This
143
                          bit is ignored until o_complete is asserted.
144
         i_clk          - input clock; internal workings occur on the rising edge
145
 
146
Output format:
147
|1|<- N-Q-1 bits ->|<--- Q bits -->|
148
|S|IIIIIIIIIIIIIIII|FFFFFFFFFFFFFFF|
149
 
150
Output:
151
     o_result_out - result
152
         o_complete   - computation complete flag; asserted ("1") when the
153
                        operation is completed
154
         o_overflow   - overflow flag; asserted ("1") to indicate that an
155
                        overflow has occurred.
156
 
157
NOTE:  This module is "time deterministic ." - that is, it should always
158
       take the same number of clock cycles to complete an operation,
159
       regardless of the inputs (N+1 clocks)
160
 
161
NOTE:  Notice that the output format is identical to the input format!  To
162
       properly use this module, you need to either ensure that you maximum
163
       result never exceeds the format, or incorporate the overflow flag
164
       into your design
165
 
166
Example usage:
167
     qmults #(Q,N) my_multiplier(
168
          .i_multiplicand(multiplicand),
169
          .i_multiplier(multiplier),
170
          .i_start(start),
171
          .i_clk(clock),
172
          .o_result(result),
173
          .o_complete(done),
174
          .o_overflow(overflow_flag)
175
          );
176
 
177
The qmults.v module begins computation when the start conditions are met:
178
     o_complete == 1'b1;
179
     i_start == 1'b1;
180
 
181
 
182
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
183
qdiv.v - A multi-clock division module that uses a right-shift
184
           and add algorithm.
185
 
186
quotient = dividend / divisor
187
 
188
Input format:
189
|1|<- N-Q-1 bits ->|<--- Q bits -->|
190
|S|IIIIIIIIIIIIIIII|FFFFFFFFFFFFFFF|
191
 
192
Inputs:
193
     i_dividend  - dividend
194
         i_divisor   - divisor
195
         i_start     - Start flag; set this bit high ("1") to start the
196
                       operation when the last operation is completed.  This
197
                       bit is ignored until o_complete is asserted.
198
         i_clk       - input clock; internal workings occur on the rising edge
199
 
200
Output format:
201
|1|<- N-Q-1 bits ->|<--- Q bits -->|
202
|S|IIIIIIIIIIIIIIII|FFFFFFFFFFFFFFF|
203
 
204
Output:
205
     o_quotient_out - result
206
     o_complete     - computation complete flag; asserted ("1") when the
207
                      operation is completed
208
     o_overflow     - overflow flag; asserted ("1") to indicate that an
209
                      overflow has occurred.
210
 
211
NOTE:  This module is "time deterministic ." - that is, it should always
212
       take the same number of clock cycles to complete an operation,
213
       regardless of the inputs (N+Q+1 clocks)
214
 
215
NOTE:  Notice that the output format is identical to the input format!  To
216
       properly use this module, you need to either ensure that you maximum
217
       result never exceeds the format, or incorporate the overflow flag
218
       into your design
219
 
220
Example usage:
221
     qdiv #(Q,N) my_divider(
222
          .i_dividend(dividend),
223
          .i_divisor(divisor),
224
          .i_start(start),
225
          .i_clk(clock),
226
          .o_quotient_out(result),
227
          .o_complete(done),
228
          .o_overflow(overflow_flag)
229
          );
230
 
231
The qdiv.v module begins computation when the start conditions are met:
232
     o_complete == 1'b1;
233
     i_start == 1'b1;
234
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
235
Suggestions, Kudos, or Complaints?  Feel free to contact me - but remember,
236
this stuff is free!
237
 
238
 
239
 

powered by: WebSVN 2.1.0

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