nedoPC.org

Community of electronics hobbyists established in 2002

...
Atom Feed | View unanswered posts | View active topics It is currently 03 Jul 2020 04:07



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

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

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

_________________
iLavr


01 Jul 2018 23:52
Profile
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 18678
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, но я как-то к этому скептически отношусь).

_________________
:eugeek: https://twitter.com/Shaos1973


02 Jul 2018 00:01
Profile WWW
Supreme God
User avatar

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

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

_________________
iLavr


02 Jul 2018 00:10
Profile
Admin
User avatar

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

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

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

_________________
:eugeek: https://twitter.com/Shaos1973


02 Jul 2018 00:22
Profile WWW
Supreme God
User avatar

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

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

_________________
iLavr


02 Jul 2018 00:48
Profile
Admin
User avatar

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

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

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

_________________
:eugeek: https://twitter.com/Shaos1973


02 Jul 2018 01:41
Profile WWW
Admin
User avatar

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

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


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

Вот формулы:

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


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

_________________
:eugeek: https://twitter.com/Shaos1973


02 Jul 2018 02:12
Profile WWW
Admin
User avatar

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

Attachment:
full_adder.png
full_adder.png [ 6.24 KiB | Viewed 3711 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:
full-adder-all-negative.jpg
full-adder-all-negative.jpg [ 177.67 KiB | Viewed 3711 times ]


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


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

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


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

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

_________________
:eugeek: https://twitter.com/Shaos1973


02 Jul 2018 23:09
Profile WWW
Admin
User avatar

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

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

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

_________________
:eugeek: https://twitter.com/Shaos1973


03 Jul 2018 22:47
Profile WWW
Doomed
User avatar

Joined: 21 Mar 2017 13:50
Posts: 594
Location: Spb
Reply with quote
Немного не понял как использовать третье состояние напрямую. Или имеется в виду многоступенчатая проверка состояния ноги?


04 Jul 2018 11:58
Profile
Admin
User avatar

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

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

_________________
:eugeek: https://twitter.com/Shaos1973


04 Jul 2018 14:29
Profile WWW
Doomed
User avatar

Joined: 21 Mar 2017 13:50
Posts: 594
Location: Spb
Reply with quote
Shaos wrote:
т.к. по входам третье состояние не прочитаешь...

А вот где-то попадалось, что на "довольно высоких" частотах прочитать можно за счет ёмкости выходов. Типа подаем на вход (переконфигурированный на выход) нолик, тут же переконфигурация на вход и читаем состояние, затем по такой же схеме подаём единичку и в итоге по анализу двух прочитанных значений определяем состояние Z.
P.S. Даже в теории выглядит весьма глупо, и не уверен что по такому принципу можно создать что-то стабильное.


04 Jul 2018 15:03
Profile
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 18678
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);

_________________
:eugeek: https://twitter.com/Shaos1973


05 Jul 2018 22:19
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 18678
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:

_________________
:eugeek: https://twitter.com/Shaos1973


05 Jul 2018 22:49
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 18678
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 257 times

_________________
:eugeek: https://twitter.com/Shaos1973
06 Jul 2018 00:42
Profile WWW
Display posts from previous:  Sort by  
Reply to topic   [ 43 posts ]  Go to page Previous  1, 2, 3  Next

Who is online

Users browsing this forum: No registered users and 2 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:  
cron
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.