HDLbits day4

5、More Verilog Features

5.1、conditional ternary operator

给定四个无符号数,求最小值。无符号数可以与标准比较运算符(a < b)进行比较。使用条件运算符制作两路最小电路,然后将其中的一些组成一个四路最小电路。您可能需要一些线向量作为中间结果。

module top_module (
    input [7:0] a, b, c, d,
    output [7:0] min);//

    // assign intermediate_result1 = compare? true: false;
    wire [7:0] w1,w2;
    assign w1=(a<b)?a:b;
    assign w2=(c<d)?c:d;
    assign min=(w1<w2)?w1:w2;

endmodule

5.2、Reduction operators

创建一个电路,计算 8 位字节的奇偶校验位(这将向字节添加第 9 位)。我们将使用“偶数”奇偶校验,其中奇偶校验位只是所有 8 个数据位的 XOR。

归约运算符可以对向量的位进行 AND、OR 和 XOR,产生一位输出:

& a[3:0] // 与:a[3]&a[2]&a[1]&a[0]
| b[3:0] // 或:b[3]|b[2]|b[1]|b[0]
^ c[2:0] // 异或:c[2]^c[1]^c[0]

 

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

endmodule

 

5.3、Reduction :Even wider gates

Build a combinational circuit with 100 inputs, in[99:0].

There are 3 outputs:

  • out_and: output of a 100-input AND gate.
  • out_or: output of a 100-input OR gate.
  • out_xor: output of a 100-input XOR gate.
module top_module( 
    input [99:0] in,
    output [99:0] out
);
    
    genvar i;
    generate
        for(i=0;i<=99;i=i+1)
            begin:invert100
                assign out[i]=in[99-i];
            end
    endgenerate

endmodule

5.4、Combinational for-loop:Vector reversal2

给定一个 100 位输入向量 [99:0],反转其位顺序。

module top_module( 
    input [99:0] in,
    output [99:0] out
);
    //这里用的是genegrate_for语法
    genvar i;
    generate
        for(i=0;i<=99;i=i+1)
            begin:invert100
                assign out[i]=in[99-i];
            end
    endgenerate

endmodule
module top_module( 
    input [99:0] in,
    output [99:0] out
);
   //这里用的是for语法 
    integer i;
    always@(*)
        for(i=0;i<=99;i=i+1)
            begin
                out[i]=in[99-i];
            end
    

endmodule

5.5、Combinational for-loop:255-bit population count

“人口计数”电路计算输入向量中“1”的数量。为 255 位输入向量构建人口计数电路。

module top_module( 
    input [254:0] in,
    output [7:0] out );
    
    integer i;
    always@(*)
        begin
            out=8'b0000_0000;  //out必须赋初值
            for(i=0;i<255;i=i+1)
                if(in[i]==1'b1)
                    out=out+8'b0000_0001;
                else
                    out=out+8'b0000_0000;
        end
endmodule

5.6、Generate for-loop:100-bit binary adder 2

通过实例化 100 个全加器来创建一个 100 位二进制波纹进位加法器。加法器将两个 100 位数字和一个进位相加,产生一个 100 位和并执行。为了鼓励您实际实例化全加器,还要输出纹波进位加法器中每个全加器的进位。cout[99] 是最后一个全加器的最终进位,也是您通常看到的进位。

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<=99;i=i+1)
            begin:add100
                if(i==1'b0)
                    assign {cout[0],sum[0]} = a[0]+b[0]+cin;
                else
                    assign {cout[i],sum[i]} = a[i]+b[i]+cout[i-1];
            end
    endgenerate

endmodule

5.7、Generate for-loop:100-digit BCD adder

为您提供了一个名为bcd_fadd的 BCD 一位加法器,该加法器将两个 BCD 数字和进位相加,并产生一个和和进位。实例化 100 个bcd_fadd副本以创建一个 100 位 BCD 波纹进位加法器。您的加法器应将两个 100 位 BCD 数字(打包成 400 位向量)和一个进位相加,以产生一个 100 位和并执行。

module top_module( 
    input [399:0] a, b,
    input cin,
    output cout,
    output [399:0] sum );
    
    wire w[99:0];   //这是一个很好的例子,这里的w可以定义成一个100位宽的变量,这是一个向量;也可以定义成100个一位宽的变量,这是一维数组
    genvar i;
    generate
        for(i=0;i<100;i=i+1)
            begin:bcd_add
                if(i==1'b0)
                    bcd_fadd U0(a[3:0],b[3:0],cin,w[0],sum[3:0]);
                else
                    bcd_fadd Ui(a[3+4*i:4*i],b[3+4*i:4*i],w[i-1],w[i],sum[3+4*i:4*i]);
            end
    endgenerate
    
    assign cout = w[99];

endmodule

 

posted @ 2022-04-07 21:07  super_sweet  阅读(56)  评论(0编辑  收藏  举报