为什么显示我result赋值非法module decider (output[1:0] result, //0:不合格; 1:合格; 2:优秀 input [7:0] in1, input [7:0] in2, input [7:0] in3, input [7:0] in4, input [7:0] in5, input [7:0] in6, input [7:0] in7, input [7:0] in8); reg [7:0] sum; reg [3:0] avg; always @(*) begin sum = in1 + in2 + in3 + in4 + in5 + in6 + in7 + in8; avg = sum / 8; end always @(*) begin if (avg >= 8) result = 10; //优秀 else if (avg >= 6 && avg < 8) result = 01; //合格 else result = 00; //不合格 end endmodule
时间: 2024-03-05 17:49:36 浏览: 30
这个问题可能是由于 `result` 被定义为两位输出,但是在赋值时使用了三位的数值。在 `always @(*)` 代码块中,当 `avg` 大于等于 8 时,应该将 `result` 赋值为 2 位的二进制数值 `10`,而不是 3 位的二进制数值 `010`。同理,当 `avg` 大于等于 6 并且小于 8 时,应该将 `result` 赋值为 `01`。所以,可以将代码修改为:
```
always @(*) begin
if (avg >= 8)
result = 2'b10; //优秀
else if (avg >= 6 && avg < 8)
result = 2'b01; //合格
else
result = 2'b00; //不合格
end
```
这样就可以解决 `result` 赋值非法的问题。
相关问题
设计一个判决器,它支持8个人表决,每个人的表决采用10分制,表决平均<阈值(6分)为不合格,>=8为优秀,6~8之间为合格。 判决器端口定义如下: module decider (output[1:0] result, //0:不合格; 1:合格; 2:优秀 input [7:0] in1, input [7:0] in2, input [7:0] in3, input [7:0] in4, input [7:0] in5, input [7:0] in6, input [7:0]
in7, input [7:0] in8, input [3:0] threshold);
其中,threshold 是一个二进制数,用来表示阈值。
设计思路:
1. 定义一个变量 sum,用来统计所有人的投票总分;
2. 根据 threshold,计算出合格、不合格和优秀的分数线;
3. 在一个 for 循环中,将每个人的投票分数加入 sum 中;
4. 根据 sum 和分数线,判断最终结果,并将结果输出到 result 中。
下面是代码实现:
```
module decider (output[1:0] result, //0:不合格; 1:合格; 2:优秀
input [7:0] in1,
input [7:0] in2,
input [7:0] in3,
input [7:0] in4,
input [7:0] in5,
input [7:0] in6,
input [7:0] in7,
input [7:0] in8,
input [3:0] threshold);
reg [7:0] sum;
reg [7:0] pass_score;
reg [7:0] excellent_score;
always @(*) begin
sum = in1 + in2 + in3 + in4 + in5 + in6 + in7 + in8;
pass_score = threshold * 2;
excellent_score = threshold * 2 + 2;
end
always @(sum, pass_score, excellent_score) begin
if (sum >= excellent_score) begin
result = 2; //优秀
end else if (sum >= pass_score) begin
result = 1; //合格
end else begin
result = 0; //不合格
end
end
endmodule
```
使用示例:
```
module test_decider;
reg [7:0] in1 = 8;
reg [7:0] in2 = 6;
reg [7:0] in3 = 9;
reg [7:0] in4 = 7;
reg [7:0] in5 = 8;
reg [7:0] in6 = 7;
reg [7:0] in7 = 8;
reg [7:0] in8 = 9;
reg [3:0] threshold = 6;
wire [1:0] result;
decider d(result, in1, in2, in3, in4, in5, in6, in7, in8, threshold);
initial begin
$monitor("Result: %d", result);
end
endmodule
```
输出结果:
```
Result: 2
```
说明投票结果为优秀。
编写能在modelsim下仿真的bench文件module decider (output[1:0] result, //0:不合格; 1:合格; 2:优秀 input [7:0] in1, input [7:0] in2, input [7:0] in3, input [7:0] in4, input [7:0] in5, input [7:0] in6, input [7:0] in7, input [7:0] in8); reg [7:0] sum; reg [3:0] avg; always @(*) begin sum = in1 + in2 + in3 + in4 + in5 + in6 + in7 + in8; avg = sum / 8; end always @(*) begin if (avg >= 8) result = 2; //优秀 else if (avg >= 6 && avg < 8) result = 1; //合格 else result = 0; //不合格 end endmodule
以下是一个可以在ModelSim下仿真的bench文件:
`timescale 1ns/1ns
module decider_tb;
// Inputs
reg [7:0] in1;
reg [7:0] in2;
reg [7:0] in3;
reg [7:0] in4;
reg [7:0] in5;
reg [7:0] in6;
reg [7:0] in7;
reg [7:0] in8;
// Outputs
wire [1:0] result;
// Instantiate the module being tested
decider dut (
.in1(in1),
.in2(in2),
.in3(in3),
.in4(in4),
.in5(in5),
.in6(in6),
.in7(in7),
.in8(in8),
.result(result)
);
// Initialize inputs
initial begin
in1 = 8;
in2 = 8;
in3 = 8;
in4 = 8;
in5 = 8;
in6 = 8;
in7 = 8;
in8 = 8;
#10;
in1 = 6;
in2 = 8;
in3 = 6;
in4 = 8;
in5 = 6;
in6 = 8;
in7 = 6;
in8 = 8;
#10;
in1 = 4;
in2 = 3;
in3 = 4;
in4 = 3;
in5 = 4;
in6 = 3;
in7 = 4;
in8 = 3;
#10;
$finish;
end
endmodule
在这个bench文件中,我们首先定义了输入信号in1到in8和输出结果result,然后实例化了被测试的decider模块。我们使用initial块来初始化输入信号,先设置所有的输入信号都为8,等待一段时间让输出稳定,然后检查输出结果是否为2。接着,我们将输入信号设置为符合合格和不合格条件的值,分别检查输出结果是否为1和0。最后,我们使用$finish指令结束仿真。
这个bench文件可以在ModelSim中进行仿真,以检查decider模块的功能是否正确。
阅读全文