
https://gitlab.com/ternary/trcm
Прожэкт на Хакадее: https://hackaday.io/project/160393-trcm
Moderator: Shaos
Code: Select all
// Wire states:
const char TRUE = 'P'; // прямое подключение к питанию
const char MAYBE = 'O'; // третье промежуточное состояние (для симуляции троичных схем)
const char FALSE = 'N'; // прямое подключение к земле
const char ANYBIT = 'X'; // любое двоичное значение для сравнений
const char ANYTRIT = 'Y'; // любое троичное значение для сравнений
const char NC = 'Z'; // не подключено (высокий импенданс)
const char PULLUP = '1'; // слабая подтяжка к питанию
const char PULLDOWN = '0'; // слабая подтяжка к земле
const char PULLMID = '-'; // слабая подтяжка к среднему значению
const char INVALID = '?'; // ошибка (конфликт)
// Aliases:
const char HIGHIMP = NC;
const char POSITIVE = TRUE;
const char NEUTRAL = MAYBE;
const char NEGATIVE = FALSE;
Code: Select all
#include "TRCMath.hpp"
using namespace std;
using namespace TRC;
int main()
{
Wire<5> a;
Wire<32> b;
Wire<1> signal,out;
Signal signal2;
Uint<32> u;
Sint<32> s;
s[0] = TRUE;
b[31] = FALSE;
s = b&&u;
signal = MAYBE;
signal2 = TRUE;
out = signal & signal2;
cout << "signal=" << signal << endl;
cout << "signal2=" << signal2 << endl;
cout << "out=" << out << endl;
cout << "a=" << a << endl;
cout << "b=" << b << endl;
cout << "u=" << u << endl;
cout << "s=" << s << endl;
}
Code: Select all
class Unit1 : public Entity
{
protected:
// индексы:
int i0,i1,i2;
// входы (например):
Wire<8> net;
Uint<8> bus;
// выходы (например):
Signal sig;
public:
Unit1()
{
// цепляемся к глобальным сигналам по именам
i0 = at("bus",8,PULLUP);
i1 = at("network",8);
i2 = at("single");
}
void run() // переименовать в step()?
{
// читаем наши входы
for(int i=0;i<8;i++)
bus[i] = io(i0+i).read();
for(int i=0;i<8;i++)
net[i] = io(i1+i).read();
// чего-то делаем
sig[0] = TRUE;
// применяем обратно наши выходы
io(i0) << sig[0];
io(i0+1) << sig[0];
io(i2) << sig[0];
// триггерная логика "аля Вэрилог":
if(posedge(i1+5))
{
// сюда попадаем если был положительный фронт на глобальном сигнале network[5]
}
}
};
Ну надо же!Shaos wrote:Вобщем я решил идти от уже проверенных промышленных подходов (добавив немного своего троичного) - на проводник могут накладываться вот такие значения:Code: Select all
const char TRUE = 'P'; // прямое подключение к питанию const char MAYBE = 'O'; // третье промежуточное состояние (для симуляции троичных схем) const char FALSE = 'N'; // прямое подключение к земле const char NC = 'Z'; // не подключено (высокий импенданс) const char PULLUP = '1'; // слабая подтяжка к питанию const char PULLDOWN = '0'; // слабая подтяжка к земпле const char INVALID = 'X'; // ошибка (конфликт)
Без них ты и троичную логику не сымитируешьShaos wrote:Ну таки хаки, только без них FPGA не сымитируешь
Ну если там всё железобетнно - входы есть входы, выходы есть выходы, то вполне можно и сымитироватьLavr wrote:Без них ты и троичную логику не сымитируешьShaos wrote:Ну таки хаки, только без них FPGA не сымитируешьНо ты ведь так упирался!
![]()
viewtopic.php?p=140444#p140444
Железно ли, бетОнно ли, но одними лог. "0" и "1" - не обойтись.Shaos wrote:Ну если там всё железобетнно - входы есть входы, выходы есть выходы, то вполне можно и сымитироватьLavr wrote:Без них ты и троичную логику не сымитируешь![]()
Да я собственно свой DDT имел ввиду - там только 3 значения N,O,P и никаких «грязных хаков»Lavr wrote:Железно ли, бетОнно ли, но одними лог. "0" и "1" - не обойтись.Shaos wrote:Ну если там всё железобетнно - входы есть входы, выходы есть выходы, то вполне можно и сымитироватьLavr wrote:Без них ты и троичную логику не сымитируешь![]()
![]()
Придётся так или иначе вводить лог. "1/2" , несмотря на то, что "входы есть входы, выходы есть выходы".
С другой стороны когда всё навиду, то всё прозрачно, вот так например можно Z-состояние делать:Shaos wrote:Я вот думаю что наверное надо спрятать от юзера чтение снаружи и запись вовне - скажем неявно это делать для железобетонных входов и железобетонных выходов (а такие точно будут).
Code: Select all
if(enabled)
io(network1)<<store;
else
io(network1)<<NC;
Ну 0 и 1 тоже уже не буквыLavr wrote:Кстати, " ? " , на мой взгляд, будет сбивать с толку. Лучше подбери подходящую букву.
Code: Select all
#include "TRCMath.hpp"
using namespace std;
using namespace TRC;
class MyUnit : public Entity
{
protected:
// indecies:
int i0,i1,i2;
// inputs:
Wire<8> net;
// outputs:
Signal sig;
public:
MyUnit(const char* s) : Entity(s)
{
i0 = at("bus",8,PULLUP);
i1 = at(".network",8);
i2 = at("single");
}
void step()
{
for(int i=0;i<8;i++)
net[i] = io(i1+i).read();
sig[0] = TRUE;
if(posedge(i1+5))
{
}
io(i0) << sig[0];
io(i0+1) << sig[0];
io(i2) << sig[0];
}
};
int main()
{
Wire<5> a;
Wire<32> b;
Wire<1> signal,out;
Signal signal2;
Uint<32> u;
Sint<32> s;
s[0] = TRUE;
b[31] = FALSE;
s = b&&u;
signal = MAYBE;
signal2 = TRUE;
out = signal & signal2;
cout << "signal=" << signal << endl;
cout << "signal2=" << signal2 << endl;
cout << "out=" << out << endl;
cout << "a=" << a << endl;
cout << "b=" << b << endl;
cout << "u=" << u << endl;
cout << "s=" << s << endl;
System *sys = System::getInstance();
class Unit1 : public MyUnit
{
public:
Unit1() : MyUnit("Unit1")
{
i2 = at("single2");
}
} u1;
sys->clean();
u1.step();
}
Code: Select all
#include "TRCMath.hpp"
using namespace std;
using namespace TRC;
class MyUnit : public Entity
{
protected:
// indecies:
int i0,i1,i2;
// inputs:
Wire<8> net;
// outputs:
Signal sig;
// internal objects:
class InternalUnit : public Entity
{
public:
int i1;
InternalUnit(string s) : Entity(s.c_str())
{
i1 = at(".local");
}
void step()
{
}
}*u1,*u2;
public:
MyUnit(const char* s) : Entity(s)
{
i0 = at("bus",8,PULLUP);
i1 = at(".network",8);
i2 = at("single");
u1 = new InternalUnit(name("u1"));
u2 = new InternalUnit(name("u2"));
}
void step()
{
for(int i=0;i<8;i++)
net[i] = io(i1+i).read();
sig[0] = TRUE;
if(posedge(i1+5))
{
}
io(i0) << sig[0];
io(i0+1) << sig[0];
io(i2) << sig[0];
}
};
int main()
{
Wire<5> a;
Wire<32> b;
Wire<1> signal,out;
Signal signal2;
Uint<32> u;
Sint<32> s;
s[0] = TRUE;
b[31] = FALSE;
s = b&&u;
signal = MAYBE;
signal2 = TRUE;
out = signal & signal2;
cout << "signal=" << signal << endl;
cout << "signal2=" << signal2 << endl;
cout << "out=" << out << endl;
cout << "a=" << a << endl;
cout << "b=" << b << endl;
cout << "u=" << u << endl;
cout << "s=" << s << endl;
System *sys = System::getInstance();
class Unit1 : public MyUnit
{
public:
Unit1() : MyUnit("Unit1")
{
i2 = at("single2");
}
} u1;
sys->prepare();
u1.step();
}
Code: Select all
signal=O
signal2=P
out=O
a=ZZZZZ
b=ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZN
u=ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
s=????????????????????????????????
bus[0] <- Unit1
bus[1] <- Unit1
bus[2] <- Unit1
bus[3] <- Unit1
bus[4] <- Unit1
bus[5] <- Unit1
bus[6] <- Unit1
bus[7] <- Unit1
Unit1.network[0] <- Unit1
Unit1.network[1] <- Unit1
Unit1.network[2] <- Unit1
Unit1.network[3] <- Unit1
Unit1.network[4] <- Unit1
Unit1.network[5] <- Unit1
Unit1.network[6] <- Unit1
Unit1.network[7] <- Unit1
single <- Unit1
Unit1.u1.local <- Unit1.u1
Unit1.u2.local <- Unit1.u2
single2 <- Unit1