Ну просто я помню, твой старый друк тебе тут в Ternary намекал про возможность использования третьего состояния в CPLD/FPGA, но я не полез тогда уточнять...Shaos wrote:На CPLD/FPGA наверное непросто будет эти "мухли" реализовать, так что я в лоб иду - 2 провода на трит и внутри, и снаружи...
Использование двоичного FPGA для реализации троичного компа
Moderator: haqreu
- 
				Lavr
														 - Supreme God
 - Posts: 16804
 - Joined: 21 Oct 2009 08:08
 - Location: Россия
 
Re: Использование двоичного FPGA для реализации троичного ко
iLavr
			
						- 
				Shaos
														 - Admin
 - Posts: 24441
 - 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
                       );
- 
				Lavr
														 - Supreme God
 - Posts: 16804
 - Joined: 21 Oct 2009 08:08
 - Location: Россия
 
Re: Использование двоичного FPGA для реализации троичного ко
А ссылочек нет? Я бы с интересом прочитал...Shaos wrote:...Lavr wrote:Ну просто я помню, твой старый друк тебе тут в Ternary намекал про возможность использования третьего состояния в CPLD/FPGA, но я не полез тогда уточнять...
...били пара статей на тему использования 'Z' как третьего состояния внутри VHDL, но я как-то к этому скептически отношусь.
iLavr
			
						- 
				Shaos
														 - Admin
 - Posts: 24441
 - Joined: 08 Jan 2003 23:22
 - Location: Silicon Valley
 
Re: Использование двоичного FPGA для реализации троичного ко
Да я только заголовки видел в гугле - при открытии пишет, что файла более не существует...Lavr wrote:А ссылочек нет? Я бы с интересом прочитал...Shaos wrote:...Lavr wrote:Ну просто я помню, твой старый друк тебе тут в Ternary намекал про возможность использования третьего состояния в CPLD/FPGA, но я не полез тогда уточнять...
...били пара статей на тему использования 'Z' как третьего состояния внутри VHDL, но я как-то к этому скептически отношусь.
- 
				Lavr
														 - Supreme God
 - Posts: 16804
 - Joined: 21 Oct 2009 08:08
 - Location: Россия
 
Re: Использование двоичного FPGA для реализации троичного ко
Статьи были англоязычные?Shaos wrote:Да я только заголовки видел в гугле - при открытии пишет, что файла более не существует...
iLavr
			
						- 
				Shaos
														 - Admin
 - Posts: 24441
 - Joined: 08 Jan 2003 23:22
 - Location: Silicon Valley
 
Re: Использование двоичного FPGA для реализации троичного ко
Угу - из ИндииLavr wrote:Статьи были англоязычные?Shaos wrote:Да я только заголовки видел в гугле - при открытии пишет, что файла более не существует...
- 
				Shaos
														 - Admin
 - Posts: 24441
 - 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.
			
						
										
						- 
				Shaos
														 - Admin
 - Posts: 24441
 - 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.
			
						
										
						- 
				Shaos
														 - Admin
 - Posts: 24441
 - Joined: 08 Jan 2003 23:22
 - Location: Silicon Valley
 
Re: Использование двоичного FPGA для реализации троичного ко
Вроде возможно средствами VHDL наружу подавать третье состояние (для девайсов, которые это умеют) - т.е. по идее можно сократить количество используемых выходов вдвое...Shaos wrote:На CPLD/FPGA наверное непросто будет эти "мухли" реализовать (если вообще возможно), так что я в лоб иду - 2 провода на трит и внутри, и снаружи...Lavr wrote:Т.е. это будет чисто двухпроводная троичка безо всяких "мухлей" с высокоимпедансным состоянием или же резистивным делителем между двумя выводами?
(обсуждали мы такие варианты...)
- 
				Shaos
														 - Admin
 - Posts: 24441
 - Joined: 08 Jan 2003 23:22
 - Location: Silicon Valley
 
Re: Использование двоичного FPGA для реализации троичного ко
Да вот так: viewtopic.php?f=79&t=362AlexanderZh wrote:Немного не понял как использовать третье состояние напрямую. Или имеется в виду многоступенчатая проверка состояния ноги?
Это только для выходов, т.к. по входам третье состояние не прочитаешь...
- 
				Shaos
														 - Admin
 - Posts: 24441
 - 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); 
- 
				Shaos
														 - Admin
 - Posts: 24441
 - 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))); 
- 
				Shaos
														 - Admin
 - Posts: 24441
 - 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); 
- 
				Shaos
														 - Admin
 - Posts: 24441
 - 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.
			
						
										
						- 
				Shaos
														 - Admin
 - Posts: 24441
 - 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.
			
						
										
						
				