发布时间:2022-10-26 文章分类:编程知识 投稿人:赵颖 字号: 默认 | | 超大 打印

Conditional

使用三目运算符可以实现一个数据选择器,可以替代if语句,不过:?可读性较差,复杂逻辑还是推荐用if。

注意这道题中间变量的定义,不定义中间变量表达式会变得十分复杂且可读性差。

module top_module (
    input [7:0] a, b, c, d,
    output [7:0] min);//
    // assign intermediate_result1 = compare? true: false;
    wire [7:0] min_1,min_2;
    assign min_1=a>b?b:a;
    assign min_2=min_1>c?c:min_1;
    assign min=min_2>d?d:min_2;
endmodule

Reduction

归约运算符,双目运算符直接用在多位变量前使用,可以实现归约操作。这里使用了一个异或的归约操作,实现了偶校验。

module top_module (
    input [7:0] in,
    output parity); 
    assign parity = ^in;
endmodule

Gates100

同样是使用一个归约运算符,实现100输入的与、或、异或运算。

module top_module(
    input [99:0] in,
    output out_and,
    output out_or,
    output out_xor 
);
    assign out_and=∈
    assign out_or=|in;
    assign out_xor=^in;
endmodule

Vector100r

按照提示用了一个for循环,for循环一般用于仿真,这里也可以用于反转位序。

答案用了一个$bits()系统函数,可以直接返回信号的位宽。

module top_module(
    input [99:0] in,
    output [99:0] out
);
    integer i=0;
    always@(*)
    begin
        for(i=0;i<100;i=i+1)
        begin
            out[i]=in[99-i];
        end
    end
endmodule

Popcount255

同样使用了一个for循环,也可以把in中每位的数加起来,就不用if判断了。

module top_module(
    input [254:0] in,
    output [7:0] out );
    reg [7:0] count;
    always@(*)
    begin
        count = 0;
        for(int i=0;i<$bits(in);i=i+1)
        begin
            if(in[i]==1'b1)
                count=count+1'b1;
        end
    end
    assign out=count;
endmodule

Adder100i

题目意思是使用例化数组或者generate语句,感觉这两种用法用的并不多,不过还是尝试写了一下。

直接for循环

module top_module(
    input [99:0] a, b,
    input cin,
    output [99:0] cout,
    output [99:0] sum );
    always@(*)
    begin
    for(int i=0;i<100;i=i+1)
        begin
            {cout[i],sum[i]}=a[i]+b[i]+((i==0)?cin:cout[i-1]);
        end
    end
endmodule

实例化数组

module top_module(
    input [99:0] a, b,
    input cin,
    output [99:0] cout,
    output [99:0] sum );
    add adder[99:0](
        .cin({cout[98:0],cin}),
        .a(a[99:0]),
        .b(b[99:0]),
        .sum(sum[99:0]),
        .cout(cout[99:0])
    );
endmodule
module add(
    input cin,
    input a,
    input b,
    output sum,
    output cout
);
    assign {cout,sum}=cin+a+b;
endmodule

generate for语句

module top_module(
    input [99:0] a, b,
    input cin,
    output [99:0] cout,
    output [99:0] sum );
    genvar i;
    generate
        for(i = 0;i<$bits(sum);i=i+1)
        begin:gen
                add adder(
                    .cin((i==0)?cin:cout[i-1]),
                    .a(a[i]),
                    .b(b[i]),
                    .sum(sum[i]),
                    .cout(cout[i])
    );
        end
    endgenerate
endmodule
module add(
    input cin,
    input a,
    input b,
    output sum,
    output cout
);
    assign {cout,sum}=cin+a+b;
endmodule

Bcdadd100

这道题同样也是用实例化数组或者generate for语句。

module top_module(
    input [399:0] a, b,
    input cin,
    output cout,
    output [399:0] sum );
    wire [98:0]c;
    bcd_fadd u_bcd_fadd[99:0](
        .a(a[399:0]),
        .b(b[399:0]),
        .cin({c[98:0],cin}),
        .cout({cout,c[98:0]}),
        .sum(sum[399:0])
    );
endmodule