HDLBits学习笔记(20~28)

HDLBits学习笔记(20~28)

学习阶段:有问题发873727286@qq.com大家一起讨论。

题目20 Module

题目大意:调用模块,对模块进行例化

题目分析:直接对题中模块实例化

答案:

module top_module ( input a, input b, output out );
	mod_a instance1 ( .out(out), .in1(a), .in2(b) );
endmodule

题目21 Module pos

题目分析:同上题,直接对模块进行实例化。(按顺序填)

答案:

module top_module ( 
    input a, 
    input b, 
    input c,
    input d,
    output out1,
    output out2
);
    mod_a instance1 (out1, out2, a, b, c, d );

endmodule

题目22 Module 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)
    );

endmodule

题目23 Module shift

题目大意:对所给模块完成三次实例化,以达到下图的效果
在这里插入图片描述
题目分析:定义两个wire变量来完成整个数据的传递。

答案:

module top_module ( input clk, input d, output q );
	wire q1,q2;
    my_dff instance1(
        .clk(clk),
        .d(d),
        .q(q1) 
    );
    my_dff instance2(
        .clk(clk),
        .d(q1),
        .q(q2) 
    );
    my_dff instance3(
        .clk(clk),
        .d(q2),
        .q(q) 
    );
endmodule

题目24 Module shift8

题目大意:通过实例化三个题目所给的八位位移寄存器,最后在通过一个数据选择器,来获得下图的输出。
在这里插入图片描述
题目分析:主要是实例化,和数据选择器的逻辑设计。按图编程易得。

答案:

module top_module ( 
    input clk, 
    input [7:0] d, 
    input [1:0] sel, 
    output [7:0] q 
);
    reg	[7:0] q1,q2,q3;
    
    my_dff8 instance1(
        .clk(clk),
        .d(d),
        .q(q1)
    );
    my_dff8 instance2(
        .clk(clk),
        .d(q1),
        .q(q2)
    );
    my_dff8 instance3(
        .clk(clk),
        .d(q2),
        .q(q3)
    );
    always@(*) begin
        if(sel == 2'd00)
            q <= d;
        else if(sel == 2'd1)
            q <= q1;
        else if(sel == 2'd2)
            q <= q2;
        else if(sel == 2'd3)
            q <= q3;
    end
endmodule

题目25 Module add

题目大意:通过题目所给的16位加法器实现一个32位加法器。
在这里插入图片描述
题目分析:直接按图来

答案:

module top_module(
    input [31:0] a,
    input [31:0] b,
    output [31:0] sum
);
    wire [15:0] sum_low,sum_high;
    wire cout1,cout2;
    add16 instance1(
        .cin(1'b0),
        .a(a[15:0]),
        .b(b[15:0]),
        .sum(sum_low),
        .cout(cout1)
    );
    add16 instance2(
        .cin(cout1),
        .a(a[31:16]),
        .b(b[31:16]),
        .sum(sum_high),
        .cout(cout2)
    );
    assign sum = {sum_high,sum_low};
endmodule

题目26 Module fadd

题目大意:此题相对于上题,基本相同,只是需要写出一位全加器的代码。

题目分析:可以通过两种方式实现一位全加器。
第一种是通过编程的思想:

module add1 ( input a, input b, input cin,   output sum, output cout );
    assign {cout,sum} = a+b+cin;
endmodule

第二种是通过数电的思想:

module add1 ( input a, input b, input cin,   output sum, output cout );
    assign sum = a^b^cin;
    assign cout = cin&(a^b)||(a&b);
endmodule

答案:

module top_module (
    input [31:0] a,
    input [31:0] b,
    output [31:0] sum
);//
    wire [15:0] sum_low,sum_high;
    wire cout1,cout2;
    add16 instance1(
        .cin(1'b0),
        .a(a[15:0]),
        .b(b[15:0]),
        .sum(sum_low),
        .cout(cout1)
    );
    add16 instance2(
        .cin(cout1),
        .a(a[31:16]),
        .b(b[31:16]),
        .sum(sum_high),
        .cout(cout2)
    );
    assign sum = {sum_high,sum_low};
endmodule

module add1 ( input a, input b, input cin,   output sum, output cout );
    assign {cout,sum} = a+b+cin;
endmodule

题目27 Module cseladd

题目大意:此题与前面加法器差不多,区别在于,这次是通过低十六位是否进位来判断选择高十六位的加法器。
在这里插入图片描述

题目分析:也是按图直接来。

答案:

module top_module(
    input [31:0] a,
    input [31:0] b,
    output [31:0] sum
);
    wire [15:0]	sum1,sum2,sum3;
    wire cout1,cout2;
    assign sum = (cout1)?({sum3,sum1}):({sum2,sum1});   
    add16 instance1(
        .a(a[15:0]),
        .b(b[15:0]),
        .cin(1'b0),
        .cout(cout1),
        .sum(sum1)
    );
    add16 instance2(
        .a(a[31:16]),
        .b(b[31:16]),
        .cin(1'b0),
        .cout(cout2),
        .sum(sum2)     
    );
    add16 instance3(
        .a(a[31:16]),
        .b(b[31:16]),
        .cin(1'b1),
        .cout(cout2),
        .sum(sum3)     
    );
endmodule

题目28 Module addsub

题目大意:制作一个加减法器,通过输入sub的不同,对输入值b进行处理,来达到加减法的操作。如下图。
在这里插入图片描述

题目分析:通过对sub的值进行判断,来决定是否对b的值进行异或操作。也是按图操作。

答案:

module top_module(
    input [31:0] a,
    input [31:0] b,
    input sub,
    output [31:0] sum
);
    wire [15:0]	sum1,sum2,inb1,inb2;
    wire cout1,cout2;
    assign inb1 = (sub)?(b[15:0]^16'b1111_1111_1111_1111):(b[15:0]);
    assign inb2 = (sub)?(b[31:16]^16'b1111_1111_1111_1111):(b[31:16]);
    assign sum = {sum2,sum1};   
    add16 instance1(
        .a(a[15:0]),
        .b(inb1),
        .cin(sub),
        .cout(cout1),
        .sum(sum1)
    );
    add16 instance2(
        .a(a[31:16]),
        .b(inb2),
        .cin(cout1),
        .cout(cout2),
        .sum(sum2)     
    );
endmodule
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值