2017年7月16日日曜日

vivado におけるグレイコードカウンタの書き方

前回、case文でグレイコードカウンタを記述すると意図しないレジスタを生成することが分かったので、他の記述をした場合にどのような回路を合成するか調べてみた。

1:加法標準形による記述
always @ (posedge CLK or posedge RST) begin
        if (RST) gcc <= 0;
        else begin
            gcc[5] <= (gcc[5:0]==6'b010000)||(gcc[5:0]==6'b110000)|| ...中略
    ・・・中略
       end
end

前回と同じ加法標準形による記述では、正しく意図した回路を生成する。

2:いちどバイナリになおして加算してグレイにして(略
Gray2Binaryとインクリメント演算で2度のリップルキャリーが出るため、避けるべきと思っていた記述だが(少なくともsynopsysでは避けていた)、vivadoではリップルキャリーの出る部分は全て6入力LUTに吸収され、加法標準形による記述と同様の回路が生成された

module GRAYCODECOUNT(
    input CLK, RST,
    output [5:0] GOUT
);

reg [5:0] gcc;
wire [5:0] gray2bin;
wire [5:0] inc;
wire [5:0] bin2gray;
    
assign gray2bin[5:0] = gcc[5:0] ^ {1'b0, gray2bin[5:1]};
assign inc  = gray2bin[5:0] + 1'b1;
assign bin2gray = inc[5:0] ^ {1'b0, inc[5:1]};
always @ (posedge CLK or posedge RST) begin
  if (RST) gcc <= 0;
  else gcc <= bin2gray;
end
    
assign GOUT = gcc;
endmodule

結論 Vivadoの合成では、いらんこと考えずにビヘイビアレベルで記述したほうが良かったりしますよ

0 件のコメント:

コメントを投稿