dポイントプレゼントキャンペーン実施中!

always @(posedge CLK)
begin
case (DIP_SW)
0:Q[0] <= SW1_OUT;
0:Q[1] <= Q[0];
0:Q[2] <= Q[1];
0:Q[3] <= Q[2];
0:Q[4] <= Q[3];
0:Q[5] <= Q[4];
0:Q[6] <= Q[5];
0:Q[7] <= Q[6];
1:Q[7] <= SW1_OUT;
1:Q[6] <= Q[7];
1:Q[5] <= Q[6];
1:Q[4] <= Q[5];
1:Q[3] <= Q[4];
1:Q[2] <= Q[3];
1:Q[1] <= Q[2];
1:Q[0] <= Q[1];
endcase
end
これはプログラムの一部なのですが、0と1の場合で分岐させる予定です。もちろん上のソースでは上手くいきませんでした。case文ではなくif文のほうがよいでしょうか?

A 回答 (1件)

同じラベルを重ねて書かない。


ステートメントが複数あるならbegin-endで囲む。
----------------------------------------
always @(posedge CLK)
begin
  case (DIP_SW)
    0:
    begin
      Q[0] <= SW1_OUT;
      Q[1] <= Q[0];
      Q[2] <= Q[1];
      Q[3] <= Q[2];
      Q[4] <= Q[3];
      Q[5] <= Q[4];
      Q[6] <= Q[5];
      Q[7] <= Q[6];
    end

    1:
    begin
      Q[7] <= SW1_OUT;
      Q[6] <= Q[7];
      Q[5] <= Q[6];
      Q[4] <= Q[5];
      Q[3] <= Q[4];
      Q[2] <= Q[3];
      Q[1] <= Q[2];
      Q[0] <= Q[1];
    end
  endcase
end
----------------------------------------

ただ、Qが(レジスタ配列などではなく)ただの多ビット信号なら、
そもそも代入文を8つも並べる必要性がなさそう。
----------------------------------------
always @(posedge CLK)
begin
  case (DIP_SW)
    0: Q <= {Q[6:0], SW1_OUT};
    1: Q <= {SW1_OUT, Q[7:1]};
  endcase
end
----------------------------------------

> case文ではなくif文のほうがよいでしょうか?
これくらいならif文で十分なようには思える。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!