hdlbites练习6

6.1Conditional

给定四个无符号数字,找到最小值。无符号数字可以与标准比较运算符(a < b)进行比较。使用条件运算符制作双向最小电路,然后组合其中的几个以创建 4 路最小电路。您可能需要一些用于中间结果的线向量。

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

    // assign intermediate_result1 = compare? true: false;
	
    wire [7:0]num1;
    wire [7:0]num2;
          
    assign num1 = (a<b)?a:b;
    assign num2 = (c<d)?c:d;
    assign min = (num1<num2)?num1:num2;
    
endmodule

6.2Reduction

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

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

6.3Gates100

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

有 3 个输出:

out_and:100输入AND门的输出。
out_or:100输入OR门的输出。
out_xor:100输入异或门的输出。

module top_module( 
    input [99:0] in,
    output out_and,
    output out_or,
    output out_xor 
);

    assign out_and = &in;
    assign out_or = |in;
    assign out_xor = ^in;
    
endmodule

6.4Vector100r

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

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

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

6.5Popcount255

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

module top_module( 
    input [254:0] in,
    output [7:0] out );
	
    reg [7:0]cnt;
    integer i;
    always@*
        begin
            cnt = 8'b0;
            for(i=0;i<=254;i=i+1)
                begin
                    cnt =(in[i])?cnt+1'b1:cnt+1'b0; 
                end
        end
    assign out = cnt;
endmodule

6.6Adder100i

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

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

    integer i;
    always@*
        begin
            for(i=0;i<=99;i=i+1)
                begin
                    if(i==0)
                        begin
                            {cout[i],sum[i]} =  a[i]+b[i]+cin;
                        end
                    else
                        begin
                            {cout[i],sum[i]} =  a[i]+b[i]+cout[i-1];
                        end
                end
        end
endmodule

也可以用generate语句实现

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

    genvar i;//定义genvar,作为generate种的循环变量。
    generate
        for( i = 0 ; i < 100; i = i + 1 )
            begin:adder//generate语句中定义的for语句,必须要有begin,
                	   //begin必须要有名称,也就是必须要有标签,因为标签会作为generate循环的实例名称。
                if(i==0)
                   	begin
                        assign {cout[i],sum[i]} = a[i] + b[i] + cin;
                	end
                else
                    begin
                        assign {cout[i],sum[i]} = a[i] + b[i] + cout[i-1];
                    end  
            end
    endgenerate
endmodule

6.7Bcdadd100

您将获得一个名为 bcd_fadd 的 BCD 一位数加法器,该加法器将两个 BCD 数字相加并结转,并生成总和和结转。

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

实例化 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 [99:0]cout1;
    genvar i;
	generate
        for( i = 0 ; i < 100; i = i + 1 )
            begin:adder
                if(i==0)
                    bcd_fadd U0( .a(a[3:0]), .b(b[3:0]), .cin(cin), .cout(cout1[0]), .sum(sum[3:0]));
                else
                    bcd_fadd U1( .a(a[4*i+3:4*i]), .b(b[4*i+3:4*i]), .cin(cout1[i-1]), .cout(cout1[i]), .sum(sum[4*i+3:4*i]));
            end
    assign cout = cout1[99];
	endgenerate
endmodule

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值