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

Subversion Repositories thor

[/] [thor/] [trunk/] [FT64v5/] [rtl/] [lib/] [BCDMath.v] - Blame information for rev 48

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 48 robfinch
`timescale 1ns / 1ps
2
//=============================================================================
3
//        __
4
//   \\__/ o\    (C) 2012  Robert Finch
5
//    \  __ /    All rights reserved.
6
//     \/_//     robfinch<remove>@opencores.org
7
//       ||
8
//  
9
//      BCDMath.v
10
//
11
//  
12
// This source file is free software: you can redistribute it and/or modify 
13
// it under the terms of the GNU Lesser General Public License as published 
14
// by the Free Software Foundation, either version 3 of the License, or     
15
// (at your option) any later version.                                      
16
//                                                                          
17
// This source file is distributed in the hope that it will be useful,      
18
// but WITHOUT ANY WARRANTY; without even the implied warranty of           
19
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            
20
// GNU General Public License for more details.                             
21
//                                                                          
22
// You should have received a copy of the GNU General Public License        
23
// along with this program.  If not, see <http://www.gnu.org/licenses/>.    
24
//                                                                          
25
//
26
//=============================================================================
27
//
28
module BCDAdd(ci,a,b,o,c);
29
input ci;               // carry input
30
input [7:0] a;
31
input [7:0] b;
32
output [7:0] o;
33
output c;
34
 
35
wire c0,c1;
36
 
37
wire [4:0] hsN0 = a[3:0] + b[3:0] + ci;
38
wire [4:0] hsN1 = a[7:4] + b[7:4] + c0;
39
 
40
BCDAddAdjust u1 (hsN0,o[3:0],c0);
41
BCDAddAdjust u2 (hsN1,o[7:4],c);
42
 
43
endmodule
44
 
45
module BCDAdd4(ci,a,b,o,c);
46
input ci;               // carry input
47
input [15:0] a;
48
input [15:0] b;
49
output [15:0] o;
50
output c;
51
 
52
wire c0,c1,c2;
53
 
54
wire [4:0] hsN0 = a[3:0] + b[3:0] + ci;
55
wire [4:0] hsN1 = a[7:4] + b[7:4] + c0;
56
wire [4:0] hsN2 = a[11:8] + b[11:8] + c1;
57
wire [4:0] hsN3 = a[15:12] + b[15:12] + c2;
58
 
59
BCDAddAdjust u1 (hsN0,o[3:0],c0);
60
BCDAddAdjust u2 (hsN1,o[7:4],c1);
61
BCDAddAdjust u3 (hsN2,o[11:8],c2);
62
BCDAddAdjust u4 (hsN3,o[15:12],c);
63
 
64
endmodule
65
 
66
module BCDSub(ci,a,b,o,c);
67
input ci;               // carry input
68
input [7:0] a;
69
input [7:0] b;
70
output [7:0] o;
71
output c;
72
 
73
wire c0,c1;
74
 
75
wire [4:0] hdN0 = a[3:0] - b[3:0] - ci;
76
wire [4:0] hdN1 = a[7:4] - b[7:4] - c0;
77
 
78
BCDSubAdjust u1 (hdN0,o[3:0],c0);
79
BCDSubAdjust u2 (hdN1,o[7:4],c);
80
 
81
endmodule
82
 
83
module BCDAddAdjust(i,o,c);
84
input [4:0] i;
85
output [3:0] o;
86
reg [3:0] o;
87
output c;
88
reg c;
89
always @(i)
90
case(i)
91
5'h0: begin o = 4'h0; c = 1'b0; end
92
5'h1: begin o = 4'h1; c = 1'b0; end
93
5'h2: begin o = 4'h2; c = 1'b0; end
94
5'h3: begin o = 4'h3; c = 1'b0; end
95
5'h4: begin o = 4'h4; c = 1'b0; end
96
5'h5: begin o = 4'h5; c = 1'b0; end
97
5'h6: begin o = 4'h6; c = 1'b0; end
98
5'h7: begin o = 4'h7; c = 1'b0; end
99
5'h8: begin o = 4'h8; c = 1'b0; end
100
5'h9: begin o = 4'h9; c = 1'b0; end
101
5'hA: begin o = 4'h0; c = 1'b1; end
102
5'hB: begin o = 4'h1; c = 1'b1; end
103
5'hC: begin o = 4'h2; c = 1'b1; end
104
5'hD: begin o = 4'h3; c = 1'b1; end
105
5'hE: begin o = 4'h4; c = 1'b1; end
106
5'hF: begin o = 4'h5; c = 1'b1; end
107
5'h10:  begin o = 4'h6; c = 1'b1; end
108
5'h11:  begin o = 4'h7; c = 1'b1; end
109
5'h12:  begin o = 4'h8; c = 1'b1; end
110
5'h13:  begin o = 4'h9; c = 1'b1; end
111
default:        begin o = 4'h9; c = 1'b1; end
112
endcase
113
endmodule
114
 
115
module BCDSubAdjust(i,o,c);
116
input [4:0] i;
117
output [3:0] o;
118
reg [3:0] o;
119
output c;
120
reg c;
121
always @(i)
122
case(i)
123
5'h0: begin o = 4'h0; c = 1'b0; end
124
5'h1: begin o = 4'h1; c = 1'b0; end
125
5'h2: begin o = 4'h2; c = 1'b0; end
126
5'h3: begin o = 4'h3; c = 1'b0; end
127
5'h4: begin o = 4'h4; c = 1'b0; end
128
5'h5: begin o = 4'h5; c = 1'b0; end
129
5'h6: begin o = 4'h6; c = 1'b0; end
130
5'h7: begin o = 4'h7; c = 1'b0; end
131
5'h8: begin o = 4'h8; c = 1'b0; end
132
5'h9: begin o = 4'h9; c = 1'b0; end
133
5'h16: begin o = 4'h0; c = 1'b1; end
134
5'h17: begin o = 4'h1; c = 1'b1; end
135
5'h18: begin o = 4'h2; c = 1'b1; end
136
5'h19: begin o = 4'h3; c = 1'b1; end
137
5'h1A: begin o = 4'h4; c = 1'b1; end
138
5'h1B: begin o = 4'h5; c = 1'b1; end
139
5'h1C: begin o = 4'h6; c = 1'b1; end
140
5'h1D: begin o = 4'h7; c = 1'b1; end
141
5'h1E: begin o = 4'h8; c = 1'b1; end
142
5'h1F: begin o = 4'h9; c = 1'b1; end
143
default: begin o = 4'h9; c = 1'b1; end
144
endcase
145
endmodule
146
 
147
// Multiply two BCD digits
148
// Method used is table lookup
149
module BCDMul1(a,b,o);
150
input [3:0] a;
151
input [3:0] b;
152
output [7:0] o;
153
reg [7:0] o;
154
 
155
always @(a or b)
156
casex({a,b})
157
8'h00: o = 8'h00;
158
8'h01: o = 8'h00;
159
8'h02: o = 8'h00;
160
8'h03: o = 8'h00;
161
8'h04: o = 8'h00;
162
8'h05: o = 8'h00;
163
8'h06: o = 8'h00;
164
8'h07: o = 8'h00;
165
8'h08: o = 8'h00;
166
8'h09: o = 8'h00;
167
8'h10: o = 8'h00;
168
8'h11: o = 8'h01;
169
8'h12: o = 8'h02;
170
8'h13: o = 8'h03;
171
8'h14: o = 8'h04;
172
8'h15: o = 8'h05;
173
8'h16: o = 8'h06;
174
8'h17: o = 8'h07;
175
8'h18: o = 8'h08;
176
8'h19: o = 8'h09;
177
8'h20: o = 8'h00;
178
8'h21: o = 8'h02;
179
8'h22: o = 8'h04;
180
8'h23: o = 8'h06;
181
8'h24: o = 8'h08;
182
8'h25: o = 8'h10;
183
8'h26: o = 8'h12;
184
8'h27: o = 8'h14;
185
8'h28: o = 8'h16;
186
8'h29: o = 8'h18;
187
8'h30: o = 8'h00;
188
8'h31: o = 8'h03;
189
8'h32: o = 8'h06;
190
8'h33: o = 8'h09;
191
8'h34: o = 8'h12;
192
8'h35: o = 8'h15;
193
8'h36: o = 8'h18;
194
8'h37: o = 8'h21;
195
8'h38: o = 8'h24;
196
8'h39: o = 8'h27;
197
8'h40: o = 8'h00;
198
8'h41: o = 8'h04;
199
8'h42: o = 8'h08;
200
8'h43: o = 8'h12;
201
8'h44: o = 8'h16;
202
8'h45: o = 8'h20;
203
8'h46: o = 8'h24;
204
8'h47: o = 8'h28;
205
8'h48: o = 8'h32;
206
8'h49: o = 8'h36;
207
8'h50: o = 8'h00;
208
8'h51: o = 8'h05;
209
8'h52: o = 8'h10;
210
8'h53: o = 8'h15;
211
8'h54: o = 8'h20;
212
8'h55: o = 8'h25;
213
8'h56: o = 8'h30;
214
8'h57: o = 8'h35;
215
8'h58: o = 8'h40;
216
8'h59: o = 8'h45;
217
8'h60: o = 8'h00;
218
8'h61: o = 8'h06;
219
8'h62: o = 8'h12;
220
8'h63: o = 8'h18;
221
8'h64: o = 8'h24;
222
8'h65: o = 8'h30;
223
8'h66: o = 8'h36;
224
8'h67: o = 8'h42;
225
8'h68: o = 8'h48;
226
8'h69: o = 8'h54;
227
8'h70: o = 8'h00;
228
8'h71: o = 8'h07;
229
8'h72: o = 8'h14;
230
8'h73: o = 8'h21;
231
8'h74: o = 8'h28;
232
8'h75: o = 8'h35;
233
8'h76: o = 8'h42;
234
8'h77: o = 8'h49;
235
8'h78: o = 8'h56;
236
8'h79: o = 8'h63;
237
8'h80: o = 8'h00;
238
8'h81: o = 8'h08;
239
8'h82: o = 8'h16;
240
8'h83: o = 8'h24;
241
8'h84: o = 8'h32;
242
8'h85: o = 8'h40;
243
8'h86: o = 8'h48;
244
8'h87: o = 8'h56;
245
8'h88: o = 8'h64;
246
8'h89: o = 8'h72;
247
8'h90: o = 8'h00;
248
8'h91: o = 8'h09;
249
8'h92: o = 8'h18;
250
8'h93: o = 8'h27;
251
8'h94: o = 8'h36;
252
8'h95: o = 8'h45;
253
8'h96: o = 8'h54;
254
8'h97: o = 8'h63;
255
8'h98: o = 8'h72;
256
8'h99: o = 8'h81;
257
default:        o = 8'h00;
258
endcase
259
endmodule
260
 
261
 
262
// Multiply two pairs of BCD digits
263
// handles from 0x0 to 99x99
264
module BCDMul2(a,b,o);
265
input [7:0] a;
266
input [7:0] b;
267
output [15:0] o;
268
 
269
wire [7:0] p1,p2,p3,p4;
270
wire [15:0] s1;
271
 
272
BCDMul1 u1 (a[3:0],b[3:0],p1);
273
BCDMul1 u2 (a[7:4],b[3:0],p2);
274
BCDMul1 u3 (a[3:0],b[7:4],p3);
275
BCDMul1 u4 (a[7:4],b[7:4],p4);
276
 
277
BCDAdd4 u5 (1'b0,{p4,p1},{4'h0,p2,4'h0},s1);
278
BCDAdd4 u6 (1'b0,s1,{4'h0,p3,4'h0},o);
279
 
280
endmodule
281
 
282
module BCDMul_tb();
283
 
284
wire [15:0] o1,o2,o3,o4;
285
 
286
BCDMul2 u1 (8'h00,8'h00,o1);
287
BCDMul2 u2 (8'h99,8'h99,o2);
288
BCDMul2 u3 (8'h25,8'h18,o3);
289
BCDMul2 u4 (8'h37,8'h21,o4);
290
 
291
endmodule

powered by: WebSVN 2.1.0

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