Conditional
使用三目运算符可以实现一个数据选择器 ,可以替代if语句 ,不过:?可读性较差 ,复杂逻辑还是推荐用if 。
注意这道题中间变量的定义 ,不定义中间变量表达式会变得十分复杂且可读性差 。
Reduction
归约运算符 ,双目运算符直接用在多位变量前使用 ,可以实现归约操作 。这里使用了一个异或的归约操作 ,实现了偶校验 。
module top_module (
input [7:0] in,
output parity);
assign parity = ^in;
endmodule
Gates100
同样是使用一个归约运算符 ,实现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
Vector100r
按照提示用了一个for循环 ,for循环一般用于仿真 ,这里也可以用于反转位序 。
答案用了一个$bits()系统函数 ,可以直接返回信号的位宽 。
module top_module(
input [99:0] in,
output [99:0] out
);
integer i=0;
always@(*)
begin
for(i=0;i<100;i=i+1)
begin
out[i]=in[99-i];
end
end
endmodule
Popcount255
同样使用了一个for循环 ,也可以把in中每位的数加起来,就不用if判断了 。
module top_module(
input [254:0] in,
output [7:0] out );
reg [7:0] count;
always@(*)
begin
count = 0;
for(int i=0;i<$bits(in);i=i+1)
begin
if(in[i]==1b1)
count=count+1b1;
end
end
assign out=count;
endmodule
Adder100i
题目意思是使用例化数组或者generate语句 ,感觉这两种用法用的并不多 ,不过还是尝试写了一下 。
直接for循环
module top_module(
input [99:0] a, b,
input cin,
output [99:0] cout,
output [99:0] sum );
always@(*)
begin
for(int i=0;i<100;i=i+1)
begin
{cout[i],sum[i]}=a[i]+b[i]+((i==0)?cin:cout[i-1]);
end
end
endmodule
实例化数组
module top_module(
input [99:0] a, b,
input cin,
output [99:0] cout,
output [99:0] sum );
add adder[99:0](
.cin({cout[98:0],cin}),
.a(a[99:0]),
.b(b[99:0]),
.sum(sum[99:0]),
.cout(cout[99:0])
);
endmodule
module add(
input cin,
input a,
input b,
output sum,
output cout
);
assign {cout,sum}=cin+a+b;
endmodule
generate for语句
module top_module(
input [99:0] a, b,
input cin,
output [99:0] cout,
output [99:0] sum );
genvar i;
generate
for(i = 0;i<$bits(sum);i=i+1)
begin:gen
add adder(
.cin((i==0)?cin:cout[i-1]),
.a(a[i]),
.b(b[i]),
.sum(sum[i]),
.cout(cout[i])
);
end
endgenerate
endmodule
module add(
input cin,
input a,
input b,
output sum,
output cout
);
assign {cout,sum}=cin+a+b;
endmodule
Bcdadd100
这道题同样也是用实例化数组或者generate for语句 。
module top_module(
input [399:0] a, b,
input cin,
output cout,
output [399:0] sum );
wire [98:0]c;
bcd_fadd u_bcd_fadd[99:0](
.a(a[399:0]),
.b(b[399:0]),
.cin({c[98:0],cin}),
.cout({cout,c[98:0]}),
.sum(sum[399:0])
);
endmodule
声明:本站所有文章,如无特殊说明或标注 ,均为本站原创发布 。任何个人或组织 ,在未征得本站同意时 ,禁止复制 、盗用 、采集 、发布本站内容到任何网站 、书籍等各类媒体平台 。如若本站内容侵犯了原著者的合法权益 ,可联系我们进行处理。