Posts Issued on October 18, 2023

色変換回路 (2)

posted by sakurai on October 18, 2023 #680

このソースから生成されたverilogファイルは以下のようになります。先頭のコメントやifdef文等を省略したソースを示します。

module mkColorConverter(RI,
            GI,
            BI,
            OUT);
  // value method mapColor
  input  RI;
  input  GI;
  input  BI;
  output [11 : 0] OUT;

  // signals for module outputs
  reg [11 : 0] OUT;

  // remaining internal signals
  wire [2 : 0] x__h134;

  // value method mapColor
  always@(x__h134)
  begin
    case (x__h134)
      3'b0: OUT = 12'd2369;
      3'b001: OUT = 12'd3460;
      3'b010: OUT = 12'd1461;
      default: OUT = 12'd3276;
    endcase
  end

  // remaining internal signals
  assign x__h134 = { RI, GI, BI } ;
endmodule  // mkColorConverter

図%%.1
図680.1 色変換回路

問題は以下のようにstructで3つのデータを構造化しているにも関わらず、12ビット出力ポートが1個生成されてしまうことです。構造体メンバを取り出す方法がありません。

typedef struct {
  Bit#(4) ro;
  Bit#(4) go;
  Bit#(4) bo;
} ColorOutputs deriving (Bits);

これを4bitの3つの出力ポートとしたいわけです。

不思議なことにBSVの世界から離れてverilogだけでなんとかしようとして手修正によりポートを3つに分けてみたのですが、思ったようにはなりませんでした。例えばverilogを

module mkColorConverter(RI,
                    GI,
                    BI,
                    RO,
                    GO,
                    BO);
  // value method mapColor
  input  RI;
  input  GI;
  input  BI;
  output [3 : 0] RO;
  output [3 : 0] GO;
  output [3 : 0] BO;

  // signals for module outputs
  wire [3 : 0] RO = OUT[11:8];
  wire [3 : 0] GO = OUT[7:4];
  wire [3 : 0] BO = OUT[3:0];
  reg [11: 0] OUT;

のように手修正しても、以下の図のような回路となってしまいました。ポート名は良いのですが、ポート番号が思ったように付いてくれません。

図%%.2
図680.2 色変換回路

いちいち手修正するのも嫌なので、BSVで可能な方法を探ります。


左矢前のブログ 次のブログ右矢