2

私は一般的にプログラミングに不慣れであり、条件文に依存しすぎていることに気づきます。コーディング時の私の思考の流れに似ているので、実装が簡単です。

以下に、デジタル時計の表示を制御する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
4

1 に答える 1

1

ここでの問題は、データをスカラー変数に格納するときに、同じ操作を4回実行することです。この場合の解決策は、数値を配列に格納し、それらをループすることです。これの擬似コードは次のようなものです。

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の制限...)

于 2012-11-10T15:12:26.823 に答える