【问题标题】:Verilog: Changing multiple states in one case statementVerilog:在一个案例语句中更改多个状态
【发布时间】:2017-12-10 22:23:19
【问题描述】:

基本上,我试图在 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

提前谢谢大家:)

【问题讨论】:

    标签: logic case verilog software-design case-statement


    【解决方案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
    

    其他需要注意的事项:

    【讨论】:

    • 谢谢,这一切真的很有帮助——也感谢您提供的额外资源。我决定用 casez 换掉 casex。
    • 如果这满足您的问题,您应该为接受答案图标计时。它将帮助其他有类似问题的人。
    【解决方案2】:

    您的 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
    

    【讨论】:

    • 两个场景不会导致一个值被“命中”并结束案件吗? (我也试过切换这两个项目,不幸的是没有这样的运气)
    • 它将首先命中第一个匹配项。因此,如果 PrintSum 将 4 个低位设置为“0000”,它将命中第一项。但是对于“00001”,它将匹配“0xxxx”术语,对于“10001”,它将匹配“1xxxx”。
    猜你喜欢
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-24
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多