fpga中用for与加法区建立乘法器的区别

/*
目的:对比for得到的乘法器最高频率
结论: 1、205M 远远高于for的80M,且资源分布均匀(加法器同时8个相加)
      2、改为加法器4个相加流水线设计 频率升为211M 明显加法器不能太多
      3、再改为2级加法器,375M 真是意外的惊喜
*/

module top(
input                clk,
input        [7:0]    a,
input        [7:0]    b,

output    reg [15:0]    q
);
        reg [15:0] x,y,z,h;
        reg [15:0]    temp0,temp1,temp2,temp3,temp4,temp5,temp6,temp7;
initial begin
    $display("3+2 = %d",5);         
        
end


always@(posedge clk)begin 
    if(b[0])
        temp0 <= a;
    else
        temp0 <= 0;
end

always@(posedge clk)begin 
    if(b[1])
        temp1 <= a<<1;
    else
        temp1 <= 0;
end

always@(posedge clk)begin 
    if(b[2])
        temp2 <= a<<2;
    else
        temp2 <= 0;
end

always@(posedge clk)begin 
    if(b[3])
        temp3 <= a<<3;
    else
        temp3 <= 0;
end

always@(posedge clk)begin 
    if(b[4])
        temp4 <= a<<4;
    else
        temp4 <= 0;
end

always@(posedge clk)begin 
    if(b[5])
        temp5 <= a<<5;
    else
        temp5 <= 0;
end

always@(posedge clk)begin 
    if(b[6])
        temp6 <= a<<6;
    else
        temp6 <= 0;
end

always@(posedge clk)begin 
    if(b[7])
        temp7 <= a<<7;
    else
        temp7 <= 0;
end


always@(posedge clk)begin 
        x <= temp0 + temp1;
        h <= temp2 + temp3;
        y <= temp4 + temp5;
        z <= temp6 + temp7;
        q  <= x+y+z+h;
end


endmodule
///////////////////////////////////////////////////////////for/////////////////////////////////////////////

/*
目的:测试for在时序电路中 乘法器 能实现的最高频率
结论:8个循环最高跑80M ,,,7个循环90M  8 是一个分界点


*/

module top(
input                clk,
input        [7:0]    a,
input        [7:0]    b,

output    reg [15:0]    q
);
        reg [15:0]    a_t;
        reg [7:0]    i;
        

always@(posedge clk)begin 
    q = 0;
    a_t = {8'b0,a};
    i = 0;
    
    for(i = 0;i < 8;i = i+1)begin
        if(b[i])begin
            q = q + a_t;
        end
        a_t = a_t << 1;
    
    end
    
    
end


endmodule
 

你可能感兴趣的:(FPGA)