Verilog:在一个案例语句中更改多个状态
Verilog: Changing multiple states in one case statement
基本上,我试图将两个数字(使用 FPGA 上的开关输入)的和或乘积显示到 7 段显示器上。我知道我的加法位和乘法位都工作正常,因为我已经分别测试了它们。
不过我在使用 LSB 时遇到了问题。不管它只是默认为 F 并且永远不会改变。我认为 Verilog 不允许我在同一个 case 语句中同时修改 Cout1 和 Cout0。有解决方法吗?请参阅下面的代码。
always@*
if (key1press)
casex(PrintSum)
// Hex 1 (MSB)
// Works!
5'b0xxxx : Cout1 = 7'b1000000; //0 if S[4] = 0
5'b1xxxx : Cout1 = 7'b1111001; //1 if S[4] = 1
// Hex 0 (LSB)
// Doesn't work :(
5'bx0000 : Cout0 = 7'b1000000; //0
...
5'bx1111 : Cout0 = 7'b0001110; //F
//default : begin
// Cout1 = 7'b1000000; //0 by default
// Cout0 = 7'b1000000; //0 by default
//end
endcase
提前谢谢大家:)
您的 case 语句中的以下 2 个术语涵盖了 PrintSum 选择器的 所有 可能值。因为它们是第一个 int eh 列表,所以不会有其他值出现在那里。
5'b0xxxx : Cout1 = 7'b1000000; //0 if S[4] = 0
5'b1xxxx : Cout1 = 7'b1111001; //1 if S[4] = 1
您需要修正上述问题以提供有意义的值,以便其他条款也能执行。
您也可以像这样重新排列项目。
// Hex 0 (LSB)
// Doesn't work :(
5'bx0000 : Cout0 = 7'b1000000; //0
...
5'bx1111 : Cout0 = 7'b0001110; //F
// Hex 1 (MSB)
// Works!
5'b0xxxx : Cout1 = 7'b1000000; //0 if S[4] = 0
5'b1xxxx : Cout1 = 7'b1111001; //1 if S[4] = 1
在模拟中,case 语句将执行第一个匹配项。一切都会匹配前两个条件(5'b0xxxx
、5'b1xxxx
)。如果将这些条件移动到末尾,则永远不会达到它们,因为在 5'bx0000
到 5'bx1111
范围内会有匹配项。
护理位之间没有重叠。因此,最简单的解决方案是将Cout1
和Cout0
拆分为单独的宪法声明:
begin
if (PrintSum[4]) begin
Cout1 = 7'b1111001; //1 if S[4] = 1
end
else begin
Cout1 = 7'b1000000; //0 if S[4] = 0
end
case(PrintSum[3:0])
4'b0000 : Cout0 = 7'b1000000; //0
// ...
4'b1111 : Cout0 = 7'b0001110; //F
endcase
end
其他需要注意的事项:
不要使用 casex
- 阅读 RTL 编码风格的第 4.3 节产生模拟和
综合失配
了解详情。
Cout0
和 Cout1
是推断锁存器(电平敏感)。 FPGA 对锁存器的支持有限或不支持。如果操作不当,加上闩锁可能容易出现故障。
- What is inferred latch and how it is created when it is missing else statement in if condition.can anybody explain briefly?
- inferred latch
的 Whosebug 搜索结果
基本上,我试图将两个数字(使用 FPGA 上的开关输入)的和或乘积显示到 7 段显示器上。我知道我的加法位和乘法位都工作正常,因为我已经分别测试了它们。
不过我在使用 LSB 时遇到了问题。不管它只是默认为 F 并且永远不会改变。我认为 Verilog 不允许我在同一个 case 语句中同时修改 Cout1 和 Cout0。有解决方法吗?请参阅下面的代码。
always@*
if (key1press)
casex(PrintSum)
// Hex 1 (MSB)
// Works!
5'b0xxxx : Cout1 = 7'b1000000; //0 if S[4] = 0
5'b1xxxx : Cout1 = 7'b1111001; //1 if S[4] = 1
// Hex 0 (LSB)
// Doesn't work :(
5'bx0000 : Cout0 = 7'b1000000; //0
...
5'bx1111 : Cout0 = 7'b0001110; //F
//default : begin
// Cout1 = 7'b1000000; //0 by default
// Cout0 = 7'b1000000; //0 by default
//end
endcase
提前谢谢大家:)
您的 case 语句中的以下 2 个术语涵盖了 PrintSum 选择器的 所有 可能值。因为它们是第一个 int eh 列表,所以不会有其他值出现在那里。
5'b0xxxx : Cout1 = 7'b1000000; //0 if S[4] = 0
5'b1xxxx : Cout1 = 7'b1111001; //1 if S[4] = 1
您需要修正上述问题以提供有意义的值,以便其他条款也能执行。
您也可以像这样重新排列项目。
// Hex 0 (LSB)
// Doesn't work :(
5'bx0000 : Cout0 = 7'b1000000; //0
...
5'bx1111 : Cout0 = 7'b0001110; //F
// Hex 1 (MSB)
// Works!
5'b0xxxx : Cout1 = 7'b1000000; //0 if S[4] = 0
5'b1xxxx : Cout1 = 7'b1111001; //1 if S[4] = 1
在模拟中,case 语句将执行第一个匹配项。一切都会匹配前两个条件(5'b0xxxx
、5'b1xxxx
)。如果将这些条件移动到末尾,则永远不会达到它们,因为在 5'bx0000
到 5'bx1111
范围内会有匹配项。
护理位之间没有重叠。因此,最简单的解决方案是将Cout1
和Cout0
拆分为单独的宪法声明:
begin
if (PrintSum[4]) begin
Cout1 = 7'b1111001; //1 if S[4] = 1
end
else begin
Cout1 = 7'b1000000; //0 if S[4] = 0
end
case(PrintSum[3:0])
4'b0000 : Cout0 = 7'b1000000; //0
// ...
4'b1111 : Cout0 = 7'b0001110; //F
endcase
end
其他需要注意的事项:
不要使用
casex
- 阅读 RTL 编码风格的第 4.3 节产生模拟和 综合失配 了解详情。
Cout0
和Cout1
是推断锁存器(电平敏感)。 FPGA 对锁存器的支持有限或不支持。如果操作不当,加上闩锁可能容易出现故障。- What is inferred latch and how it is created when it is missing else statement in if condition.can anybody explain briefly?
- inferred latch 的 Whosebug 搜索结果