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

Subversion Repositories amber

[/] [amber/] [trunk/] [hw/] [vlog/] [amber23/] [a23_multiply.v] - Diff between revs 15 and 53

Show entire file | Details | Blame | View Log

Rev 15 Rev 53
Line 78... Line 78...
reg  [5:0]  count = 'd0;
reg  [5:0]  count = 'd0;
reg  [5:0]  count_nxt;
reg  [5:0]  count_nxt;
reg  [67:0] product = 'd0;
reg  [67:0] product = 'd0;
reg  [67:0] product_nxt;
reg  [67:0] product_nxt;
reg  [1:0]  flags_nxt;
reg  [1:0]  flags_nxt;
reg         sum_acc1_carry = 'd0;
 
reg         sum_acc1_carry_nxt;
 
wire [32:0] sum_acc1;           // the MSB is the carry out for the upper 32 bit addition
wire [32:0] sum_acc1;           // the MSB is the carry out for the upper 32 bit addition
 
 
 
 
assign enable         = i_function[0];
assign enable         = i_function[0];
assign accumulate     = i_function[1];
assign accumulate     = i_function[1];
Line 152... Line 150...
 
 
always @*
always @*
    begin
    begin
    // Defaults
    // Defaults
    count_nxt           = count;
    count_nxt           = count;
    sum_acc1_carry_nxt  = sum_acc1_carry;
 
    product_nxt         = product;
    product_nxt         = product;
 
 
    // update Negative and Zero flags
    // update Negative and Zero flags
    // Use registered value of product so this adds an extra cycle
    // Use registered value of product so this adds an extra cycle
    // but this avoids having the 64-bit zero comparator on the
    // but this avoids having the 64-bit zero comparator on the
Line 171... Line 168...
    else if ( count == 6'd34 && accumulate )
    else if ( count == 6'd34 && accumulate )
        begin
        begin
        // Note that bit 0 is not part of the product. It is used during the booth
        // Note that bit 0 is not part of the product. It is used during the booth
        // multiplication algorithm
        // multiplication algorithm
        product_nxt         = { product[64:33], sum_acc1[31:0], 1'd0}; // Accumulate
        product_nxt         = { product[64:33], sum_acc1[31:0], 1'd0}; // Accumulate
        sum_acc1_carry_nxt  = sum_acc1[32];
 
        end
        end
 
 
    // Multiplication state counter
    // Multiplication state counter
    if (count == 6'd0)  // start
    if (count == 6'd0)  // start
        count_nxt   = enable ? 6'd1 : 6'd0;
        count_nxt   = enable ? 6'd1 : 6'd0;
Line 190... Line 186...
always @ ( posedge i_clk )
always @ ( posedge i_clk )
    if ( !i_fetch_stall )
    if ( !i_fetch_stall )
        begin
        begin
        count           <= i_execute ? count_nxt          : count;
        count           <= i_execute ? count_nxt          : count;
        product         <= i_execute ? product_nxt        : product;
        product         <= i_execute ? product_nxt        : product;
        sum_acc1_carry  <= i_execute ? sum_acc1_carry_nxt : sum_acc1_carry;
 
        o_done          <= i_execute ? count == 6'd31     : o_done;
        o_done          <= i_execute ? count == 6'd31     : o_done;
        end
        end
 
 
// Outputs
// Outputs
assign o_out   = product[32:1];
assign o_out   = product[32:1];

powered by: WebSVN 2.1.0

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