6.1Conditional
给定四个无符号数字,找到最小值。无符号数字可以与标准比较运算符(a < b)进行比较。使用条件运算符制作双向最小电路,然后组合其中的几个以创建 4 路最小电路。您可能需要一些用于中间结果的线向量。
module top_module (
input [7:0] a, b, c, d,
output [7:0] min);//
// assign intermediate_result1 = compare? true: false;
wire [7:0]num1;
wire [7:0]num2;
assign num1 = (a<b)?a:b;
assign num2 = (c<d)?c:d;
assign min = (num1<num2)?num1:num2;
endmodule
6.2Reduction
奇偶校验通常用作通过不完美通道传输数据时检测错误的简单方法。创建一个电路,该电路将计算 8 位字节的奇偶校验位(这将向该字节添加第 9 位)。我们将使用“偶数”奇偶校验,其中奇偶校验位只是所有 8 个数据位的 XOR。
module top_module (
input [7:0] in,
output parity);
assign parity = ^in;
endmodule
6.3Gates100
构建一个具有 100 个输入的组合电路,在 [99:0] 中。
有 3 个输出:
out_and:100输入AND门的输出。
out_or:100输入OR门的输出。
out_xor:100输入异或门的输出。
module top_module(
input [99:0] in,
output out_and,
output out_or,
output out_xor
);
assign out_and = ∈
assign out_or = |in;
assign out_xor = ^in;
endmodule
6.4Vector100r
给定一个 100 位输入向量 [99:0],反转其位顺序。
module top_module(
input [99:0] in,
output [99:0] out
);
integer i;
always@*
begin
for(i=0;i<=99;i=i+1)
begin
out[i] = in[99-i];
end
end
endmodule
6.5Popcount255
“总体计数”电路对输入向量中的“1”数进行计数。为255位输入向量构建一个人口计数电路。
module top_module(
input [254:0] in,
output [7:0] out );
reg [7:0]cnt;
integer i;
always@*
begin
cnt = 8'b0;
for(i=0;i<=254;i=i+1)
begin
cnt =(in[i])?cnt+1'b1:cnt+1'b0;
end
end
assign out = cnt;
endmodule
6.6Adder100i
通过实例化 100 个完整加法器来创建 100 位二进制纹波进位加法器。加法器将两个 100 位数字和一个进位相加,以产生 100 位和并执行。为了鼓励您实际实例化全加器,还要在纹波进位加法器中输出每个全加器的带出。cout[99] 是最后一个完整加法器的最终结转,也是您通常看到的外转。
module top_module(
input [99:0] a, b,
input cin,
output [99:0] cout,
output [99:0] sum );
integer i;
always@*
begin
for(i=0;i<=99;i=i+1)
begin
if(i==0)
begin
{cout[i],sum[i]} = a[i]+b[i]+cin;
end
else
begin
{cout[i],sum[i]} = a[i]+b[i]+cout[i-1];
end
end
end
endmodule
也可以用generate语句实现
module top_module(
input [99:0] a, b,
input cin,
output [99:0] cout,
output [99:0] sum );
genvar i;//定义genvar,作为generate种的循环变量。
generate
for( i = 0 ; i < 100; i = i + 1 )
begin:adder//generate语句中定义的for语句,必须要有begin,
//begin必须要有名称,也就是必须要有标签,因为标签会作为generate循环的实例名称。
if(i==0)
begin
assign {cout[i],sum[i]} = a[i] + b[i] + cin;
end
else
begin
assign {cout[i],sum[i]} = a[i] + b[i] + cout[i-1];
end
end
endgenerate
endmodule
6.7Bcdadd100
您将获得一个名为 bcd_fadd 的 BCD 一位数加法器,该加法器将两个 BCD 数字相加并结转,并生成总和和结转。
module bcd_fadd (
input [3:0] a,
input [3:0] b,
input cin,
output cout,
output [3:0] sum );
实例化 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 );
wire [99:0]cout1;
genvar i;
generate
for( i = 0 ; i < 100; i = i + 1 )
begin:adder
if(i==0)
bcd_fadd U0( .a(a[3:0]), .b(b[3:0]), .cin(cin), .cout(cout1[0]), .sum(sum[3:0]));
else
bcd_fadd U1( .a(a[4*i+3:4*i]), .b(b[4*i+3:4*i]), .cin(cout1[i-1]), .cout(cout1[i]), .sum(sum[4*i+3:4*i]));
end
assign cout = cout1[99];
endgenerate
endmodule