Ну просто я помню, твой старый друк тебе тут в Ternary намекал про возможность использования третьего состояния в CPLD/FPGA, но я не полез тогда уточнять...Shaos wrote:На CPLD/FPGA наверное непросто будет эти "мухли" реализовать, так что я в лоб иду - 2 провода на трит и внутри, и снаружи...
Использование двоичного FPGA для реализации троичного компа
Moderator: haqreu
-
- Supreme God
- Posts: 16676
- Joined: 21 Oct 2009 08:08
- Location: Россия
Re: Использование двоичного FPGA для реализации троичного ко
iLavr
-
- Admin
- Posts: 23989
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Использование двоичного FPGA для реализации троичного ко
Да, в VHDL обычно юзают тип STD_LOGIC, который получается из STD_ULOGIC:Lavr wrote:Ну просто я помню, твой старый друк тебе тут в Ternary намекал про возможность использования третьего состояния в CPLD/FPGA, но я не полез тогда уточнять...Shaos wrote:На CPLD/FPGA наверное непросто будет эти "мухли" реализовать, так что я в лоб иду - 2 провода на трит и внутри, и снаружи...
Code: Select all
TYPE std_ulogic IS ( 'U', -- Uninitialized
'X', -- Forcing Unknown
'0', -- Forcing 0
'1', -- Forcing 1
'Z', -- High Impedance
'W', -- Weak Unknown
'L', -- Weak 0
'H', -- Weak 1
'-' -- Don't care
);
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Supreme God
- Posts: 16676
- Joined: 21 Oct 2009 08:08
- Location: Россия
Re: Использование двоичного FPGA для реализации троичного ко
А ссылочек нет? Я бы с интересом прочитал...Shaos wrote:...Lavr wrote:Ну просто я помню, твой старый друк тебе тут в Ternary намекал про возможность использования третьего состояния в CPLD/FPGA, но я не полез тогда уточнять...
...били пара статей на тему использования 'Z' как третьего состояния внутри VHDL, но я как-то к этому скептически отношусь.
iLavr
-
- Admin
- Posts: 23989
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Использование двоичного FPGA для реализации троичного ко
Да я только заголовки видел в гугле - при открытии пишет, что файла более не существует...Lavr wrote:А ссылочек нет? Я бы с интересом прочитал...Shaos wrote:...Lavr wrote:Ну просто я помню, твой старый друк тебе тут в Ternary намекал про возможность использования третьего состояния в CPLD/FPGA, но я не полез тогда уточнять...
...били пара статей на тему использования 'Z' как третьего состояния внутри VHDL, но я как-то к этому скептически отношусь.
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Supreme God
- Posts: 16676
- Joined: 21 Oct 2009 08:08
- Location: Россия
Re: Использование двоичного FPGA для реализации троичного ко
Статьи были англоязычные?Shaos wrote:Да я только заголовки видел в гугле - при открытии пишет, что файла более не существует...
iLavr
-
- Admin
- Posts: 23989
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Использование двоичного FPGA для реализации троичного ко
Угу - из ИндииLavr wrote:Статьи были англоязычные?Shaos wrote:Да я только заголовки видел в гугле - при открытии пишет, что файла более не существует...

Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Admin
- Posts: 23989
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Использование двоичного FPGA для реализации троичного ко
Полусумматор вот чего заюзал в Кулраннере:
По идее 4 макроячейки это по числу логических выходов - 2 на троичный выход S и 2 на троичный выход C
Вот формулы:
Надо попробовать MEM-ы задействовать и посмотреть сколько они ресурсов чипа съедят (по идее должно быть по 2 макроячейки на каждый MEM)
По идее 4 макроячейки это по числу логических выходов - 2 на троичный выход S и 2 на троичный выход C
Вот формулы:
Надо попробовать MEM-ы задействовать и посмотреть сколько они ресурсов чипа съедят (по идее должно быть по 2 макроячейки на каждый MEM)
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Admin
- Posts: 23989
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Использование двоичного FPGA для реализации троичного ко
Полный троичный сумматор:
Инвертирование битов по входам и выходам (io_invert) нужно т.к. я заюзал переключатели (припаял на макетную половину платки) и светодиоды (воткнул через разъём) где активный уровень это 0:
Считаем 1+1+1 = 3
Считаем (-1)+(-1)+(-1) = -3
По сравнению с полусумматором тут добавился только один троичный вход (2 двоичных), но эта схема захватила аж 8 макроячеек (4%), т.е. в 2 раза больше, чем полусумматор:
Логические формулы:
Code: Select all
use ternary.all;
entity main is
Port ( a : in FakeTrit;
b : in FakeTrit;
c : in FakeTrit;
s : out FakeTrit;
c2 : out FakeTrit
);
end main;
architecture Behavioral of main is
signal r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14 : FakeTrit;
signal a1,b1,c1,s1,cc1 : FakeTrit;
begin
process (a,b,c)
FUNCTION io_invert(T: FakeTrit) RETURN FakeTrit IS
begin
case T is
when N =>
return P;
when O =>
return X;
when P =>
return N;
when others =>
return O;
end case;
end;
begin
a1 <= io_invert(a);
b1 <= io_invert(b);
c1 <= io_invert(c);
r1 <= mux(a1,O,P,N);
r2 <= mux(a1,P,N,O);
r3 <= mux(b1,r1,r2,a1);
r4 <= mux(b1,r2,a1,r1);
r5 <= mux(b1,a1,r1,r2);
r6 <= mux(c1,r3,r4,r5);
r7 <= e21(a1,N,O);
r8 <= e12(a1,N,O);
r9 <= e21(a1,O,P);
r10 <= e12(a1,O,P);
r11 <= mux(b1,r7,r8,O);
r12 <= mux(b1,r8,O,r9);
r13 <= mux(b1,O,r9,r10);
r14 <= mux(c1,r11,r12,r13);
s1 <= r6;
cc1 <= r14;
s <= io_invert(s1);
c2 <= io_invert(cc1);
end process;
end Behavioral;
Считаем 1+1+1 = 3
Считаем (-1)+(-1)+(-1) = -3
По сравнению с полусумматором тут добавился только один троичный вход (2 двоичных), но эта схема захватила аж 8 макроячеек (4%), т.е. в 2 раза больше, чем полусумматор:
Логические формулы:
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Admin
- Posts: 23989
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Использование двоичного FPGA для реализации троичного ко
Вроде возможно средствами VHDL наружу подавать третье состояние (для девайсов, которые это умеют) - т.е. по идее можно сократить количество используемых выходов вдвое...Shaos wrote:На CPLD/FPGA наверное непросто будет эти "мухли" реализовать (если вообще возможно), так что я в лоб иду - 2 провода на трит и внутри, и снаружи...Lavr wrote:Т.е. это будет чисто двухпроводная троичка безо всяких "мухлей" с высокоимпедансным состоянием или же резистивным делителем между двумя выводами?
(обсуждали мы такие варианты...)
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Admin
- Posts: 23989
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Использование двоичного FPGA для реализации троичного ко
Да вот так: viewtopic.php?f=79&t=362AlexanderZh wrote:Немного не понял как использовать третье состояние напрямую. Или имеется в виду многоступенчатая проверка состояния ноги?
Это только для выходов, т.к. по входам третье состояние не прочитаешь...
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Admin
- Posts: 23989
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Использование двоичного FPGA для реализации троичного ко
Ну я пока буду с "двухпроводной троичкой" играться 
Попробовал простейшую схемку, чтобы потестить свои три троичных переключателя и три красно-зелёных светодиода:
Она ожидаемо заняла 6 микроячеек (по 2 на каждый троичный выход) и главное всё работает как надо 
Вот привязка ног кулраннера:
P.S. Ха, во как чётко Xilix ISE преобразовало вышеозначенную логику:

Попробовал простейшую схемку, чтобы потестить свои три троичных переключателя и три красно-зелёных светодиода:
Code: Select all
entity main is
Port ( a : in FakeTrit;
b : in FakeTrit;
c : in FakeTrit;
s1 : out FakeTrit;
s2 : out FakeTrit;
s3 : out FakeTrit);
end main;
architecture Behavioral of main is
signal a1,b1,c1,ss1,ss2,ss3 : FakeTrit;
begin
process (a,b,c)
begin
a1 <= io_invert(a);
b1 <= io_invert(b);
c1 <= io_invert(c);
ss1 <= a1;
ss2 <= b1;
ss3 <= c1;
s1 <= io_invert(ss1);
s2 <= io_invert(ss2);
s3 <= io_invert(ss3);
end process;
end Behavioral;

Вот привязка ног кулраннера:
Code: Select all
NET "a<0>" LOC = "P140" | IOSTANDARD = LVTTL ;
NET "a<1>" LOC = "P142" | IOSTANDARD = LVTTL ;
NET "b<0>" LOC = "P138" | IOSTANDARD = LVTTL ;
NET "b<1>" LOC = "P139" | IOSTANDARD = LVTTL ;
NET "c<0>" LOC = "P136" | IOSTANDARD = LVTTL ;
NET "c<1>" LOC = "P137" | IOSTANDARD = LVTTL ;
NET "s3<0>" LOC = "P82" | IOSTANDARD = LVTTL ;
NET "s3<1>" LOC = "P83" | IOSTANDARD = LVTTL ;
NET "s2<0>" LOC = "P85" | IOSTANDARD = LVTTL ;
NET "s2<1>" LOC = "P86" | IOSTANDARD = LVTTL ;
NET "s1<0>" LOC = "P87" | IOSTANDARD = LVTTL ;
NET "s1<1>" LOC = "P88" | IOSTANDARD = LVTTL ;
Code: Select all
********** Mapped Logic **********
s1(0) <= a(0);
s1(1) <= a(1);
s2(0) <= b(0);
s2(1) <= b(1);
s3(0) <= c(0);
s3(1) <= c(1);
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Admin
- Posts: 23989
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Использование двоичного FPGA для реализации троичного ко
Демультиплексор готов и проверен:
Вот такие формулы получились, которые тоже влезли в 6 макроблоков:
На очереди MEM, который должен быть процессом... 
Code: Select all
PROCEDURE dmux(signal T_C: IN FakeTrit;
signal T_I: IN FakeTrit;
signal T_N: OUT FakeTrit;
signal T_O: OUT FakeTrit;
signal T_P: OUT FakeTrit) IS
begin
case T_C is
when N =>
T_N <= T_I;
T_O <= O;
T_P <= O;
when O =>
T_N <= O;
T_O <= T_I;
T_P <= O;
when P =>
T_N <= O;
T_O <= O;
T_P <= T_I;
when others =>
T_N <= X;
T_O <= X;
T_P <= X;
end case;
end;
Code: Select all
********** Mapped Logic **********
s1(0) <= ((a(1))
OR (b(0) AND a(0)));
s1(1) <= ((a(1))
OR (a(0) AND b(1)));
s2(0) <= NOT (((NOT a(0) AND NOT a(1))
OR (NOT b(0) AND a(0) AND a(1))));
s2(1) <= NOT (((NOT a(0) AND NOT a(1))
OR (a(0) AND a(1) AND NOT b(1))));
s3(0) <= ((a(0))
OR (b(0) AND a(1)));
s3(1) <= ((a(0))
OR (a(1) AND b(1)));

Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Admin
- Posts: 23989
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Использование двоичного FPGA для реализации троичного ко
После некоторых мучений сделал таки блок MEM:
Пример, скомпилированный в теже 6 макроблоков:
Чото совсем нелогично, что компоненты в VHDL маппятся за пределами главного процесса (с другой стороны для главного модуля процесс и ненужен - тогда надо блоков насоздавать и под муксы тоже).
Вот формулы:
Всё работает 
Code: Select all
USE ternary.ALL;
ENTITY ternary_mem IS
PORT (
T_C : IN FakeTrit;
T_N : IN FakeTrit;
T_P : IN FakeTrit;
T_Q : OUT FakeTrit
);
END ternary_mem;
ARCHITECTURE Behavioral OF ternary_mem IS
BEGIN
PROCESS (T_C)
BEGIN
IF (T_C(0) = '1') THEN
T_Q <= T_P;
ELSIF (T_C(1) = '1') THEN
T_Q <= T_N;
END IF;
END PROCESS;
END Behavioral;
Code: Select all
use ternary.all;
entity main is
Port ( a : in FakeTrit;
b : in FakeTrit;
c : in FakeTrit;
s1 : out FakeTrit;
s2 : out FakeTrit;
s3 : out FakeTrit );
end main;
architecture Behavioral of main is
signal a1,b1,c1,ss1,ss2,ss3 : FakeTrit;
begin
mem1: ternary_mem port map( T_C => a1, T_N => b1, T_P => c1, T_Q => ss1);
process (a,b,c)
FUNCTION io_invert(T: FakeTrit) RETURN FakeTrit IS
begin
case T is
when N =>
return P;
when O =>
return X;
when P =>
return N;
when others =>
return O;
end case;
end;
begin
a1 <= io_invert(a);
b1 <= io_invert(b);
c1 <= io_invert(c);
ss2 <= O;
ss3 <= O;
s1 <= io_invert(ss1);
s2 <= io_invert(ss2);
s3 <= io_invert(ss3);
end process;
end Behavioral;
Вот формулы:
Code: Select all
********** Mapped Logic **********
LDCP_s10: LDCP port map (s1(0),s1_D(0),NOT a(1),s1_CLR(0),s1_PRE(0));
s1_D(0) <= NOT (((a(0) AND NOT b(0))
OR (NOT a(0) AND NOT c(0))));
s1_CLR(0) <= (NOT a(0) AND NOT c(0));
s1_PRE(0) <= (NOT a(0) AND c(0));
LDCP_s11: LDCP port map (s1(1),s1_D(1),NOT a(1),s1_CLR(1),s1_PRE(1));
s1_D(1) <= NOT (((a(0) AND NOT b(1))
OR (NOT a(0) AND NOT c(1))));
s1_CLR(1) <= (NOT a(0) AND NOT c(1));
s1_PRE(1) <= (NOT a(0) AND c(1));
s2(0) <= NOT ('0');
s2(1) <= NOT ('0');
s3(0) <= NOT ('0');
s3(1) <= NOT ('0');
Register Legend:
FDCPE (Q,D,C,CLR,PRE,CE);
FDDCPE (Q,D,C,CLR,PRE,CE);
FTCPE (Q,D,C,CLR,PRE,CE);
FTDCPE (Q,D,C,CLR,PRE,CE);
LDCP (Q,D,G,CLR,PRE);

Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Admin
- Posts: 23989
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Использование двоичного FPGA для реализации троичного ко
Добавил компонент ternary_clock, который из двоичного клока получает троичную последовательность NOPONOPONOPO:
Вроде работает. Правда результирующие формулы показывают, что на считающий триггер FTCPE подан 0, т.е. он считать не должен, но вроде бы считает:

Code: Select all
-- Entity ternary_clock
USE ternary.ALL;
ENTITY ternary_clock IS
PORT (
B_C : IN BIT;
T_C : OUT FakeTrit
);
END ternary_clock;
ARCHITECTURE Behavioral OF ternary_clock IS
signal flag : bit;
BEGIN
PROCESS (B_C)
BEGIN
IF (B_C'event AND B_C = '1') THEN
IF (flag = '0') THEN
flag <= '1';
ELSE
flag <= '0';
END IF;
END IF;
IF (B_C = '1' AND flag = '0') THEN
T_C(0) <= '1';
ELSE
T_C(0) <= '0';
END IF;
IF (B_C = '1' AND flag = '1') THEN
T_C(1) <= '1';
ELSE
T_C(1) <= '0';
END IF;
END PROCESS;
END Behavioral;
Теперь у нас есть всё, чтобы загнать TRIADOR в CPLD/FPGA********** Mapped Logic **********
FTCPE_mem1/flag: FTCPE port map (mem1/flag,'0',clk,'0','0','1');
s1(0) <= NOT ((clk AND NOT mem1/flag));
s1(1) <= NOT ((clk AND mem1/flag));
s2(0) <= b(0);
s2(1) <= b(1);
s3(0) <= c(0);
s3(1) <= c(1);
Register Legend:
FDCPE (Q,D,C,CLR,PRE,CE);
FDDCPE (Q,D,C,CLR,PRE,CE);
FTCPE (Q,D,C,CLR,PRE,CE);
FTDCPE (Q,D,C,CLR,PRE,CE);
LDCP (Q,D,G,CLR,PRE);

You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
-
- Admin
- Posts: 23989
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Использование двоичного FPGA для реализации троичного ко
И вот так можно подключать CPLD/FPGA в троичную систему:
Получается в среднем один корпус DG403 на каждый троичный вход и на каждый троичный выход
Получается в среднем один корпус DG403 на каждый троичный вход и на каждый троичный выход
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net