如何简化丑陋的嵌套if else语句?

时间:2012-11-10 13:51:09

标签: verilog if-statement simplify

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

下面我在Verilog中有一个控制数字时钟显示的小代码片段。整个代码以这种方式布局。代码有效并且非常易读。但是,我发现它不够优雅。是否可以简化代码,同时提高可读性?

    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

1 个答案:

答案 0 :(得分: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对象数字和领导的限制......)