nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 28 Mar 2024 14:43



Reply to topic  [ 48 posts ]  Go to page Previous  1, 2, 3, 4  Next
Использование двоичного FPGA для реализации троичного компа 
Author Message
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Shaos wrote:
На CPLD/FPGA наверное непросто будет эти "мухли" реализовать, так что я в лоб иду - 2 провода на трит и внутри, и снаружи...

Ну просто я помню, твой старый друк тебе тут в Ternary намекал про возможность использования третьего состояния в CPLD/FPGA, но я не полез тогда уточнять...

_________________
iLavr


01 Jul 2018 22:52
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
Lavr wrote:
Shaos wrote:
На CPLD/FPGA наверное непросто будет эти "мухли" реализовать, так что я в лоб иду - 2 провода на трит и внутри, и снаружи...

Ну просто я помню, твой старый друк тебе тут в Ternary намекал про возможность использования третьего состояния в CPLD/FPGA, но я не полез тогда уточнять...

Да, в VHDL обычно юзают тип STD_LOGIC, который получается из STD_ULOGIC:
Code:
    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, но я как-то к этому скептически отношусь).

_________________
:dj: https://mastodon.social/@Shaos


01 Jul 2018 23:01
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Shaos wrote:
Lavr wrote:
Ну просто я помню, твой старый друк тебе тут в Ternary намекал про возможность использования третьего состояния в CPLD/FPGA, но я не полез тогда уточнять...
...
...били пара статей на тему использования 'Z' как третьего состояния внутри VHDL, но я как-то к этому скептически отношусь.

А ссылочек нет? Я бы с интересом прочитал...

_________________
iLavr


01 Jul 2018 23:10
Profile
Admin
User avatar

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

А ссылочек нет? Я бы с интересом прочитал...

Да я только заголовки видел в гугле - при открытии пишет, что файла более не существует...

_________________
:dj: https://mastodon.social/@Shaos


01 Jul 2018 23:22
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Shaos wrote:
Да я только заголовки видел в гугле - при открытии пишет, что файла более не существует...

Статьи были англоязычные?

_________________
iLavr


01 Jul 2018 23:48
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
Lavr wrote:
Shaos wrote:
Да я только заголовки видел в гугле - при открытии пишет, что файла более не существует...

Статьи были англоязычные?

Угу - из Индии ;)

_________________
:dj: https://mastodon.social/@Shaos


02 Jul 2018 00:41
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
Полусумматор вот чего заюзал в Кулраннере:

Attachment:
fit1.png
fit1.png [ 101.44 KiB | Viewed 14249 times ]


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

Вот формулы:

Attachment:
fit1e.png
fit1e.png [ 92.27 KiB | Viewed 14249 times ]


Надо попробовать MEM-ы задействовать и посмотреть сколько они ресурсов чипа съедят (по идее должно быть по 2 макроячейки на каждый MEM)

_________________
:dj: https://mastodon.social/@Shaos


02 Jul 2018 01:12
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
Полный троичный сумматор:

Attachment:
full_adder.png
full_adder.png [ 6.24 KiB | Viewed 14231 times ]


Code:
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:

Attachment:
FPGA-ternary-IO.jpg
FPGA-ternary-IO.jpg [ 14.16 KiB | Viewed 3894 times ]


Считаем 1+1+1 = 3

Attachment:
full-adder-all-positive.jpg
full-adder-all-positive.jpg [ 186.46 KiB | Viewed 14231 times ]


Считаем (-1)+(-1)+(-1) = -3

Attachment:
full-adder-all-negative.jpg
full-adder-all-negative.jpg [ 177.67 KiB | Viewed 14231 times ]


По сравнению с полусумматором тут добавился только один троичный вход (2 двоичных), но эта схема захватила аж 8 макроячеек (4%), т.е. в 2 раза больше, чем полусумматор:

Attachment:
full-adder-summary.png
full-adder-summary.png [ 102.07 KiB | Viewed 14231 times ]


Логические формулы:

Attachment:
full-adder-equations.png
full-adder-equations.png [ 120.47 KiB | Viewed 14231 times ]

_________________
:dj: https://mastodon.social/@Shaos


02 Jul 2018 22:09
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
Shaos wrote:
Lavr wrote:
Т.е. это будет чисто двухпроводная троичка безо всяких "мухлей" с высокоимпедансным состоянием или же резистивным делителем между двумя выводами?
(обсуждали мы такие варианты...)

На CPLD/FPGA наверное непросто будет эти "мухли" реализовать (если вообще возможно), так что я в лоб иду - 2 провода на трит и внутри, и снаружи...

Вроде возможно средствами VHDL наружу подавать третье состояние (для девайсов, которые это умеют) - т.е. по идее можно сократить количество используемых выходов вдвое...

_________________
:dj: https://mastodon.social/@Shaos


03 Jul 2018 21:47
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
AlexanderZh wrote:
Немного не понял как использовать третье состояние напрямую. Или имеется в виду многоступенчатая проверка состояния ноги?

Да вот так: http://www.nedopc.org/forum/viewtopic.php?f=79&t=362
Это только для выходов, т.к. по входам третье состояние не прочитаешь...

_________________
:dj: https://mastodon.social/@Shaos


04 Jul 2018 13:29
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
Ну я пока буду с "двухпроводной троичкой" играться :)

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

Code:
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:
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:
********** 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);

_________________
:dj: https://mastodon.social/@Shaos


05 Jul 2018 21:19
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
Демультиплексор готов и проверен:

Code:
        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:
********** 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:

_________________
:dj: https://mastodon.social/@Shaos


05 Jul 2018 21:49
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
После некоторых мучений сделал таки блок MEM - см. приаттаченный ternary.vhd

Пример, скомпилированный в теже 6 макроблоков:

Code:
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:
********** 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:


Attachments:
ternary.vhd [5.4 KiB]
Downloaded 685 times

_________________
:dj: https://mastodon.social/@Shaos
05 Jul 2018 23:42
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
Добавил компонент ternary_clock, который из двоичного клока получает троичную последовательность NOPONOPONOPO:

Code:
-- 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, т.е. он считать не должен, но вроде бы считает:

Quote:
********** 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:


Attachments:
ternary.vhd [7.04 KiB]
Downloaded 766 times

_________________
:dj: https://mastodon.social/@Shaos
06 Jul 2018 01:46
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
И вот так можно подключать CPLD/FPGA в троичную систему:

Attachment:
ternary-fpga-interface.jpg
ternary-fpga-interface.jpg [ 37.32 KiB | Viewed 13289 times ]


Получается в среднем один корпус DG403 на каждый троичный вход и на каждый троичный выход

_________________
:dj: https://mastodon.social/@Shaos


06 Jul 2018 02:05
Profile WWW
Display posts from previous:  Sort by  
Reply to topic   [ 48 posts ]  Go to page Previous  1, 2, 3, 4  Next

Who is online

Users browsing this forum: No registered users and 11 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.