1.Conditional
给定四个无符号数字,找到最小值,无符号数字可以与标准比较运算符(a < b)进行比较。
module top_module (
input [7:0] a, b, c, d,
output [7:0] min);
wire [7:0] w1,w2;
assign w1 = (a<b) ? a : b;
assign w2 = (c<d)? c : d;
assign min = (w1<w2) ? w1 : w2;
endmodule
2.Reduction
奇偶校验通常用作通过不完美通道传输数据时检测错误的简单方法,创建一个电路,该电路将计算8位字节的奇偶校验位(这将向该字节添加第9位)。我们将使用“偶数”奇偶校验,其中奇偶校验位只是所有8个数据位的 XOR。
module top_module (
input [7:0] in,
output parity);
//xor(输出,输入1,输入2,……)
xor ( parity , in[0] , in[1] , in[2] , in[3] , in[4] , in[5] , in[6] , in[7] );
endmodule
3.Gates100
构建一个具有100个输入的组合电路,在[99:0]中。
module top_module(
input [99:0] in,
output out_and,
output out_or,
output out_xor
);
assign out_and = & in[99:0];
assign out_or = | in[99:0];
assign out_xor = ^ in[99:0];
endmodule
4.Vector100r
给定一个100位输入向量[99:0],反转其位顺序。
module top_module(
input [99:0] in,
output [99:0] out
);
int i ;
always @ (*) begin
for ( i = 0 ; i <= 99 ; i = i + 1)
out [i] = in [99 - i];
end
endmodule
5.Popcount255
“总体计数”电路对输入向量中的“1”数进行计数。为255位输入向量构建一个人口计数电路。
module top_module(
input [254:0] in,
output [7:0] out );
int i;
always @(*) begin
out = 0;
for(i=0;i<255;i=i+1)
begin
if(in[i]==1) begin
out = out + 1;
end
else begin
out = out;
end
end
end
endmodule
6.Adder100i
通过实例化100个完整加法器来创建100位二进制纹波进位加法器。加法器将两个100位数字和一个进位相加,以产生100位和并执行。为了鼓励您实际实例化全加器,还要在纹波进位加法器中输出每个全加器的带出。cout[99]是最后一个完整加法器的最终结转,也是您通常看到的外转。
module top_module(
input [99:0] a, b,
input cin,
output [99:0] cout,
output [99:0] sum );
assign sum[0] = a[0] ^ b[0] ^ cin;
assign cout[0] = a[0] & b[0] | (cin & (a[0]|b[0]));
int i;
always @(*) begin
for(i=1;i<=99;i=i+1) begin
sum[i] = a[i] ^ b[i] ^ cout[i-1];
cout[i] = a[i] & b[i] | (cout[i-1] & (a[i]|b[i]));
end
end
endmodule
7.Bcdadd100
实例化100个副本bcd_fadd以创建100位BCD 纹波进位加法器。您的加法器应添加两个100位BCD 数字(打包到400位向量中)和一个携带,以生成100位的总和并执行。
module top_module(
input [399:0] a, b,
input cin,
output cout,
output [399:0] sum );
//generate是对parameter,module,assign,always等进行复制的操作,同时在内可以用genvar进行正整数的定义,供给循环使用,同时主要有三种类型
//(1)generate_for
//(2)generate_if
//(3)generate_case
//用generate对模块进行复制
//必须使用genvar申明一个循环变量; begin 后需要加标签(即复制的部分的标签);必须在begin end里进行循环、复制。
wire [399:0] c;
bcd_fadd u_fadd(a[3:0],b[3:0],cin,c[0],sum[3:0]);
generate
genvar i;
for(i = 1; i<=99;i++)begin : bcd
bcd_fadd u_fadd(a[(4*(i+1)-1):(4*(i))],b[(4*(i+1)-1):(4*(i))],c[i-1],c[i],sum[(4*(i+1)-1):(4*(i))]);
end
endgenerate
assign cout = c[99];
endmodule