题目1: Combinational for-loop: 255-bit population count
A "population count" circuit counts the number of '1's in an input vector. Build a population count circuit for a 255-bit input vector.
题目要求我们输出255位数据里有多少个1,我们知道在硬件里无论是什么数据都是以二进制的形式存在,要么0要么1,数1的个数直接对in的每一位进行相加,即一个for循环。
代码
module top_module(
input [254:0] in,
output [7:0] out );
reg [7:0]counter;
integer i;
always @(*)begin
counter=0;
for(i=0;i<255;i=i+1)begin
counter=counter+in[i];
end
out=counter;
end
endmodule
题目2:Adder100
Create a 100-bit binary adder. The adder adds two 100-bit numbers and a carry-in to produce a 100-bit sum and carry out.
分析:实现100位波纹加法器(级联,进位至于上一次有关),这在Verilog中需要使用到generate ...for进行实例化,实现代码的复用。
我们知道在加法器中,sum=a^b(a异或b),cout=a&b(这里是我临时推的,标准的忘记了),借助这个可以实现一位加法器,再进行实例化。
代码
module top_module(
input [99:0] a, b,
input cin,
output cout,
output [99:0] sum );
reg [99:0]c;//用于存储每次的进位
genvar i;
generate
add add_0(
.a(a[0]),
.b(b[0]),
.cin(cin),
.cout(c[0]),
.sum(sum[0])
);
for(i=1;i<100;i=i+1) begin:ADD_100
add add_i(
.a(a[i]),
.b(b[i]),
.cin(c[i-1]),
.cout(c[i]),
.sum(sum[i])
);
end
endgenerate
assign cout=c[99];
endmodule
module add(
input a, b, cin,
output cout, sum );
always @(*)begin
sum=a^b^cin;
cout=(a&b)|(a&cin)|(b&cin);
end
endmodule