2013-04-30 48 views
2

我想知道,如何爲簡單的VHDL D觸發器代碼編寫C++封裝器。該代碼可以是如下:VHDL的簡單C++封裝DFF代碼

entity DFF is 
    Port (D : in std_logic; 
     CLK : in std_logic := '0'; 
     Q : out std_logic; 
     QN : out std_logic); 
end DFF; 

architecture behv of DFF is 
    begin 
 process (CLK) 
     begin 
      if CLK'event and CLK = '1' then 
       Q <= D; 
       QN <= NOT D; 
      end if; 
    end process; 

端BEHV;

在此先感謝,
Milind。

+0

你是什麼意思的C++包裝?你的意思是類似C++中這種邏輯的軟件模擬嗎? – 2013-04-30 16:07:03

+0

你是否通過VHPI與模擬器交互?還是你的模擬器建立在gcc上,就像ghdl是? (順便說一句,我強烈建議修復該時鐘檢測:「如果rising_edge(clk)then」是首選) – 2013-04-30 16:26:15

+0

是否確定您的DFF邏輯正確? – 4pie0 2013-04-30 16:50:54

回答

0

你可以從這個開始:

//Template Method pattern is used here to describe Port interface 
class Port{ 
public: 
    void behavior(){ 
     architecture_behavior(); 
    } 
    void setD(bool input)(){ 
     doSetD(input); 
    } 
    void setCLK(bool clk){ 
     doSetCLK(clk); 
    } 
    bool state(){ 
     return doState(); 
    } 
protected: 
    virtual void architecture_behavior(); 
    virtual void doSetD(bool input); 
    virtual void doSetCLK(bool clk); 
    virtual void doState(); 
}; 

class Dflipflop : public Port{ 
public: 
    Dflipflop(bool clk, bool d){ 
     CLK=clk; 
     D=d; 
    } 
private: 
    void architecture_behavior(){ 
     if(CLK=true){ 
      Q=D; 
      QN=!Q; 
     } 
    } 
    void doSetD(bool d){ 
     D=d; 
    } 
    void doSetCLK(bool clk){ 
     CLK=clk; 
    } 
    bool doState(){ 
     return Q; 
    } 
}; 

你想要的東西,這可能是更接近:

class Dflipflop2 : public Port{ 
public: 
    Dflipflop2(bool clk, bool d){ 
     CLK=clk; 
     D=d; 
    } 
    void architecture_behavior(bool d, bool clk){ // set state 
     D=d; 
     if(CLK=true && clk==false){ //set Q only if clock switches from 1 to 0 
      Q=D; 
      QN=!Q; 
     } 
     CLK=clk; 
    } 
private: 
    bool doState(){ 
     return Q; 
    } 
}; 
+0

感謝您的回覆。我正在研究協同仿真接口VHDL和systemC。 systemC基於C++。作爲一個非常簡單的模型,我想創建一個包裝VHDL DFF代碼的C函數。我可以在C++類中使用它作爲函數成員。我想創建像這樣的C++類{(私有:fucntion成員(C函數包裝(VHDL代碼)))};上面的代碼行不嚴格遵循語法格式... – 2013-05-08 09:24:43

-1

您可以嘗試類似的東西(:CLK改變每單集爲5毫秒,取決於函數調用的時間,輸出會發生變化,所以除了看到CLK的實時表示外)。

#include <iostream> 
#include <ctime> 

#define PASSED_MS (int(float(now)/CLOCKS_PER_SEC*1000)) 
using namespace std; 

class DFF 
{ 
    public: 
    DFF(bool D):D(D),CLK(0),Q(0),QN(1),start(clock()),now(start){} 
    ~DFF(); 
    bool DFF_Q(); 
    void DFF_ALL(bool& clk,bool& q,bool& qn); //To return all Parameters at once 

    private: 
    bool D,CLK,Q,QN; 
    const clock_t start; 
    clock_t now; 
}; 

DFF::~DFF() 
{ 
    delete &D; 
    delete &CLK; 
    delete &Q; 
    delete &QN; 
    delete &start; 
    delete &now; 
} 

bool DFF::DFF_Q() 
{ 
    now=clock()-start; 
    if((PASSED_MS/5)%2!=0 && PASSED_MS!=0) //if an odd period of 5ms passed change else keep it as its 
    { 
     CLK=CLK?0:1; 
     if(CLK) 
     { 
      Q=D; 
      QN=D?0:1; 
     } 
    } 
    return Q; 
} 
void DFF::DFF_ALL(bool& clk,bool& q,bool& qn) 
{ 
    DFF_Q(); 
    clk=CLK; 
    q=Q; 
    qn=QN; 
} 

int main() 
{ 
    DFF a(1); 
    bool clk,q,qn; 
    int c=30; 
    cout<<"CLK "<<"DFF-Q "<<"DFF-QN "<<endl; 
    while(c!=0) 
    { 
     c--; 
     a.DFF_ALL(clk,q,qn); 
     cout<<clk<<" "<<q<<"  "<<qn<<endl<<endl; 
    } 
    return 0; 
} 
+0

感謝您的回覆。我正在研究協同仿真接口VHDL和systemC。 systemC基於C++。作爲一個非常簡單的模型,我想創建一個包裝VHDL DFF代碼的C函數。我可以在C++類中使用它作爲函數成員。我想創建像這樣的C++類{(私有:fucntion成員(C函數包裝(VHDL代碼)))};上面的代碼行不嚴格遵循語法格式... – 2013-05-08 08:06:55