Posts Issued on October 23, 2023

色変換回路 (5)

posted by sakurai on October 23, 2023 #683

BSVフォーラムで議論したところ、以下のような回答を順次頂きました。

  • 最初の一括でリターンを返すメソッドのほうが良い。が、メソッドの構造体を分割する手段は現状のBSVの文法にはない。従って手段としては2つあり、外側にverilogラッパーを設けて分割するか、BSVに新たな機能を追加するか。
  • 組み合わせ回路の関数を置いたらどうか?
  • clockとresetは、インタフェース外の端子を使えば消すことができる。
  • RDYが1にもかかわらずエラーになる件はbscのissueとして登録した。

組み合わせ回路の関数は良い方法だと思うので、今後色変換回路を組み込む場合にはそうしようと思います。

しかしながら今回は外付けのモジュールとしたため、clockとresetを消去する方法で行きたいと思います。提示されたソースは以下のとおり。

interface ColorConverter;
  (* result="RO" *)
  method Bit#(4) getRO();
  (* result="GO" *)
  method Bit#(4) getGO();
  (* result="BO" *)
  method Bit#(4) getBO();
endinterface

(* synthesize, always_ready, no_default_clock, no_default_reset *)
module mkColorConverter(
    (* port="RI" *) Bit#(1) r,
    (* port="GI" *) Bit#(1) g,
    (* port="BI" *) Bit#(1) b,
        ColorConverter ifc);

  method Bit#(4) getRO();
    return (case ({r, g, b})
      3'b000: 4'h0;
      3'b001: 4'h9;
      3'b010: 4'hd;
      3'b011: 4'h5;
      3'b100: 4'hc;
      default: 4'h0;
    endcase);
  endmethod

  method Bit#(4) getGO();
    return (case ({r, g, b})
      3'b000: 4'h0;
      3'b001: 4'h4;
      3'b010: 4'h8;
      3'b011: 4'hb;
      3'b100: 4'hc;
      default: 4'h0;
    endcase);
  endmethod

  method Bit#(4) getBO();
    return (case ({r, g, b})
      3'b000: 4'h0;
      3'b001: 4'h1;
      3'b010: 4'h4;
      3'b011: 4'h5;
      3'b100: 4'hC;
      default: 4'h0;
    endcase);
  endmethod
endmodule

メソッドを用いない入力方法があるようです。具体的にはinterfaceはメソッドを並べるため、interface定義外にポートを定義しています。

また、カラー0は非表示画面も示すため、変換せずに0のままと変更しました。

このソースから生成されるverilogコードはヘッダや定義文を除いて次のとおり。

module mkColorConverter(RI,
            GI,
            BI,
            RO,
            GO,
            BO);
  input  RI;
  input  GI;
  input  BI;

  // value method getRO
  output [3 : 0] RO;
  // value method getGO
  output [3 : 0] GO;
  // value method getBO
  output [3 : 0] BO;

  // signals for module outputs
  reg [3 : 0] BO, GO, RO;
  // remaining internal signals
  wire [2 : 0] x__h151;

  // value method getRO
  always@(x__h151)
  begin
    case (x__h151)
      3'b0: RO = 4'h0;
      3'b001: RO = 4'h9;
      3'b010: RO = 4'hD;
      3'b011: RO = 4'h5;
      3'b100: RO = 4'hC;
      default: RO = 4'h0;
    endcase
  end

  // value method getGO
  always@(x__h151)
  begin
    case (x__h151)
      3'b0: GO = 4'h0;
      3'b001: GO = 4'h4;
      3'b010: GO = 4'h8;
      3'b011: GO = 4'hB;
      3'b100: GO = 4'hC;
      default: GO = 4'h0;
    endcase
  end

  // value method getBO
  always@(x__h151)
  begin
    case (x__h151)
      3'b0: BO = 4'h0;
      3'b001: BO = 4'h1;
      3'b010: BO = 4'h4;
      3'b011: BO = 4'h5;
      3'b100: BO = 4'hC;
      default: BO = 4'h0;
    endcase
  end

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

verilogは正しく生成されています。


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