19 |
色変換回路 (3) |
そもそもリターンメソッド(出力に相当する)が単一なのは、タイミング的に同時に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
- RDY信号が定数でalways_readyを示す
- CLK, RST_Nが未使用
であることから両者とも削除可能です。入力のenableは always_enabled = "setInputs" で示すように削除することができたのですが、always_readyを指定してもエラーとなり、RDY信号を削除することができませんでした。
さらに、no_default_clock, no_default_reset によりCLKとRST_Nを削除できる場合もあるようですが、この場合はエラーが発生してできませんでした。この2点が疑問です。