导航菜单
首页 » 图解 » 正文

HDLBits学习笔记(37~43)

学习笔记(37~43)

学习阶段:有问题发大家一起讨论。

题目37

题目大意:给你四个数,用三目运算符找到最小值。

题目分析:三目运算符的嵌套使用。

答案:

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

题目38

题目大意:判断八位输入的奇偶校验,并输出。

题目分析:数据的奇偶校验可以通过按位异或实现。

答案:

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

题目39

题目大意:中构建一个具有 100 个输入的组合电路。

有3个输出:

:输入与门的输出。

: 输入或门的输出。

: 输入异或门的输出。

题目分析:语法按位运算使用。

答案:

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

题目40

题目大意:把100位的输入向量颠倒顺序。

题目分析:使用循环语句。的使用for,后需要加个标号,用于循环模块实例化(没有实例化也要写)。

答案:

module top_module( 
    input [99:0] in,
    output [99:0] out
);
    genvar i;
	generate
        for(i=0;i<100;i=i+1)begin:bit_order
            assign out[i] = in[99-i];
        end       
    endgenerate
endmodule

题目41

题目大意:数出输入向量中1的个数并输出。

题目分析:也是用循环解决使用--for结构。

答案:

module top_module( 
    input [254:0] in,
    output [7:0] out );
	integer i; //此处不能使用genvar,因为其无法在always中被赋值
    generate 
        always@(*)begin
            out = 8'b0;
            for(i=0;i<255;i=i+1)begin:pop
                if(in[i])
                    out = out + 1'b1;  //使用阻塞赋值,非阻塞赋值会生成latch,因为这是组合逻辑
                else
                    out = out ;
            end
        end
    endgenerate
endmodule

1、时序逻辑,使用 “非阻塞赋值”

2、锁存器(latch)建模,使用 “非阻塞赋值”

3、组合逻辑,使用 “阻塞赋值”

4、当在同一个 块里面既为组合逻辑又为时序逻辑时,使用“非阻塞赋值”

5、组合逻辑输出时,为消除毛刺会在输出端加一个触发器,即使用非阻塞赋值

题目42

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

题目分析:使用结构循环实例化。

答案:

module top_module( 
    input [99:0] a, b,
    input cin,
    output [99:0] cout,
    output [99:0] sum );
    
    fadd instance1(
        .a(a[0]),
        .b(b[0]),
        .cin(cin),
        .cout(cout[0]),
        .sum(sum[0])
            );    
	genvar i;
    generate 
        for(i=1;i<100;i=i+1)begin:add
            fadd instance2(
                .a(a[i]),
                .b(b[i]),
                .cin(cout[i-1]),
                .cout(cout[i]),
                .sum(sum[i])
            );
        end
    endgenerate
endmodule
module fadd(
	input wire a,b,cin,
    output wire cout,
    output wire sum
);
    assign sum = a^b^cin;
    assign cout = a&b | a&cin | b&cin;
        
endmodule

题目43

题目大意:我们为您提供了一个名为的BCD单位加法器,它将两个BCD数字相加并进行进位,然后生成一个求和并进行进位。实例化100份以创建100位bcd进位加法器。

题目分析:使用结构循环实例化。

答案:

module top_module( 
    input [399:0] a, b,
    input cin,
    output cout,
    output [399:0] sum );
    wire [99:0] cout1;
    bcd_fadd instance1(
        .a(a[3:0]),
        .b(b[3:0]),
        .cin(cin),
        .cout(cout1[0]),
        .sum(sum[3:0])
            );
	genvar i;
    generate
        for(i=1;i<100;i++)begin:bcd_add
            bcd_fadd instance2(
                .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
    endgenerate
    assign cout = cout1[99];
endmodule

评论(0)

二维码