HDLBits学习(三)*
Gates100
Vector100r
题目:给了一个长度是100的向量,请把它翻转输出一下
code:
module top_module(
input [99:0] in,
output [99:0] out
);
genvar i;
generate
for(i=0;i<99;i++)begin:a2
always @(*)begin
out[i]=in[99-i];
end
end
endgenerate
endmodule
用always for
always@(*)begin
for (int i=0;i<=99;i=i+1)begin
out[i]=in[99-i];
end
end
Popcount255
题目: 设计电路来计算输入矢量中 ’1‘ 的个数,题目要求建立一个255bit输入的矢量来判断输入中 ’1‘ 的个数。
code:
integer i;
always @(*)begin
out=8'd0; //要初始化0,不然仿真有问题
for(i=0;i<255;i++)begin
if(in[i]==1'b1)begin //在generate for循环中,变量不能当做条件
out=out+1'b1;
end else begin
out=out;
end
end
end
另一种思路:
有多少个1就是把所有的1相加:
assign out = in[0]+in[1]+...+in[254];
Adder100i
题目:通过实例化100个全加器来实现一个100bit的二进制加法器。该加法器有两个100bit的输入和cin,输出为sum与cout。为了鼓励大家使用实例化来完成电路设计,我们同时需要输出每个全加器的cout。 故cout[99]标志着全加器的最终进位。
code:
module top_module(
input [99:0] a, b,
input cin,
output [99:0] cout,
output [99:0] sum );
//先计算第0位
adder u1(
.a(a[0]),
.b(b[0]),
.cin(cin),
.sum(sum[0]),
.co(cout[0])
);
genvar i;
generate
for(i=1;i<100;i++)begin:in
adder adder_inst(
.a(a[i]),
.b(b[i]),
.cin(cout[i-1]),
.co(cout[i]),
.sum(sum[i])
);
end
endgenerate
endmodule
module adder(
input a,
input b,
input cin,
output co,
output sum
);
assign {co,sum}=a+b+cin;
endmodule
看到一种简单写法
Problem 42 Generate for-loop: 100-bit binary adder 2
module top_module(
input [99:0] a, b,
input cin,
output [99:0] cout,
output [99:0] sum );
always @(*) begin
for (integer i = 0; i < 100; i++) begin
{cout[i], sum[i]} = a[i] + b[i] + ((i == 0)? cin : cout[i-1]);
end
end
endmodule
思路一样,用问号表达式
Bcdadd100
题目:为您提供了一个名为BCD_add的BCD一位加法器,该加法器将两个BCD数字相加并进位,然后产生和和和进位。
实例化100个bcd_fadd副本以创建一个100位bcd波纹进位加法器。您的加法器应该将两个100位BCD数字(打包为400位矢量)和一个进位相加,以产生100位的和和和进位。
code:
module top_module(
input [399:0] a, b,
input cin,
output cout,
output [399:0] sum );
bcd_fadd u1(
.a(a[3:0]),
.b(b[3:0]),
.cin(cin),
.cout(coutr[0]),
.sum(sum[3:0])
);
wire[99:0]coutr;
genvar i;
generate
for(i=1;i<100;i++)begin:a1
bcd_fadd inst(
.a(a[i*4+3:i*4]),
.b(b[i*4+3:i*4]),
.cin(coutr[i-1]),
.cout(coutr[i]),
.sum(sum[i*4+3:i*4])
);
end
endgenerate
assign cout=coutr[99];
endmodule