URL
https://opencores.org/ocsvn/ft816float/ft816float/trunk
Subversion Repositories ft816float
[/] [ft816float/] [trunk/] [rtl/] [verilog2/] [mult114x114.sv] - Rev 33
Compare with Previous | Blame | View Log
// ============================================================================// __// \\__/ o\ (C) 2019 Robert Finch, Waterloo// \ __ / All rights reserved.// \/_// robfinch<remove>@finitron.ca// ||//// This source file is free software: you can redistribute it and/or modify// it under the terms of the GNU Lesser General Public License as published// by the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.//// This source file is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.//// You should have received a copy of the GNU General Public License// along with this program. If not, see <http://www.gnu.org/licenses/>.//// Latency 16 clocks.// ============================================================================// Thanks to Karatsubamodule mult114x114(clk, ce, a, b, p);input clk;input ce;input [113:0] a;input [113:0] b;output reg [227:0] p;reg [113:0] p1d;wire [113:0] z0, z2, p1;reg [113:0] z1;wire [113:0] ad, bd;reg [57:0] a1, b1;reg [56:0] a2, b2;wire sgn;always @(posedge clk)if (ce) a1 <= a[56:0] - a[113:57];always @(posedge clk)if (ce) b1 <= b[113:57] - b[56:0];always @(posedge clk)if (ce) a2 <= a1[57] ? -a1 : a1;always @(posedge clk)if (ce) b2 <= b1[57] ? -b1 : b1;delay3 #(114) uda (.clk(clk), .ce(1'b1), .i(a), .o(ad));delay3 #(114) udb (.clk(clk), .ce(1'b1), .i(b), .o(bd));vtdl #(1) uds (.clk(clk), .ce(1'b1), .a(4'd12), .d(a1[57]^b1[57]), .q(sgn));mult57x57 u1 (.CLK(clk),.CE(ce),.A(ad[113:57]),.B(bd[113:57]),.P(z2));mult57x57 u2 (.CLK(clk),.CE(ce),.A(ad[56:0]),.B(bd[56:0]),.P(z0));mult57x57 u3 (.CLK(clk),.CE(ce),.A(a2),.B(b2),.P(p1));always @(posedge clk)if (ce) p1d <= sgn ? -p1 : p1;always @(posedge clk)if (ce) z1 <= p1d + z2 + z0;always @(posedge clk)if (ce) p <= {z2,z0} + {z1,57'd0};endmodule
