【问题标题】:How do I simplify ugly nested if else statements?如何简化丑陋的嵌套 if else 语句?
【发布时间】:2012-11-10 13:51:08
【问题描述】:

总的来说,我是编程新手,我发现自己过于依赖条件语句。我发现它们与我在编码时的思路相似,这使得它们易于实现。

下面我在 Verilog 中有一个小代码 sn-p,它控制数字时钟显示。整个代码几乎都是以这种方式布局的。该代码有效并且非常易读。但是,我觉得它不优雅。是否可以在简化代码的同时提高可读性?

    if (cnt >= clkspeed) begin
        cnt = 0;
        out0 <= out0 + 4'h1;

        // LED0 > 9 -> LED1 += 1
        if (out0 == 4'h9) begin
            out0 <= 4'h0;
            out1 <= out1 + 4'h1;

            // LED1 > 5 -> LED2 += 1
            if (out1 == 4'h5) begin
                out1 <= 4'h0;
                out2 <= out2 + 4'h1;

                // LED2 > 9 -> LED3 += 1
                if (out2 == 4'h9) begin
                    out2 <= 4'h0;
                    out3 <= out3 + 4'h1;

                    // LED3 > 5 -> LED3 = 0
                    if (out3 == 4'h5) begin
                        out3 <= 4'h0;
                    end                     
                end
            end
        end
    end

【问题讨论】:

标签: verilog if-statement simplify


【解决方案1】:

您的问题是您执行了四次相同的操作,因为您将数据存储在标量变量中。这种情况的解决方案是将数字存储在一个数组中,然后循环遍历它们。这个伪代码是这样的:

array<int> digits;
int position = digits.length();
while (position >= 0) {
    digits[position] = (digits[position] + 1) % 10;
    if (digits[position]>0) break; // if there is no carry, just break
    position--;
}

此代码假定每个数字最多为 9。因此您仍然必须添加处理 LED1 和 LED3 的逻辑...(通过使用另一个数组,或者如果您有 OOP 创建一个可以存储实际的 LED 对象LED的数量和限制...)

【讨论】:

  • 所以你可以用循环替换重复。如果嵌套让您烦恼,我建议您反转 ifs 中的条件并提前返回。 (除非你应该做 SESE)
  • 我不确定 Verilog 是否能够创建输出端口数组。
  • 是的,我刚刚意识到它是一个非常低级的东西,所以如果你不能拥有数组,你最好的方法是通过提前返回来消除嵌套。我真的没有看到任何其他解决方案...
  • 所有 verilog 循环都在编译时展开,因为它是一种硬件描述语言。我不知道有没有可能提前休息或返回。
猜你喜欢
  • 1970-01-01
  • 2021-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多