Posts Issued on October 19, 2023

色変換回路 (3)

posted by sakurai on October 19, 2023 #681

そもそもリターンメソッド(出力に相当する)が単一なのは、タイミング的に同時に12bitを読みだすからですが、これを4bitずつ3回にわけて読みだす形にします。すると、

interface ColorConverter;
  (* prefix="" *)
  method Action setInputs(
    (* port="RI" *) Bit#(1) r,
    (* port="GI" *) Bit#(1) g,
    (* port="BI" *) Bit#(1) b);
  (* result="RO" *)
  method Bit#(4) getRO();
  (* result="GO" *)
  method Bit#(4) getGO();
  (* result="BO" *)
  method Bit#(4) getBO();
endinterface

(* synthesize, always_enabled = "setInputs" *)
module mkColorConverter(ColorConverter);
    Wire#(Bit#(1)) r_reg <- mkWire;
    Wire#(Bit#(1)) g_reg <- mkWire;
    Wire#(Bit#(1)) b_reg <- mkWire;

  method Action setInputs(Bit#(1) r, Bit#(1) g, Bit#(1) b);
    r_reg <= r;
    g_reg <= g;
    b_reg <= b;
  endmethod

  method Bit#(4) getRO();
    return (case ({r_reg, g_reg, b_reg})
      3'b000: 4'h9;
      3'b001: 4'hD;
      3'b010: 4'h5;
      3'b100: 4'hC;
      default: ?;
    endcase);
  endmethod

  method Bit#(4) getGO();
    return (case ({r_reg, g_reg, b_reg})
      3'b000: 4'h4;
      3'b001: 4'h8;
      3'b010: 4'hB;
      3'b100: 4'hC;
      default: ?;
    endcase);
  endmethod

  method Bit#(4) getBO();
    return (case ({r_reg, g_reg, b_reg})
      3'b000: 4'h1;
      3'b001: 4'h4;
      3'b010: 4'h5;
      3'b100: 4'hC;
      default: ?;
    endcase);
  endmethod
endmodule

このソースからは以下のverilogが生成されます。

module mkColorConverter(CLK,
            RST_N,
            RI,
            GI,
            BI,
            RO,
            RDY_getRO,
            GO,
            RDY_getGO,
            BO,
            RDY_getBO);
  input  CLK;
  input  RST_N;
  // action method setInputs
  input  RI;
  input  GI;
  input  BI;
  // value method getRO
  output [3 : 0] RO;
  output RDY_getRO;
  // value method getGO
  output [3 : 0] GO;
  output RDY_getGO;
  // value method getBO
  output [3 : 0] BO;
  output RDY_getBO;
  // signals for module outputs
  reg [3 : 0] BO, GO, RO;
  wire RDY_getBO, RDY_getGO, RDY_getRO;
  // remaining internal signals
  wire [2 : 0] x__h322;
  // value method getRO
  always@(x__h322)
  begin
    case (x__h322)
      3'b0: RO = 4'h9;
      3'b001: RO = 4'hD;
      3'b010: RO = 4'h5;
      default: RO = 4'hC;
    endcase
  end
  assign RDY_getRO = 1'b1 ;
  // value method getGO
  always@(x__h322)
  begin
    case (x__h322)
      3'b0: GO = 4'h4;
      3'b001: GO = 4'h8;
      3'b010: GO = 4'hB;
      default: GO = 4'hC;
    endcase
  end
  assign RDY_getGO = 1'b1 ;
  // value method getBO
  always@(x__h322)
  begin
    case (x__h322)
      3'b0: BO = 4'h1;
      3'b001: BO = 4'h4;
      3'b010: BO = 4'h5;
      default: BO = 4'hC;
    endcase
  end
  assign RDY_getBO = 1'b1 ;
  // remaining internal signals
  assign x__h322 = { RI, GI, BI } ;
endmodule  // mkColorConverter

出力ポートの形は狙い通り4bit×3個となりました。しかしながら、問題点は生成されたコメントにもあるように、

// Ports:                                                                   
// Name                         I/O  size props                             
// RO                             O     4                                   
// RDY_getRO                      O     1 const                             
// GO                             O     4                                   
// RDY_getGO                      O     1 const                             
// BO                             O     4                                   
// RDY_getBO                      O     1 const                             
// CLK                            I     1 unused                            
// RST_N                          I     1 unused                            
// RI                             I     1                                   
// GI                             I     1         
  1. RDY信号が定数でalways_readyを示す
  2. CLK, RST_Nが未使用

であることから両者とも削除可能です。入力のenableは always_enabled = "setInputs" で示すように削除することができたのですが、always_readyを指定してもエラーとなり、RDY信号を削除することができませんでした。

さらに、no_default_clock, no_default_reset によりCLKとRST_Nを削除できる場合もあるようですが、この場合はエラーが発生してできませんでした。この2点が疑問です。


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