HDLBits练习---More Verilog Features

1.Conditional

给定四个无符号数字,找到最小值,无符号数字可以与标准比较运算符(a < b)进行比较。

module top_module (
    input [7:0] a, b, c, d,
    output [7:0] min);
    
    wire [7:0] w1,w2;
    assign w1 = (a<b) ? a : b;
    assign w2 = (c<d)? c : d;
    assign min = (w1<w2) ? w1 : w2;
    
endmodule

2.Reduction

奇偶校验通常用作通过不完美通道传输数据时检测错误的简单方法,创建一个电路,该电路将计算8位字节的奇偶校验位(这将向该字节添加第9位)。我们将使用“偶数”奇偶校验,其中奇偶校验位只是所有8个数据位的 XOR。

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

    //xor(输出,输入1,输入2,……)
    xor ( parity , in[0] , in[1] , in[2] , in[3] , in[4] , in[5] , in[6] , in[7] );
    
endmodule

3.Gates100

构建一个具有100个输入的组合电路,在[99:0]中。

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

endmodule

4.Vector100r

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

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

endmodule

5.Popcount255

“总体计数”电路对输入向量中的“1”数进行计数。为255位输入向量构建一个人口计数电路。

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

    int i;
    always @(*) begin
        out = 0;
        for(i=0;i<255;i=i+1)
            begin
                if(in[i]==1) begin
                   out = out + 1; 
                end
                    else begin
                        out = out;
                    end
            end
    end
    
endmodule

6.Adder100i

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

module top_module( 
    input [99:0] a, b,
    input cin,
    output [99:0] cout,
    output [99:0] sum );

    assign sum[0]  = a[0] ^ b[0] ^ cin;
    assign cout[0] = a[0] & b[0] | (cin & (a[0]|b[0])); 
    int i;
    always @(*) begin
        for(i=1;i<=99;i=i+1) begin
            sum[i]  = a[i] ^ b[i] ^ cout[i-1];
            cout[i] = a[i] & b[i] | (cout[i-1] & (a[i]|b[i]));
        end
    end
    
endmodule

7.Bcdadd100

实例化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 );

    //generate是对parameter,module,assign,always等进行复制的操作,同时在内可以用genvar进行正整数的定义,供给循环使用,同时主要有三种类型
    //(1)generate_for
    //(2)generate_if
    //(3)generate_case
    //用generate对模块进行复制
    //必须使用genvar申明一个循环变量; begin 后需要加标签(即复制的部分的标签);必须在begin end里进行循环、复制。
    wire [399:0] c;
    bcd_fadd u_fadd(a[3:0],b[3:0],cin,c[0],sum[3:0]);
    generate
        genvar i;
        for(i = 1; i<=99;i++)begin : bcd 
            bcd_fadd u_fadd(a[(4*(i+1)-1):(4*(i))],b[(4*(i+1)-1):(4*(i))],c[i-1],c[i],sum[(4*(i+1)-1):(4*(i))]);
        end
    endgenerate
    assign cout = c[99];
    
endmodule

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值