Использование двоичного FPGA для реализации троичного компа

Уравновешенная троичная система счисления - форум переехал с http://ternary.info

Moderator: haqreu

User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Использование двоичного FPGA для реализации троичного ко

Post by Lavr »

Shaos wrote:На CPLD/FPGA наверное непросто будет эти "мухли" реализовать, так что я в лоб иду - 2 провода на трит и внутри, и снаружи...
Ну просто я помню, твой старый друк тебе тут в Ternary намекал про возможность использования третьего состояния в CPLD/FPGA, но я не полез тогда уточнять...
iLavr
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Использование двоичного FPGA для реализации троичного ко

Post by Shaos »

Lavr wrote:
Shaos wrote:На CPLD/FPGA наверное непросто будет эти "мухли" реализовать, так что я в лоб иду - 2 провода на трит и внутри, и снаружи...
Ну просто я помню, твой старый друк тебе тут в Ternary намекал про возможность использования третьего состояния в CPLD/FPGA, но я не полез тогда уточнять...
Да, в VHDL обычно юзают тип STD_LOGIC, который получается из STD_ULOGIC:

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
                       );
По идее всё это многообразие значений можно использовать и внутри программируемой логики, но во что оно выльется в реальной прошивке - фиг знает (били пара статей на тему использования 'Z' как третьего состояния внутри VHDL, но я как-то к этому скептически отношусь).
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Использование двоичного FPGA для реализации троичного ко

Post by Lavr »

Shaos wrote:
Lavr wrote:Ну просто я помню, твой старый друк тебе тут в Ternary намекал про возможность использования третьего состояния в CPLD/FPGA, но я не полез тогда уточнять...
...
...били пара статей на тему использования 'Z' как третьего состояния внутри VHDL, но я как-то к этому скептически отношусь.
А ссылочек нет? Я бы с интересом прочитал...
iLavr
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Использование двоичного FPGA для реализации троичного ко

Post by Shaos »

Lavr wrote:
Shaos wrote:
Lavr wrote:Ну просто я помню, твой старый друк тебе тут в Ternary намекал про возможность использования третьего состояния в CPLD/FPGA, но я не полез тогда уточнять...
...
...били пара статей на тему использования 'Z' как третьего состояния внутри VHDL, но я как-то к этому скептически отношусь.
А ссылочек нет? Я бы с интересом прочитал...
Да я только заголовки видел в гугле - при открытии пишет, что файла более не существует...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Использование двоичного FPGA для реализации троичного ко

Post by Lavr »

Shaos wrote:Да я только заголовки видел в гугле - при открытии пишет, что файла более не существует...
Статьи были англоязычные?
iLavr
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Использование двоичного FPGA для реализации троичного ко

Post by Shaos »

Lavr wrote:
Shaos wrote:Да я только заголовки видел в гугле - при открытии пишет, что файла более не существует...
Статьи были англоязычные?
Угу - из Индии ;)
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Использование двоичного FPGA для реализации троичного ко

Post by Shaos »

Полусумматор вот чего заюзал в Кулраннере:
fit1.png
По идее 4 макроячейки это по числу логических выходов - 2 на троичный выход S и 2 на троичный выход C

Вот формулы:
fit1e.png
Надо попробовать MEM-ы задействовать и посмотреть сколько они ресурсов чипа съедят (по идее должно быть по 2 макроячейки на каждый MEM)
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Использование двоичного FPGA для реализации троичного ко

Post by Shaos »

Полный троичный сумматор:
full_adder.png

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;
Инвертирование битов по входам и выходам (io_invert) нужно т.к. я заюзал переключатели (припаял на макетную половину платки) и светодиоды (воткнул через разъём) где активный уровень это 0:
FPGA-ternary-IO.jpg
Считаем 1+1+1 = 3
full-adder-all-positive.jpg
Считаем (-1)+(-1)+(-1) = -3
full-adder-all-negative.jpg
По сравнению с полусумматором тут добавился только один троичный вход (2 двоичных), но эта схема захватила аж 8 макроячеек (4%), т.е. в 2 раза больше, чем полусумматор:
full-adder-summary.png
Логические формулы:
full-adder-equations.png
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Использование двоичного FPGA для реализации троичного ко

Post by Shaos »

Shaos wrote:
Lavr wrote:Т.е. это будет чисто двухпроводная троичка безо всяких "мухлей" с высокоимпедансным состоянием или же резистивным делителем между двумя выводами?
(обсуждали мы такие варианты...)
На CPLD/FPGA наверное непросто будет эти "мухли" реализовать (если вообще возможно), так что я в лоб иду - 2 провода на трит и внутри, и снаружи...
Вроде возможно средствами VHDL наружу подавать третье состояние (для девайсов, которые это умеют) - т.е. по идее можно сократить количество используемых выходов вдвое...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Использование двоичного FPGA для реализации троичного ко

Post by Shaos »

AlexanderZh wrote:Немного не понял как использовать третье состояние напрямую. Или имеется в виду многоступенчатая проверка состояния ноги?
Да вот так: viewtopic.php?f=79&t=362
Это только для выходов, т.к. по входам третье состояние не прочитаешь...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Использование двоичного FPGA для реализации троичного ко

Post by Shaos »

Ну я пока буду с "двухпроводной троичкой" играться :)

Попробовал простейшую схемку, чтобы потестить свои три троичных переключателя и три красно-зелёных светодиода:

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;
Она ожидаемо заняла 6 микроячеек (по 2 на каждый троичный выход) и главное всё работает как надо ;)

Вот привязка ног кулраннера:

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 ; 
P.S. Ха, во как чётко Xilix ISE преобразовало вышеозначенную логику:

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
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Использование двоичного FPGA для реализации троичного ко

Post by Shaos »

Демультиплексор готов и проверен:

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;
Вот такие формулы получились, которые тоже влезли в 6 макроблоков:

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))); 
На очереди MEM, который должен быть процессом... :roll:
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Использование двоичного FPGA для реализации троичного ко

Post by Shaos »

После некоторых мучений сделал таки блок MEM:

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;
Пример, скомпилированный в теже 6 макроблоков:

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;
Чото совсем нелогично, что компоненты в VHDL маппятся за пределами главного процесса (с другой стороны для главного модуля процесс и ненужен - тогда надо блоков насоздавать и под муксы тоже).

Вот формулы:

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); 
Всё работает :mrgreen:
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Использование двоичного FPGA для реализации троичного ко

Post by Shaos »

Добавил компонент ternary_clock, который из двоичного клока получает троичную последовательность NOPONOPONOPO:

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;
Вроде работает. Правда результирующие формулы показывают, что на считающий триггер FTCPE подан 0, т.е. он считать не должен, но вроде бы считает:
********** 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);
Теперь у нас есть всё, чтобы загнать TRIADOR в CPLD/FPGA :mrgreen:
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Использование двоичного FPGA для реализации троичного ко

Post by Shaos »

И вот так можно подключать CPLD/FPGA в троичную систему:
ternary-fpga-interface.jpg
Получается в среднем один корпус DG403 на каждый троичный вход и на каждый троичный выход
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net