Logic Verilog:在一个case语句中更改多个状态

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!

基本上,我试图在7段显示器上显示两个数字的和或积(使用FPGA上的开关输入)。我知道我的加法和乘法都很好,因为我已经分别测试了它们

不过我在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

提前感谢大家:)

案例陈述中的以下两个术语涵盖了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
    Cout1
    为推断锁存(电平敏感)。FPGA对闩锁的支持有限或没有。此外,如果操作不当,闩锁可能容易出现故障

    • 的StackOverflow搜索结果

两个场景不都会导致一个值被“击中”,然后结束案例吗?(我也试着切换这两个项目,不幸的是没有这样的运气)它将首先命中第一个匹配项。因此,如果PrintSum将4个低位设置为“0000”,它将命中第一项。然而,对于“00001”,它将匹配“0xxxx”术语,对于“10001”,它将匹配“1xx”。谢谢您,这一切都非常有用,也感谢您提供的额外资源。我决定用casez替换掉casex。如果这满足了你的问题,你应该记住接受答案图标。它将帮助其他人解决类似的问题。