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'b0xxxx5'b1xxxx)。如果将这些条件移动到末尾,则永远不会达到它们,因为在 5'bx00005'bx1111 范围内会有匹配项。

护理位之间没有重叠。因此,最简单的解决方案是将Cout1Cout0拆分为单独的宪法声明:

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

  • Cout0Cout1 是推断锁存器(电平敏感)。 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 搜索结果