18 |
色変換回路 (2) |
このソースから生成された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
問題は以下のように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;
のように手修正しても、以下の図のような回路となってしまいました。ポート名は良いのですが、ポート番号が思ったように付いてくれません。
いちいち手修正するのも嫌なので、BSVで可能な方法を探ります。