2013-04-30 32 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