Penerapan algoritma inersia pada contoh pemodelan logis dari sirkuit digital

1. Perkenalan


Kami melanjutkan ke bagian kedua dari topik yang dikhususkan untuk automata bersarang. Dalam yang pertama, kami memeriksa algoritma rekursif, yang, memiliki model automata bersarang dan menghubungkan kemampuan OOP, ternyata tidak begitu sulit untuk diterapkan. Tetapi kemungkinan automata bersarang tidak terbatas pada hal ini. Jadi, ketika menggambarkan model kontrol program otomat, algoritma inersia ditentukan, yang juga didasarkan pada ide embed automata. Algoritma inersia sulit dibayangkan dalam kerangka diagram blok biasa dari model komputasi, yang tidak menyediakan untuk mengembalikan kontrol ke titik sebelum panggilan subprogram. Tetapi saya harus mengatakan bahwa automata konvensional juga menyediakan penghapusan transisi "dengan cepat". Namun demikian, untuk automata ini tidak hanya dapat dibayangkan, tetapi juga diimplementasikan.

Algoritma inersia dan pemodelan logis topik terkait sirkuit digital. Dan bukan karena keterlambatan inersia memberikan nama ke kelas algoritma yang dipertimbangkan, tetapi seberapa banyak makna dari tindakan yang tertunda dari penundaan inersia, yang dipindahkan ke makna pekerjaan mereka. Meskipun, tentu saja, itu bukan namanya. Dalam UML, algoritma yang serupa diimplementasikan menggunakan konsep status sejarah. Analogi ini mudah, meskipun pemodelan sirkuit digital di UML, sebagai suatu peraturan, tidak mungkin. Hanya saja situasi ketika kembali ke titik awal, jika sesuatu memaksa seseorang untuk melakukannya, tampaknya menjadi yang paling alami. Contohnya termasuk penolakan untuk membeli tiket, pembatalan operasi / transaksi perbankan, pemutusan koneksi jaringan, dll. dll. Pada akhirnya, sebagaimana dinyatakan dalam UML,tanpa menggunakan status historis, penerapan algoritme tersebut tidak akan begitu "indah" [1].

Topik pemodelan logis dari sirkuit digital sangat luas dan menarik dalam dirinya sendiri. Dan bacaan baru tidak menyakitinya. Seperti yang akan kita lihat, teknologi pemrograman otomatis dapat menawarkan cara yang lebih baik untuk menggambarkan, mengimplementasikan, dan memodelkan sirkuit digital secara logis. Kita akan mengetahui ini semua sama, mengejar tujuan utama - untuk mempertimbangkan yang menarik, berguna dan, akhirnya, hanya kelas algoritma yang indah yang alami untuk automata, tetapi cukup sulit untuk diterapkan dalam model komputasi lainnya.

2. Pemodelan logis dari sirkuit digital


Literatur biasanya mempertimbangkan dua metode pemodelan sirkuit digital - kompilasi dan acara. Kompilasi terbatas dalam kemampuannya, karena tidak memperhitungkan penundaan elemen akun, membutuhkan elemen peringkat, dan memecah umpan balik [2]. Metode peristiwa tidak memiliki batasan seperti itu dan didasarkan pada peristiwa pelacakan yang terkait dengan perubahan nilai sinyal dalam rangkaian. Kami tidak akan mempertimbangkan kompilasi, tetapi akan fokus pada membandingkan acara dengan metode yang diterapkan dalam kerangka kemungkinan pemrograman otomatis, yang akan kami sebut lebih lanjut, dengan demikian, secara otomatis.

Sebagai contoh, ambil sirkuit dari [2], yang ditunjukkan pada Gambar. 1. Diagram karyanya dari sumber ditunjukkan pada Gambar. 2. Dua opsi dipertimbangkan: dengan satu penundaan, ketika elemen-elemen logika dari rangkaian memiliki penundaan yang sama, dan dengan penundaan yang didistribusikan, ketika elemen-elemen B dan E memiliki penundaan dua kali lebih banyak dari elemen-elemen rangkaian lainnya.
gambar

Ara. 1. Contoh sirkuit.

gambar

Ara. 2. Contoh pemodelan: a - penundaan tunggal; b - penundaan terdistribusi.

Dengan metode simulasi otomatis, Anda bahkan tidak perlu menemukan sesuatu, karena tidak perlu membuat bahasa yang cukup spesifik untuk mendeskripsikan sirkuit dan struktur yang mengimplementasikan hubungan rangkaian, dan tidak perlu algoritma yang cukup spesifik untuk mendeteksi peristiwa dalam proses pemodelan sirkuit, yang kemudian berfungsi sebagai dasar untuk membangun diagram alir sirkuit (untuk deskripsi keduanya, lihat [2] )

Dalam kasus automata, model elemen logis yang biasanya untuk teknologi otomat untuk desain program dibuat, yang termasuk dalam perpustakaan elemen logis (BLE). Selanjutnya, berdasarkan pustaka ini, serangkaian proses otomat paralel yang sesuai dengan jumlah elemen rangkaian dibuat, di antaranya koneksi ditunjukkan menggunakan saluran input / output model elemen logis (untuk ini, dalam lingkungan VKPA, variabel proses lokal seringkali cukup cukup). Kesimpulannya, model rangkaian dilengkapi dengan proses-generator sinyal input dan proses menampilkan diagram sinyal.

Hasil simulasi dari contoh yang dipertimbangkan dalam lingkungan VKPa, yang ditunjukkan pada Gambar. 3 sepenuhnya bertepatan dengan diagram pada Gambar. 2. Benar, itu tidak segera mungkin untuk mencapai kebetulan seperti itu. Dan bukan karena masalah dengan model, tetapi karena, pada kenyataannya, "metode seleksi ilmiah" harus menghitung durasi sinyal input, yang, ternyata, memiliki dampak yang signifikan. Tetapi dalam [2] tidak ada kata yang dikatakan tentang ini, atau tentang parameter sinyal input. Kesepakatan penuh dicapai dengan menemukan bahwa 1) durasi yang sama dengan tiga kali penundaan diperlukan, dan 2) offset sinyal (b) relatif terhadap sinyal (a) harus sama dengan unit delay. Untuk menjelaskan masalah ini, lihat gbr. Gambar 4 menunjukkan diagram sinyal untuk berbagai durasi sinyal input (dan ini tanpa memperhitungkan perpindahannya).

gambar

Ara. 3. Hasil simulasi dalam VKPa: a - penundaan tunggal; b - penundaan terdistribusi.

gambar

Ara. 4. Hasil simulasi dengan durasi sinyal input yang berbeda

Pertimbangkan contoh sirkuit lain dari sumber yang sama [2]. Skema dan diagram waktu kerjanya ditunjukkan dalam gambar. 5. Dalam kerangka metode acara, untuk "menghitung" diagram waktu, diperlukan 20 langkah simulasi (untuk lebih jelasnya lihat [2]). Tapi, seperti yang dinyatakan di sana, algoritma yang lebih kompleks dan, karenanya, jumlah langkah yang lebih besar diperlukan jika jenis penundaan inersia dipilih. Dalam kasus kami (kasus metode pemodelan otomatis), memiliki model sebelumnya, kita perlu "20 klik" dengan mouse untuk pergi ke diagram pada Gambar. 5, menghapus elemen yang tidak perlu dari sirkuit asli. Hasil simulasi rangkaian yang diperoleh dalam VKPa ditunjukkan pada Gambar. 6.

gambar

Ara. 5. Contoh sirkuit dan bagan waktunya.

Selain itu, diagram pada Gambar. 5 kami menambahkan paralel ke elemen ATAU elemen I. Grafik d dalam gambar. 6 menampilkan operasinya untuk kasus penundaan tunggal. Jika kita mengatur penundaan besar dan mengatur jenis penundaan inersia, maka grafik d akan berubah menjadi garis lurus. Oleh karena itu, elemen Dan dengan penundaan inersia lebih besar dari nilai tunggal tidak akan kehilangan pulsa yang dihasilkan pada inputnya dengan kombinasi sinyal input ini a dan b. Perhatikan bahwa memanipulasi tipe penundaan masuk akal hanya untuk elemen yang memiliki penundaan lebih dari satu.

gambar

Ara. 6. Memodelkan sirkuit pada Gambar. 5 dan elemen Dan (d).

3. Implementasi elemen logika


Dalam kasus umum, setiap elemen logis dapat direpresentasikan sebagai koneksi seri dari dua blok (lihat Gambar. 7) - elemen logis yang ideal tanpa penundaan dan blok, yang dapat dianggap sebagai penundaan propagasi (penundaan transportasi) atau penundaan inersia [2].

gambar

Ara. 7. Model elemen logika tertunda.

Elemen logis yang ideal sangat mudah diimplementasikan oleh fungsi logis normal, dan model blok penundaan dapat direpresentasikan dalam bentuk model otomat - model universal yang mencakup transportasi dan penundaan inersia. Model keterlambatan universal ditunjukkan pada Gambar. 8, dan model automata bersarang untuk itu ditunjukkan pada Gambar. 9. Implementasinya dalam C ++ dan sebagai bagian dari teknologi pemrograman otomatis ditunjukkan pada Listing 1.

gambar

Ara. 8. Model keterlambatan universal.

gambar

Ara. 9. Model automata bersarang untuk penundaan universal.

Mesin-mesin pada Gambar. 8 dan ara. 9 adalah campuran senapan serbu Mili-Moore. Pengoperasian otomat utama pada Gambar. 8. dimulai dengan membuat variabel lokal dan menginisialisasi referensi dalam tindakan y12 (predikat x12 memeriksa semua ini). Status perantara "ss" diperlukan agar predikat x3 berfungsi dengan benar, yang memiliki tautan ke variabel input, yang mungkin tidak diinisialisasi. Dari status "ss", model masuk ke kondisi yang sesuai dengan output keterlambatan, sementara menyebabkan otomat bersarang. Perhatikan bahwa tindakan dalam keadaan otomat (tindakan Moore automata) akan dimulai hanya setelah pengoperasian otomat bertingkat diselesaikan. Mereka pada akhirnya akan menetapkan nilai penundaan saat ini dan status variabel keluaran.

Tindakan y13, jika nilai penundaan didefinisikan, menciptakan otomat bertingkat yang diperlukan tergantung pada jenis penundaan. Automaton penundaan transpor tertanam hanya menghitung nilai yang ditetapkan dari siklus clock waktu diskrit (durasi penundaan ditentukan oleh jumlah siklus clock diskrit), dan penundaan inersia juga mengontrol level sinyal input. Dalam hal ini, kami mencatat bahwa nilai yang dikembalikan dari predikat x3 tergantung pada kondisi saat ini dari otomat tingkat atas.

Implementasi automata pada Gambar. 8, 9 mencerminkan Listing 3. Dengan mempertimbangkan kode, Anda harus memperhatikan metode virtual f (), yang, di satu sisi, mengimplementasikan satu atau beberapa fungsi logis abstrak yang tumpang tindih, dan, di sisi lain, melakukan inversi, jika ditentukan. Semua ini diperlukan untuk implementasi model turunan dari elemen logis. Listing 2 menunjukkan implementasi gerbang NAND tersebut.

Daftar 1. Menerapkan elemen logika keterlambatan universal
#include "lfsaappl.h"

extern LArc TBL_DiscreteTime[];
class FDiscreteTime :											
	public LFsaAppl											
{													
public:													
    enum {cvarINE, cvarExlusiveOR, cvarOrNot};
    void MooreAction();
	bool	FCreationOfLinksForVariables();								
    LFsaAppl* Create(CVarFSA *pCVF) { Q_UNUSED(pCVF) return new FDiscreteTime(nameFsa); }
	bool FInit();											
    FDiscreteTime(string strNam, LArc* pTBL = TBL_DiscreteTime);
	~FDiscreteTime(void);										
	CVar *pVarType;		// delay type 0-transport; 1- inertial
	CVar *pVarX1;		// input variable
	CVar *pVarStrNameX1;	// input variable name
    	CVar *pVarIfNotX1;	// inverse of the first input variable
    	CVar *pVarY1;		// output variable
	CVar *pVarStrNameY1;	// output variable name
	CVar *pVarValue01;	// delay value from 0 to 1
	CVar *pVarValue10;	// delay value from 1 to 0
    	CVar *pVarNegationY;// output inversion 0 - no inversion; 1- inversion
    	virtual int x3();	// input analysis
	virtual int x12();	// link setup analysis
    	virtual bool f();
    	int nTypeElement;
protected:
// predicates												
    int x1();
// actions												
	void y1(); void y4(); void y5(); void y6(); void y7(); void y12(); void y13(); 
    bool bType{false};	// delay type: false - transport; true - inertial;
    bool bX1{false};
    int nCurrent{0};
    int nDelay{0};		// tech. delay counter value
    LFsaAppl	*pFCall{nullptr};
    friend class FCallTransport;
    friend class FCallInertial;
};		

class FCallTransport :
	public LFsaAppl
{
public:
	void MooreAction();
	FCallTransport(FDiscreteTime	*pFDiscreteTime);
	FDiscreteTime	*pFDiscreteTime;
protected:
	int x1();
};

class FCallInertial :
	public LFsaAppl
{
public:
	void MooreAction();
	FCallInertial(FDiscreteTime	*pFDiscreteTime);
	FDiscreteTime	*pFDiscreteTime;
protected:
    int x1(); int x3();
};

#include "stdafx.h"
#include "FDiscreteTime.h"											
#include "VARFSA/SetVarFsaLibrary.h"
//=====================================================================
//		Delay model at the upper structural level of the view
//=====================================================================
LArc TBL_DiscreteTime[] = {
    LArc("st",	"st","^x12","y12"),	//
    LArc("st",	"ss","x12", "--"),	//
    LArc("ss",	"s1","x3",  "y7y6y13"),// transition to a single state
    LArc("ss",	"s0","^x3", "y4y5y13"),// transition to zero state
// creation of a nested automaton at the transition to a single state
    LArc("s0",	"s1","x3",  "y13"),    
// creation of a nested automaton at the transition to the zero state
    LArc("s1",	"s0","^x3", "y13"),    
    LArc()
};
FDiscreteTime::FDiscreteTime(string strNam, LArc* pTBL):
    LFsaAppl(pTBL, strNam, nullptr, nullptr)
{ }
													
FDiscreteTime::~FDiscreteTime(void) { if (pFCall) delete pFCall; }

bool FDiscreteTime::FInit() {										
    FCreationOfLinksForVariables();
    return true;
}

bool FDiscreteTime::FCreationOfLinksForVariables()
{
// Local variables
    pVarNegationY = CreateLocVar("negation", CLocVar::vtBool, "output inversion: 0-without inversion / 1-inversion");
    pVarType = CreateLocVar("type", CLocVar::vtBool, "delay type: 0-transp / 1-inertia");
    pVarY1 = CreateLocVar("y", CLocVar::vtBool, "local output");
    pVarX1 = CreateLocVar("x1", CLocVar::vtBool, "local input");
    pVarValue01 = CreateLocVar("value to 1", CLocVar::vtInteger, "delay value from 0 to 1");
    pVarValue10 = CreateLocVar("value to 0", CLocVar::vtInteger, "delay value from 1 to 0");
    pVarStrNameX1 = CreateLocVar("strNameX1", CLocVar::vtString, "name of external input variable (x)");
    pVarStrNameY1 = CreateLocVar("strNameY", CLocVar::vtString, "name of external output variable (y)");
    pVarIfNotX1 = CreateLocVar("not(x1)", CLocVar::vtBool, "1st input inversion: 0-without inversion / 1-inversion");
    string str;
    str = pVarStrNameX1->strGetDataSrc();
    if (str != "") { pVarX1 = pTAppCore->GetAddressVar(pVarStrNameX1->strGetDataSrc().c_str(), this);	}
    str = pVarStrNameY1->strGetDataSrc();
    if (str != "") { pVarY1 = pTAppCore->GetAddressVar(pVarStrNameY1->strGetDataSrc().c_str(), this);	}
    return true;
}
// predicates
int FDiscreteTime::x1() { return nCurrent == nDelay; }
//  
int FDiscreteTime::x3() {
    if (bool(pVarNegationY->GetDataSrc())) return !f();
    return f();
}
//
int FDiscreteTime::x12() { return pVarX1 != nullptr; }
//
bool FDiscreteTime::f() {
    bX1 = bool(pVarX1->GetDataSrc());
    if (bool(pVarIfNotX1->GetDataSrc())) bX1 = !bX1;
    return bX1;
}
// actions
// +1 to the current delay value
void FDiscreteTime::y1() { nCurrent++; }
// setting the delay value when switching from 0 to 1
void FDiscreteTime::y4() { nDelay = int(pVarValue01->GetDataSrc()); }
// setting output to zero
void FDiscreteTime::y5() { pVarY1->SetDataSrc(nullptr, 0.0); }
// setting output to unit
void FDiscreteTime::y6() { pVarY1->SetDataSrc(nullptr, 1); }
// setting the delay value when switching from 1 to 0
void FDiscreteTime::y7() { nDelay = int(pVarValue10->GetDataSrc()); }
//
void FDiscreteTime::y12() { FInit(); }
// creation, if a delay is determined, of the necessary nested automaton
void FDiscreteTime::y13() {
	nCurrent = 0;
	if (pFCall) { delete pFCall; pFCall = nullptr; }
	if (x1()) return;
	bType = pVarType->GetDataSrc();		// set delay type
	if (bType) pFCall = new FCallInertial(this);
	else pFCall = new FCallTransport(this);
	if (pFCall) pFCall->FCall(this);
}

void FDiscreteTime::MooreAction()
{
	string strState = FGetState();
	if (strState=="s0")	{ 
        y4(); y5();		// y4) setting the delay value when switching from 0 to 1; y5) set the output to zero
    }
	else if (strState=="s1") { 
        y7(); y6();		// y7) setting the delay value when switching from 1 to 0; y6) setting the output to one
    }
}
//=====================================================================
//				Transport delay
//=====================================================================
static LArc TBL_CallTransport[] = {
	LArc("s5","s5","^x1",	"--"),		//
	LArc("s5","00","x1",	"--"),		// 
	LArc()
};

FCallTransport::FCallTransport(FDiscreteTime	*pFI):
    LFsaAppl(TBL_CallTransport, "FCallTransport", nullptr, nullptr)
{
	pFDiscreteTime = pFI;
}
// . == 
int FCallTransport::x1() { return pFDiscreteTime->x1(); }
//
void FCallTransport::MooreAction()
{
	string strState = FGetState();
	if (strState=="s5")	{ pFDiscreteTime->y1(); }
}
//=====================================================================
//				Inertial delay
//=====================================================================
static LArc TBL_CallInertial[] = {
	LArc("s5",	"s5","^x1x3",	"--"),		//
	LArc("s5",	"00","x1x3",	"--"),		//
	LArc("s5",	"XX","^x3",	"--"),		//
	LArc()
};

FCallInertial::FCallInertial(FDiscreteTime	*pFI):
    LFsaAppl(TBL_CallInertial, "FCallInertial", nullptr, nullptr)
{
	pFDiscreteTime = pFI;
}
// . == 
int FCallInertial::x1() { return pFDiscreteTime->x1(); }
// input value (depends on the name of the current state of the main automaton)
int FCallInertial::x3() {
	string strState = FGetStateUp();
	bool bX = pFDiscreteTime->x3();
    if (strState == "s0") return bX;
    if (strState == "s1") return !bX;
	if (strState == "st") {
		string str = pFDiscreteTime->FGetNextState();
		bX = pFDiscreteTime->x3();
		if (!bX) {
			if (x1()) {
                if (str == "s0") return !bX;
                if (str == "s1") return bX;
			}
            else return true;
		}
		return true;
	}
	else return bX; 
}
//
void FCallInertial::MooreAction()
{
	string strState = FGetState();
	if (strState=="s5")	{ pFDiscreteTime->y1(); }
}


Listing 2. Menerapkan gerbang NAND
#include "lfsaappl.h"

#include "../FDiscreteTime.h"
extern LArc TBL_DiscreteTime[];
class FIne :
	public FDiscreteTime
{
public:
    bool	FCreationOfLinksForVariables() override;
    LFsaAppl* Create(CVarFSA *pCVF) override { Q_UNUSED(pCVF) return new FIne(nameFsa); }
    bool FInit() override;
    FIne(string strNam, LArc* TBL = TBL_DiscreteTime);
    ~FIne(void);
	CVar *pVarX2;		//  
	CVar *pVarStrNameX2;	//    
	CVar *pVarIfNotX2;	//    
	virtual bool f() override;
protected:
    	int x12() override;
    	bool bX2;
};

#include "stdafx.h"
#include <Ine/FIne.h>
#include "VARFSA/SetVarFsaLibrary.h"

FIne::FIne(string strNam, LArc* pTBL):
    FDiscreteTime(strNam, pTBL)
{
    nTypeElement = FDiscreteTime::cvarINE;
}

FIne::~FIne(void) { }

bool FIne::FInit() {										
// 	 		
	FCreationOfLinksForVariables();
//	 										
	return true;										
}

bool FIne::FCreationOfLinksForVariables() {
//  
	FDiscreteTime::FCreationOfLinksForVariables();
	//      x1, x2
    pVarIfNotX2 = CreateLocVar("not(x2)", CLocVar::vtBool, " 2- : 0- /1-");
	pVarX2 = CreateLocVar("x2", CLocVar::vtBool, " 2- ");
    //  ,         x2
	pVarStrNameX2 = CreateLocVar("strNameX2", CLocVar::vtString, "  2- .(x)");
	// :   ,     
    string str = pVarStrNameX2->strGetDataSrc();
    if (str != "") { pVarX2 = pTAppCore->GetAddressVar(pVarStrNameX2->strGetDataSrc().c_str(), this); }
//
	return true;
}
//
int FIne::x12() { return FDiscreteTime::x12() && pVarX2 != nullptr; }
//
bool FIne::f() {
    //  1- 
    FDiscreteTime::f();
    //   
    bX2 = bool(pVarX2->GetDataSrc());
    if (bool(pVarIfNotX2->GetDataSrc())) bX2 = !bX2;
    //   : 
    return bX1&&bX2;
}


Berkat OOP, kode model elemen logis DAN TIDAK terasa lebih kecil dari kode penundaan "induk". Selain itu, sebagian besar ditentukan oleh kebutuhan untuk membuat input tambahan untuk model elemen AND. Jika, pada level struktural, model cocok dengan jumlah input / output, maka kode akan lebih kecil. Jadi, kode implementasi untuk gerbang XOR yang dihasilkan dari model yang mirip secara struktural dari elemen AND-NOT ditunjukkan pada Listing 3.

Listing 3. Implementasi eksklusif atau gateway
#include <Ine/FIne.h>

extern LArc TBL_DiscreteTime[];
class FExlusiveOR :
    public FIne
{
public:
    LFsaAppl* Create(CVarFSA *pCVF) { return new FExlusiveOR(nameFsa); }
    FExlusiveOR(string strNam, LArc* TBL = TBL_DiscreteTime);
    ~FExlusiveOR(void);
protected:												
    bool f();
};

#include "stdafx.h"
#include "FExlusiveOR.h"

FExlusiveOR::FExlusiveOR(string strNam, LArc* pTBL):
    FIne(strNam, pTBL)
{
    nTypeElement = FDiscreteTime::cvarExlusiveOR;
}

FExlusiveOR::~FExlusiveOR(void) { }
//
bool FExlusiveOR::f() {
    FIne::f();
    return (bX1&&bX2)||(!bX1&&!bX2);
}


Di sini, metode f () dari kelas FExlusiveOR memanggil metode f () dari kelas FIne hanya untuk membaca nilai-nilai variabel input, kemudian tumpang tindih nilai fungsi NAND dengan nilai yang dihitung sesuai dengan fungsi logis dari kelas baru. Dalam gambar dan rupa, model elemen logika dua input lainnya dapat dibuat.

3. Kesimpulan


Untuk mengimplementasikan sirkuit digital apa pun, yang disebut set elemen logika yang lengkap secara fungsional sudah cukup. Misalnya, sekumpulan elemen AND, OR, NOT NOT. Kami memeriksa implementasi elemen logis berikut - penundaan, yang dapat menjadi inverter, AND-NOT dan EKSKLUSIF ATAU elemen. Mereka berhubungan dengan unsur-unsur dasar yang merupakan bagian dari set lengkap fungsional. Untuk menerapkan dan / atau mensimulasikan skema apa pun, tetap ditambahkan ke perpustakaan, misalnya, elemen OR-NOT atau menerapkan elemen kustom universal yang dikonfigurasi untuk elemen dari set lengkap fungsional. Dan ini sudah cukup.

Akibatnya, berdasarkan model-model di atas, kami menghadapi lingkungan CPSU dalam lingkungan penuh untuk pemodelan logis dari sirkuit digital, yang memungkinkan Anda untuk menghasilkan sejumlah proses dari elemen pustaka apa pun, mengonfigurasikannya, dan membuat koneksi di antara mereka. Pada saat yang sama, simulasi akan lebih rinci (dengan mempertimbangkan semua jenis keterlambatan), lebih fleksibel (Anda dapat mengonfigurasi elemen secara individual) daripada dalam kasus dua metode pemodelan logis khas yang disebutkan di atas - kompilasi dan acara. Dan itu tidak akan menjadi lingkungan khusus, seperti model proses perangkat lunak tetap tidak berubah, itu akan tetap seuniversal lingkungan pemrograman berorientasi objek lainnya berdasarkan penggunaan bahasa C ++.

Dan lebih lanjut tentang ... sakit. Sekali waktu, dihadapkan dengan apa yang salah dalam literatur ilmiah atau, lebih tepatnya, deskripsi elemen logis kunci sebagai pemicu RS sebenarnya buta huruf, serta fakta bahwa bahkan insinyur elektronik keren tidak tahu cara kerjanya secara detail pemicu, saya menghabiskan banyak waktu untuk mencari tahu ini. Dan saya dapat melaporkan bahwa saat ini dalam masalah pemicu, setidaknya bagi saya tidak ada tempat kosong (lihat detail [3]). Dan oleh karena itu, hanya untuk takjub bahwa, pada umumnya, tidak ada yang berubah. Seperti deskripsi tabular pemicu yang diberikan sebelumnya, itu masih diberikan sampai sekarang, karena ada negara terlarang yang terkenal jahat, dan mereka tetap sama, karena mereka mengeluh tentang pergantian pemicu yang tidak dapat diprediksi saat meninggalkan negara terlarang, mereka masih dalam ketidaktahuan yang sama. Dan meskipun inibahwa contoh deskripsi yang cukup akurat dari perilakunya sudah diketahui (lihat, misalnya, [4]).

Sungguh, "Perbuatanmu luar biasa, Tuan!" Tidak, tampaknya, di kepala "deskriptor RS-trigger" seperti itu ... pemrograman otomatis dan metode yang dipertimbangkan untuk memodelkan sirkuit logika di lingkungan VKPa. Dan jika Anda kembali ke topik artikel, maka, misalnya, menggunakan model elemen NAND di atas, Anda dapat dengan mudah membuat model pemicu dan mensimulasikan operasinya secara detail. Termasuk memperhitungkan sifat-sifat elemen logika nyata yang hanya memiliki tipe penundaan inersia. Nah, jika Anda membutuhkan bukti formal tentang sifat-sifat pemicu, maka itu diberikan pada [5].

literatur
1. ., ., . UML. . . : , 2007. – 493 .
2. ., ., . : . . – .: , 1988. – 309 .
3. . [ ], : habr.com/ru/post/484588 . . . ( 07.01.2020).
4. . . 2- . – .: , 2004. – 432.
5. .. . [ ], : cloud.mail.ru/public/HwsK/T95PMM8Ed . . . ( 01.02.2020).

All Articles