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