Я хочу знать, как я могу написать оболочку C ++ для простого кода VHDL D-триггера. Код может быть следующим:
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;
конец бев;
заранее спасибо,
Milind.
Вы можете начать с этого:
//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;
}
};
Вы можете попробовать что-то подобное (нота: 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;
}