我是靠谱客的博主 傲娇哈密瓜,这篇文章主要介绍HDLBits 答案汇总(持续更新)Vectors Vectors in more detals​Vector part selectBitewise operatorsfour input gatesVector concatenation operationsReplication operatorsMore replication ModuleThree modulesModules and vectorsAdd1Adder 2Carry-select adder(Module csela,现在分享给大家,希望可以做个参考。


目录

Vectors

 Vectors in more detals​​

Vector part select

Bitewise operators

four input gates

Vector concatenation operations

Replication operators

More replication

 Module

Three modules

Modules and vectors

Add1

Adder 2

Carry-select adder(Module cseladd)

Adder subtractor(Module addsub)



Vectors

 

 Vectors in more detals

Vector part select

hint:  赋值的左右两侧都可以对矢量进行部分选择。

Bitewise operators

Hint:

按位布尔运算符:&,|,^,~

逻辑布尔运算符:&&,||,!

four input gates

hint: 矢量的按位布尔运算在矢量前加上布尔运算符即可。

Vector concatenation operations

Hint: 位宽必须进行标注,11必须标为  2'd11,才可以。

分号;必须是英文状态下的,而不是;中文状态下的。

module top_module (
    input [4:0] a, b, c, d, e, f,
    output [7:0] w, x, y, z );


    assign {w[7:0]} = {a[4:0], b[4:2]};
    assign {x[7:0]} = {b[1:0], c[4:0], d[4]};
    assign {y[7:0]} = {d[3:0], e[4:1]};
    assign {z[7:0]} = {e[0], f[4:0], 2'b11};

//second way

//assign {w, x, y, z} = {a, b, c, d, e, f, 2'b11};

endmodule

Replication operators

Hint: sign bit 符号位进行扩展保留,其他位保持不变即可。

module top_module (
    input [7:0] in,
    output [31:0] out );
    
    assign out = {{24{in[7]}}, in [7:0]};

//second way

//assign out = {{24{in[7]}}, in};

endmodule

More replication

hint:结合矢量的按位布尔运算,连接符{},复制操作,3种操作复合。

module top_module (
    input a, b, c, d, e,
    output [24:0] out );
    
    assign out = ~{{5{a}},{5{b}},{5{c}},{5{d}},{5{e}}} ^ {5{a,b,c,,d,e}};

endmodule

 Module

hint:

module top_module ( input a, input b, output out );
    
    mod_a instance1 (a, b, out);   //根据mod_a模块的输入输出声明(需要提前声明,题中给了)从左向右对应来写top_module的输入输出口。

//second way

//mod_a instance1 (.in1(a), .in2(b), .out(out));

endmodule

Connecting ports by name

module top_module (
    input a,
    input b,
    input c,
    input d,
    output out1,
    output out2
);
    
    mod_a instance1 (.out1(out1), .out2(out2), .in1(a), .in2(b), .in3(c), .in4(d));//括号外是实例化模块的接口,括号内是外界的接口

//second way

//mod_a(.out1(out1), .out2(out2), .in1(a), .in2(b), .in3(c), .in4(d));

//mod_a不进行命名也可以,不要忘了英文的句号.   而不是中文的

endmodule

Three modules

solution 1

module top_module ( input clk, input d, output q );
    
    wire w1;
    wire w2;
    my_dff dff1(clk,d,w1);//括号内都是实例化模块之外的接口,实例化模块的接口顺序已经定义

                                       //好,一一对应即可。
    my_dff dff2(clk,w1,w2);
    my_dff dff3(clk,w2,q);

endmodule

solution 2:

module top_module (
    input clk,
    input d,
    output q
);

    wire a, b;    // Create two wires. I called them a and b.

    // Create three instances of my_dff, with three different instance names (d1, d2, and d3).
    // Connect ports by position: ( input clk, input d, output q)
    my_dff d1 ( clk, d, a );
    my_dff d2 ( clk, a, b );
    my_dff d3 ( clk, b, q );

endmodule

Modules and vectors

solution:

module top_module (
    input clk,
    input [7:0] d,
    input [1:0] sel,
    output [7:0] q
);
    wire [7:0] w1;
    wire [7:0] w2;
    wire [7:0] w3;
    
    my_dff8 d1(clk,d,w1);
    my_dff8 d2(clk,w1,w2);
    my_dff8 d3(clk,w2,w3);
    
    always @(*) begin
        case(sel)
            2'b00:
                q=d;
            2'b01:
                q=w1;                
            2'b10:
                q=w2;                
            2'b11:
                q=w3;                
        endcase
    end

endmodule

Add1

solution 1

module top_module(
    input [31:0] a,
    input [31:0] b,
    output [31:0] sum
);
    wire w1;
    
    add16 add1(a[15:0],b[15:0],1'b0,sum[15:0],w1);//注意是a[15:0],而不是[15:0] a。
    add16 add2(a[31:16],b[31:16],w1,sum[31:16], );//不连接的接口直接空下就行,其前面的,可

                                                                                //以不加。

endmodule

solution 2

module top_module(
    input [31:0] a,
    input [31:0] b,
    output [31:0] sum
);
    wire w1;
    
    add16 add1(
        .a(a[15:0]),
        .b(b[15:0]),
        .cin(1'b0),
        .sum(sum[15:0]),
        .cout(w1)
        );
    add16 add2(
        .a(a[31:16]),
        .b(b[31:16]),
        .cin(w1),
        .sum(sum[31:16]),
        .cout( )
    );

endmodule

solution 3

module top_module(
    input [31:0] a,
    input [31:0] b,
    output [31:0] sum
);
    
    wire w1,w2;
    wire [15:0] low_out;
    wire [15:0] high_out;
    
    add16 add1(a[15:0],b[15:0],0,low_out,w1);//这个地方的0,可以直接写0,或者写成1'b0
    add16 add2(a[31:16],b[31:16],w1,high_out,w2);
    
    assign sum = {high_out, low_out};
   

endmodule

solution 4

将solution3中改为按名称连接即可。

Adder 2

module top_module (
    input [31:0] a,
    input [31:0] b,
    output [31:0] sum
);
    wire w1;//分号;必须使用英文状态下的,不然可能会在其他地方报错
    
    add16 block1 (a[15:0],b[15:0],1'b0,sum[15:0],w1);
    add16 block2 (a[31:16],b[31:16],w1,sum[31:16]);  

endmodule

module add1 ( input a, input b, input cin,   output sum, output cout );
    assign {cout,sum} = a + b + cin;//不需要再定义a,b,c等,在add16中已经对应过了,只需要对sum和cout定义即可,可以参考向量的拼接内容

endmodule

Carry-select adder(Module cseladd)

提前加法进位器,用资源换速度

将第二个16位加法器多复制出来一个,分别进行进位为0和1的计算,再由第一个加法器的cout端来通过一个2选1多路复用器来判断用第二个加法器的那个计算结果来输出。这样的好处是第一片16位加法器和两个第二片加法器是同时进行计算的,提高运行速度。

 solution1

按位置

module top_module(
    input [31:0] a,
    input [31:0] b,
    output [31:0] sum
);
    wire [15:0] highout0;
    wire [15:0] highout1;
    wire cout;
    
    add16 low(a[15:0],b[15:0],0,sum[15:0],cout);
    add16 high0(a[31:16],b[31:16],0,highout0);
    add16 high1(a[31:16],b[31:16],1,highout1);
    
    assign sum[31:16]=cout? highout1:highout0;//数据选择器的描述

endmodule

solution 2

按名称

module top_module(
    input [31:0] a,
    input [31:0] b,
    output [31:0] sum
);
    
    wire cout_out;
    wire [15:0] high0;
    wire [15:0] high1;//在声明线网时,必须进行位宽的设置,否则默认为 1 bit
    
    add16 low(
        .a(a[15:0]),
        .b(b[15:0]),
        .cin(1'b0),
        .sum(sum[15:0]),
        .cout(cout_out )
    );
    add16 high_out0(
        .a(a[31:16]),
        .b(b[31:16]),
        .cin(1'b0),
        .sum(high0),
        .cout( )       //没有用的管脚可以直接不声明
    );
    add16 high_out1(
        .a(a[31:16]),
        .b(b[31:16]),
        .cin(1'b1),
        .sum(high1),
        .out( )
    );
    
    assign sum[31:16] = cout_out?high1:high0;//注意high1和high0之间用的:连接

endmodule

Adder subtractor(Module addsub)

题目:

关键点:“Use a 32-bit wide XOR gate to invert the b input whenever sub is 1”,如何用verilog实现?

由于XOR没有逻辑布尔运算符,只有按位布尔运算符 ^ ,也就是说32位input b和32位sub信号XOR之后,只能进行按2输入布尔逻辑运算进行32次运算,xor的2输入布尔运算法则为输入取值相异,输出为1,取值相同,输出为0

则当sub信号为1时,进行重复操作{32{sub}}得到32位信号,与b按位xor,即b ^ {32{sub}},正好可以将b逐位取反,而加1则由cin与sub信号相连决定;

当sub信号为0时,与b按位xor后,input b不变。

 solution1  按位置

module top_module(
    input [31:0] a,
    input [31:0] b,
    input sub,
    output [31:0] sum
);
    wire [31:0] b_out;
    wire cout_out;
    
    assign b_out = b ^ {32{sub}};
    
    add16 low(a[15:0],b_out[15:0],sub,sum[15:0],cout_out);
    add16 high(a[31:16],b_out[31:16],cout_out,sum[31:16]);

endmodule

solution2 按名称

module top_module(
    input [31:0] a,
    input [31:0] b,
    input sub,
    output [31:0] sum
);
    wire [31:0] b_out;//将b_out直接声明为32bit数据,在下面时可以用[31:16],[15:0]区别
    wire cout_out;
    
    assign b_out = b ^ {32{sub}};
    
    add16 low(
        .a(a[15:0]),
        .b(b_out[15:0]),
        .cin(sub),
        .sum(sum[15:0]),
        .cout(cout_out)
    );
    add16 high(
        .a(a[31:16]),
        .b(b_out[31:16]),
        .cin(cout_out),
        .sum(sum[31:16])
    );

endmodule

最后

以上就是傲娇哈密瓜最近收集整理的关于HDLBits 答案汇总(持续更新)Vectors Vectors in more detals​Vector part selectBitewise operatorsfour input gatesVector concatenation operationsReplication operatorsMore replication ModuleThree modulesModules and vectorsAdd1Adder 2Carry-select adder(Module csela的全部内容,更多相关HDLBits内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(111)

评论列表共有 0 条评论

立即
投稿
返回
顶部