私が書いたコードをパラメータ化しようとしています。以下のパラメーター化されていないバージョンは、WIDTH = 4のために書かれています。私は0をサイクルするreg digits
を持っています。このゼロがどこにあるかに基づいて、特定のベクトルをsegments
に配列SS
から出力したい(別のところで値を割り当てる)。Verilogで不完全なcase文をパラメータ化する
reg [6:0] SS [3:0];
always @(posedge clk)
if (reset) digits <= 4'b1110;
else digits <= { digits[2:0], digits[3] };
always @(*)
if (reset) segments <= ~7'h0;
else case(~digits)
4'b1 : segments[6:0] <= ~SS[0];
4'b10 : segments[6:0] <= ~SS[1];
4'b100 : segments[6:0] <= ~SS[2];
4'b1000 : segments[6:0] <= ~SS[3];
default : segments[6:0] <= 7'h0;
endcase
digits
の幅を変えてこのケース文をパラメータ化するにはどうすればよいですか?それはsegments
は、複数のドライバを持っていると私は別の方法でそれを行う場合、それはdigits
を言う以下のように言うので
for (genvar i = 0; i < WIDTH; i = i+1) begin
if (~digits[i]) segments[6:0] <= ~SS[i];
end
しかし、それは合成ではないだろう:私はfor
ループの代わりに、このような場合ステートメントを使用して試してみました定数ではないので合成できません:
for (genvar i = 0; i < WIDTH; i = i+1) begin
if (~digits == (1 << i)) segments[6:0] <= ~SS[i];
end
どうすればいいですか?私は~digits
のログベース2を取ってループ内でi
と等しいかどうかを確認しましたが、ハードウェアでそれを行う方法がわかりません。より良い方法がありますか?
SS' 'の宣言は何ですか?あなたは完全なコードをアップロードできますか? –
@PrakashDarji更新しました – Ross
もセグメント宣言しますか? –