第一步:分析题意
一开始无法清晰理解题目意思,比如这out_both、out_any、out_differen的意义。所以写出真值表,然后将具体结果写出方便理解:
in[3] | in[2] | in[1] | in[0] | out_both | out_any | out_different |
0 | 0 | 0 | 1 | 无 | [1] | [0][3] |
1 | 1 | 1 | 1 | [2][1][0] | [3][2][1] | 无 |
1 | 0 | 1 | 1 | [0] | [3][2][1] | [2][1] |
第二步:给出解法
- 第一种解法是用case语句列出所有结果,最多有16个case,所以这个太机械先排除。
- 第二种解法是列出真值表找规律,真值表也有16行,暂不考虑。
- 第三种是通过for语言和if判断,第17题是16题的拓展
16题解答
module top_module(
input [3:0] in,
output [2:0] out_both,
output [3:1] out_any,
output [3:0] out_different );
integer i;
always @(*) begin
//out_both
for (i = 0; i < 3; i = i + 1) begin
if (in[i]&in[i+1] == 1) begin
out_both[i] = 1;
end
else begin
out_both[i] = 0;
end
end
//out_any
for (i = 1; i < 4; i = i + 1) begin
if (in[i]|in[i-1] == 1) begin
out_any[i] = 1;
end
else begin
out_any[i] = 0;
end
end
//out_different
for (i = 0; i < 3; i = i + 1) begin
if (in[i]^in[i+1] == 1) begin
out_different[i] = 1;
end
else begin
out_different[i] = 0;
end
out_different[3] = in[3]^in[0];//判断第一位和最后一位
end
end
endmodule
17题解答
module top_module(
input [99:0] in,
output [98:0] out_both,
output [99:1] out_any,
output [99:0] out_different );
integer i;
always @(*) begin
//out_both
for (i = 0; i < 99; i = i + 1) begin //此处根据题意将3改为99
if (in[i]&in[i+1] == 1) begin
out_both[i] = 1;
end
else begin
out_both[i] = 0;
end
end
//out_any
for (i = 1; i < 100; i = i + 1) begin //此处根据题意将4改为100
if (in[i]|in[i-1] == 1) begin
out_any[i] = 1;
end
else begin
out_any[i] = 0;
end
end
//out_different
for (i = 0; i < 99; i = i + 1) begin//此处根据题意将3改为99
if (in[i]^in[i+1] == 1) begin
out_different[i] = 1;
end
else begin
out_different[i] = 0;
end
out_different[99] = in[99]^in[0];//判断第一位和最后一位
end
end
endmodule