Logic Verilog:在一个case语句中更改多个状态
基本上,我试图在7段显示器上显示两个数字的和或积(使用FPGA上的开关输入)。我知道我的加法和乘法都很好,因为我已经分别测试了它们 不过我在LSB上遇到了麻烦。无论什么,它只是默认为F,并且从不更改。我认为Verilog不允许我在同一个case语句中同时修改Cout1和Cout0。有解决办法吗?请参阅下面我的代码Logic Verilog:在一个case语句中更改多个状态,logic,case,verilog,software-design,case-statement,Logic,Case,Verilog,Software Design,Case Statement,基本上,我试图在7段显示器上显示两个数字的和或积(使用FPGA上的开关输入)。我知道我的加法和乘法都很好,因为我已经分别测试了它们 不过我在LSB上遇到了麻烦。无论什么,它只是默认为F,并且从不更改。我认为Verilog不允许我在同一个case语句中同时修改Cout1和Cout0。有解决办法吗?请参阅下面我的代码 always@* if (key1press) casex(PrintSum) // Hex 1 (MSB) // Works!
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
提前感谢大家:)案例陈述中的以下两个术语涵盖了PrintSum选择器的所有可能值。因为它们是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
- 阅读本协议第4.3条 详情请参阅
和Cout0
为推断锁存(电平敏感)。FPGA对闩锁的支持有限或没有。此外,如果操作不当,闩锁可能容易出现故障Cout1
- 的StackOverflow搜索结果