HDLBits学习(三)*

Gates100

Vector100r

题目:给了一个长度是100的向量,请把它翻转输出一下

code:

module top_module( 
    input [99:0] in,
    output [99:0] out
);

    genvar i;
    generate 
        for(i=0;i<99;i++)begin:a2
            always @(*)begin
                out[i]=in[99-i];
            end
        end
    endgenerate     
  
endmodule

用always for

 always@(*)begin
        for (int i=0;i<=99;i=i+1)begin
            out[i]=in[99-i];
        end
    end

Popcount255

题目:​ 设计电路来计算输入矢量中 ’1‘ 的个数,题目要求建立一个255bit输入的矢量来判断输入中 ’1‘ 的个数。

code:

integer i;
always @(*)begin
    out=8'd0;        //要初始化0,不然仿真有问题
    for(i=0;i<255;i++)begin
        if(in[i]==1'b1)begin        //在generate for循环中,变量不能当做条件
            out=out+1'b1;
        end else begin
            out=out;
        end
    end
end

另一种思路:

有多少个1就是把所有的1相加:

assign out = in[0]+in[1]+...+in[254];

Adder100i

题目:通过实例化100个全加器来实现一个100bit的二进制加法器。该加法器有两个100bit的输入和cin,输出为sum与cout。为了鼓励大家使用实例化来完成电路设计,我们同时需要输出每个全加器的cout。 故cout[99]标志着全加器的最终进位。

code:

module top_module( 
    input [99:0] a, b,
    input cin,
    output [99:0] cout,
    output [99:0] sum );
    
    //先计算第0位
    adder u1(
        .a(a[0]),
        .b(b[0]),
        .cin(cin),
        .sum(sum[0]),
        .co(cout[0])
    );
    
    genvar i;
    generate
        for(i=1;i<100;i++)begin:in
            adder adder_inst(
                .a(a[i]),
                .b(b[i]),
                .cin(cout[i-1]),
                .co(cout[i]),
                .sum(sum[i])
            );
        end
    endgenerate
         

endmodule

module adder(
    input a,
    input b,
    input cin,
    
    output co,
    output sum
);
    
    assign {co,sum}=a+b+cin;
    
endmodule

看到一种简单写法

Problem 42 Generate for-loop: 100-bit binary adder 2
module top_module(
input [99:0] a, b,
input cin,
output [99:0] cout,
output [99:0] sum );
always @(*) begin
for (integer i = 0; i < 100; i++) begin
{cout[i], sum[i]} = a[i] + b[i] + ((i == 0)? cin : cout[i-1]);
end
end
endmodule

思路一样,用问号表达式

Bcdadd100

题目:为您提供了一个名为BCD_add的BCD一位加法器,该加法器将两个BCD数字相加并进位,然后产生和和和进位。
实例化100个bcd_fadd副本以创建一个100位bcd波纹进位加法器。您的加法器应该将两个100位BCD数字(打包为400位矢量)和一个进位相加,以产生100位的和和和进位。

code:

module top_module( 
    input [399:0] a, b,
    input cin,
    output cout,
    output [399:0] sum );
    
    bcd_fadd u1(
        .a(a[3:0]),
        .b(b[3:0]),
        .cin(cin),
        .cout(coutr[0]),
        .sum(sum[3:0])
    );
    wire[99:0]coutr;
  
    genvar i;
    generate
        for(i=1;i<100;i++)begin:a1
            bcd_fadd inst(
                .a(a[i*4+3:i*4]),
                .b(b[i*4+3:i*4]),
                .cin(coutr[i-1]),
                .cout(coutr[i]),
                .sum(sum[i*4+3:i*4])
            );
        end
    endgenerate
    assign cout=coutr[99];
endmodule

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值