Verilog中for循环的用法与Booth乘法器

5 篇文章 0 订阅
3 篇文章 0 订阅

for语句
for循环搭配generate块使用,框架如下:

    genvar i;
    generate
        for(i=0; i<X; i=i+1) begin 

        end 
    endgenerate 

generate语句的最主要功能就是对module、reg、assign、always、task等语句或者模块进行复制。
同时,内部还可以嵌套if-else语句等。另外还要注意的,在for语句块中,当定义的被赋值变量类型不同,赋值方式也不同。

1、当定义wire型变量时,内部必须使用assign赋值;
2、当定义reg型变量时,可直接赋值。

Booth Radix-4优化后程序实现
(原程序由“纸上谈芯”发布:https://blog.csdn.net/zhouxuanyuye/article/details/106366316)
经本人修改优化后,综合得到的参考面积在140-150单元之间,相比其他乘法器面积功耗小很多

module mult_booth6 #(parameter DL = 8)(
    input clk,
    input resetn,
    input [DL-1:0] A,
    input [DL-1:0] B,
    output [DL+DL-1:0] P
);

    // 8 * booth code, & 8 * booth generate product
    wire [(DL>>1)-1:0]  zero, two;
    
    // Encode every 3 bits 
    genvar i;
    generate
        for(i=0; i<(DL>>1); i++) begin 
            if(i==0) 
                booth_code5 u_booth_code(
                    .code({B[1:0], 1'b0}),
                    .zero(zero[i]),
                    .two(two[i])
                );
            else 
                booth_code5 u_booth_code(
                    .code(B[i*2+1:i*2-1]),
                    .zero(zero[i]),
                    .two(two[i])
                );
            end 
    endgenerate 
    
    // The corresponding code generates eight partial products
    wire [DL:0] Anot;
    assign Anot = (~{A[7],A} + 1'b1) ; // 9b

    wire [(DL>>1)-1:0][DL+1:0] prod; // 10b
    generate 
        for(i=0; i<(DL>>1); i++) begin 
            booth_gen_prod5  u_gen_prod(
                .A(A),
                .Anot(Anot),
                .sign(B[2*i+1]),
                .zero(zero[i]),
                .two(two[i]),
                .prod(prod[i]) 
            );
        end
    endgenerate
//    wire [12:0] p1, p2; // 13b
//    assign p1 = {{3{prod[0][DL+1]}},prod[0]} + ({{3{prod[1][DL+1]}},prod[1]}<<2); // 9b<<2 -> 11b, + ->12b
//    assign p2 = {{3{prod[2][DL+1]}},prod[2]} + ({{3{prod[3][DL+1]}},prod[3]}<<2); 
//    assign P = {{3{p1[12]}},p1} + ({{3{p2[12]}},p2}<<4); // 12b->16b
    assign P = {{6{prod[0][DL+1]}},prod[0]} + ({{6{prod[1][DL+1]}},prod[1]}<<2) + ({{6{prod[2][DL+1]}},prod[2]}<<4) + ({{6{prod[3][DL+1]}},prod[3]}<<6);
   
endmodule 

综合
无论使用for语句实现组合逻辑或是时序逻辑,其都可以被综合,并且综合后的底层电路是对每层for循环的并行实现,而不是像软件编程中的循环迭代。

【与Wallace 乘法器对比】

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值