2016-06-02 14 views
0

Ich versuche, in SystemC einen Block zu simulieren, der die rote Komponente von zwei Pixeln P1 und P2 hinzufügt und immer die grünen und blauen Komponenten von Pixel P1 behält. Ich habe das Pixel als ein struct und dessen Überlastfunktion in der folgenden Art und Weise erklärt:Wie kann ich eine Struktur als Signaltyp in SystemC verwenden?

struct pixel { 
    sc_uint<8> r; 
    sc_uint<8> g; 
    sc_uint<8> b; 

    pixel(sc_uint<8> _r = 0, sc_uint<8> _g = 0, sc_uint<8> _b = 0): r(_r), g(_g), b(_b) { } 

    bool operator == (const pixel &other) { 
     return (r == other.r) && (g == other.g) && (b == other.b); 
    } 

    // Displaying 
    friend ostream& operator << (ostream& o, const pixel& P) { 
     o << "{" << P.r << "," << P.g << "," << P.b << "}" ; 
     return o; 
    } 
}; 

//Overload function 
void sc_trace(sc_trace_file* _f, const pixel& _foo, const std::string& _s) { 
    sc_trace(_f, _foo.r, _s + "_r"); 
    sc_trace(_f, _foo.g, _s + "_g"); 
    sc_trace(_f, _foo.b, _s + "_b"); 
} 

Dann ich das Addiermodul kodiert haben unter Berücksichtigung, dass die Signale sc_in sind vom Typ pixel, wie folgt:

SC_MODULE(adder){ 
    sc_in<pixel> pin1; 
    sc_in<pixel> pin2; 
    sc_out<pixel> pout; 

    SC_CTOR(adder){ 

     SC_METHOD(addpixel); 
     sensitive << pin1 << pin2; 
    } 

    void addpixel(){ 
     sc_uint<8> ir; 
     sc_uint<8> ig; 
     sc_uint<8> ib; 

     ir = pin1.r + pin2.r; 
     ig = pin1.g; 
     ib = pin1.b; 

     pout = pixels(ir,ig,ib); 

     cout << " P1 = " << pin1 << endl; 
     cout << " P2 = " << pin2 << endl; 

    } 
}; 

erhalte ich folgende Kompilierung Fehler:

test.cpp:46:13: error: ‘class sc_core::sc_in<pixel>’ has no member named ‘r’ 
    ir = pin1.r + pin2.r; 
      ^
test.cpp:46:22: error: ‘class sc_core::sc_in<pixel>’ has no member named ‘r’ 
    ir = pin1.r + pin2.r; 
        ^
test.cpp:47:13: error: ‘class sc_core::sc_in<pixel>’ has no member named ‘g’ 
    ig = pin1.g; 
      ^
test.cpp:48:13: error: ‘class sc_core::sc_in<pixel>’ has no member named ‘b’ 
    ib = pin1.b; 
      ^
<builtin>: recipe for target 'test' failed 

ich mag würde wissen, wie könnte das Verfahren addpixel Zugang zu jeder Komponente RGB der Pixel und machen die Operation. Wenn ich die Fehlerzeilen lösche, komme ich an, um im Terminal die Werte der Pixel P1 und P2 anzuzeigen.

Antwort

2

sc_in<pixel> ist nicht pixel. Ich denke, Sie sollten den Wert über sc_in::read() wie folgt abrufen:

void addpixel(){ 
    sc_uint<8> ir; 
    sc_uint<8> ig; 
    sc_uint<8> ib; 
    pixel pin1_value = pin1.read(); 
    pixel pin2_value = pin2.read(); 

    ir = pin1_value.r + pin2_value.r; 
    ig = pin1_value.g; 
    ib = pin1_value.b; 

    pout = pixels(ir,ig,ib); 

    cout << " P1 = " << pin1_value << endl; 
    cout << " P2 = " << pin2_value << endl; 

}