2016-05-27 3 views
1

私が書いたコードをパラメータ化しようとしています。以下のパラメーター化されていないバージョンは、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と等しいかどうかを確認しましたが、ハードウェアでそれを行う方法がわかりません。より良い方法がありますか?

+0

SS' 'の宣言は何ですか?あなたは完全なコードをアップロードできますか? –

+0

@PrakashDarji更新しました – Ross

+0

もセグメント宣言しますか? –

答えて

1

ループを実行して「最後の割り当てが勝ち」を利用できます。下記参照。私はここでいくつかのSystemVerilogシンタックスを使用しましたが、それを使わなくてもそれを行うことができます。私はさらに行くとバイナリカウンタとシフトレジスタに代わる

PARAMETER SS_SIZE = 4 
logic [6:0] SS [SS_SIZE]; 
logic [SS_SIZE-1:0] digits; 

always_ff @(posedge clk or posedge reset) 
    if (reset) digits <= {{(SS_SIZE-1){1'b1}},1'b0}; 
    else  digits <= { digits[SS_SIZEE-2:0], digits[SS_SIZE-1] }; 

always_comb begin 
    segments = '0; 
    for(int i=0; i<SS_SIZE; i++) begin 
     if(digits[i]==1'b0) begin 
      segments = ~SS[i]; 
     end 
    end 
end 

PARAMETER SS_SIZE = 4 
logic [6:0] SS [SS_SIZE]; 
logic [$clog2(SS_SIZE)-1:0] count; 

always_ff @(posedge clk or posedge reset) 
    if (reset) count <= '0; 
    else if(count == (SS_SIZE-1)) count <= '0 
    else  count <= count+1; 

assign segments = ~SS[count]; 
+0

ありがとうございました!私は以前に 'for'ループを' generate'と 'endgenerate'の間に置いていました。あなたは、ハードウェアの中にそれを置くことと置くことの間に何が違うのかを明確にすることができると思いますか?そして、「最後の課題が勝つ」と説明できますか? – Ross

+0

最後の割り当てがスティックされている限り、ループ内で何かを何度も実行することができます。合成ツールは、このために最小限のハードウェアを把握するのに十分なほどスマートです。私の答えと生成ブロックを使用する答えとの間には、おそらく違いはありません。 – nguthrie

関連する問題