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

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

Moderator: haqreu

User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

Я почти вплотную приблизился к созданию троичного компьютера вот на этом железе:

Image

Конечно же это будет 3niti alpha ;)
На котором можно написать эмулятор системы команд Тунгуски...

Внутри троичный сигнал будет состоять из двух двоичных:

00 - O (zero)
10 - N (negative)
01 - P (positive)
11 - X (exception or fatal error)

Если в качестве исходных схем использовать схемы для тримулятора, то там четвёртое значение - это Z (disconnected).

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

UPDATE: Последняя версия троичной VHDL-либы с примерами всегда будет тут:

https://gitlab.com/ternary/ternary/-/tree/master/vhdl
User avatar
JeNNeR
Fanat
Posts: 52
Joined: 18 Nov 2014 09:17
Location: Отсюда

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

Post by JeNNeR »

Думаю, имеет смысл переставить местами O и Z,
в смысле, Z = 00 (отключено/ошибка), O = 11 (положительный сигнал + отрицательный сигнал)
Тогда Z будет действительно disconnected

----
З.Ы. Некропостер :)
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

Shaos wrote:Внутри троичный сигнал будет состоять из двух двоичных:

00 - O (zero)
10 - N (negative)
01 - P (positive)
11 - X (exception or fatal error)

Если в качестве исходных схем использовать схемы для тримулятора, то там четвёртое значение - это Z (disconnected).

Я думаю, что сначала я всё таки сделаю первый вариант - непосредственно на языке схем Xilinx. Второй же вариант подразумевает наличие некоего конвертера из схем тримулятора в VHDL (что вполне возможно сделать, но требует некоторого времени).
Для начала можно взять CPLD от Xilinx - всё равно тот же VHDL будет использоваться:

Image

А в качестве исходных схем таки будет Logisim :mrgreen:
Ну и DDT, когда оно таки заработает как полноценный автомат...

P.S. Задача номер раз - узнать сколько троичных мультиплексоров влезет в CollRunner-II XC2C256/144 :roll:
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

в VHDL вроде как можно заводить типы данных:

Code: Select all

type Trit is (O, P, N, X);
однако я нигде не нашёл информации во что это в результате выльется, поэтому начать можно с простого:

Code: Select all

entity main is
    Port ( a : in  STD_LOGIC_VECTOR (1 downto 0);
           b : in  STD_LOGIC_VECTOR (1 downto 0);
           c : out  STD_LOGIC_VECTOR (1 downto 0);
           s : out  STD_LOGIC_VECTOR (1 downto 0));
end main;
тогда "00" будет O, "01" будет P и "10" будет N - можно даже завести константы под это дело:

Code: Select all

constant O : STD_LOGIC_VECTOR (1 downto 0) := "00";
constant P : STD_LOGIC_VECTOR (1 downto 0) := "01";
constant N : STD_LOGIC_VECTOR (1 downto 0) := "10";
constant X : STD_LOGIC_VECTOR (1 downto 0) := "11";
P.S. X - это исключение, которое должно останавливать всю систему и сигнализировать о фатальной ошибке...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

Начальная реализация пакета ternary.vhd:

Code: Select all

--  ternary.vhd - balanced ternary simulation for VHDL
--
--  Copyright (C) 2018, TERNARY RESEARCH CORPORATION <vhdl@ternary.info>
--
--  This program is free software: you can redistribute it and/or modify
--  it under the terms of the GNU General Public License as published by
--  the Free Software Foundation, either version 3 of the License, or
--  (at your option) any later version.
--
--  This program is distributed in the hope that it will be useful,
--  but WITHOUT ANY WARRANTY; without even the implied warranty of
--  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
--  GNU General Public License for more details.
--
--  You should have received a copy of the GNU General Public License
--  along with this program.  If not, see <http://www.gnu.org/licenses/>.

PACKAGE ternary IS

        SUBTYPE FakeTrit is BIT_VECTOR (1 downto 0);
        SUBTYPE FakeTriad is BIT_VECTOR (5 downto 0);
        SUBTYPE FakeTriadWithParity is BIT_VECTOR (7 downto 0);

        CONSTANT O : FakeTrit := "00";
        CONSTANT P : FakeTrit := "01";
        CONSTANT N : FakeTrit := "10";
        CONSTANT X : FakeTrit := "11";

---        FUNCTION make_triad(Th,Tm,Tl: FakeTrit) RETURN FakeTriad;
---        FUNCTION make_triad_with_parity(Th,Tm,Tl: FakeTrit) RETURN FakeTriadWithParity;

        FUNCTION buf(T: FakeTrit) RETURN FakeTrit;
        FUNCTION inv(T: FakeTrit) RETURN FakeTrit;

END PACKAGE ternary;

PACKAGE BODY ternary IS

        FUNCTION buf(T: FakeTrit) RETURN FakeTrit IS
        begin
                case T is
                when N =>
                        return N;
                when O =>
                        return O;
                when P =>
                        return P;
                when others => 
                        return X;
                end case;
        end; 

        FUNCTION inv(T: FakeTrit) RETURN FakeTrit IS
        begin
                case T is
                when N =>
                        return P;
                when O =>
                        return O;
                when P =>
                        return N;
                when others => 
                        return X;
                end case;
        end; 

END ternary;
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

Поправил начальную версию пакета ternary.vhd (см. выше) после проверки на кулраннере вот с таким примером:

Code: Select all

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

use ternary.all;

entity main is
    Port ( a : in FakeTrit;
           b : in FakeTrit;
           c : out FakeTrit;
           s : out FakeTrit
			 );
end main;

architecture Behavioral of main is
begin
process (a,b)
begin
	c <= buf(a);
	s <= inv(a);
end process;
end Behavioral;
Всё рабоатет :kruto:

Интересный вопрос - MUX можно сделать компонентом, а можно функцией (по сути это функция и есть) - как лучше сделать?

P.S. MEM точно придётся делать компонентом т.к. там есть память

P.P.S. DMUX кстати тоже - там 3 выхода...
Я тут за главного - если что шлите мыло на 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:Интересный вопрос - MUX можно сделать компонентом, а можно функцией (по сути это функция и есть) - как лучше сделать?
Пока сделал как функцию:

Code: Select all

        FUNCTION mux(T_C: FakeTrit; T_N: FakeTrit; T_O: FakeTrit; T_P: FakeTrit) RETURN FakeTrit IS
		  begin
                case T_C is
                when N =>
                        return T_N;
                when O =>
                        return T_O;
                when P =>
                        return T_P;
                when others => 
                        return X;
                end case;	  
		  end;
Исходники по мере продвижения буду выкладывать сюда: https://gitlab.com/ternary/ternary/tree/master/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:Поправил начальную версию пакета ternary.vhd (см. выше) после проверки на кулраннере вот с таким примером:
...
Всё рабоатет :kruto:
А как ты наблюдаешь, что "Всё рабоатет" ?
iLavr
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

Вот такая программка:

Code: Select all

architecture Behavioral of main is
begin
process (a,b)
begin
   c <= mux(a,P,O,N);
   s <= inv(b);
end process;
end Behavioral;
занимает 2% объёма CPLD CoolRunner-II (4 из 256 макроячеек)
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

Lavr wrote:
Shaos wrote:Поправил начальную версию пакета ternary.vhd (см. выше) после проверки на кулраннере вот с таким примером:
...
Всё рабоатет :kruto:
А как ты наблюдаешь, что "Всё рабоатет" ?
Подаю управляющее воздействие (кнопочка и проводочки), снимаю логические уровни с выходов (светодиодик плюс вольтметр)
Я тут за главного - если что шлите мыло на 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:Подаю управляющее воздействие (кнопочка и проводочки), снимаю логические уровни с выходов (светодиодик плюс вольтметр)
И что показывает вольтметр?
Напряжение вестимо ;)
Если стрелочка ближе к 0В - это логический ноль.
Если стрелочка ближе к 3В - это логическая единица.
Если 2 соседних выхода показывают 00 - это троичное O,
если 01 - это троичное P,
если 10 - это троичное N,
ну и если 11 - это исключительное состояние X...
Я тут за главного - если что шлите мыло на 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:Вот такая программка:

Code: Select all

architecture Behavioral of main is
begin
process (a,b)
begin
   c <= mux(a,P,O,N);
   s <= inv(b);
end process;
end Behavioral;
занимает 2% объёма CPLD CoolRunner-II (4 из 256 макроячеек)
Решил попробовать сделать троичный полусумматор в соответствии с картинкой:
ternary_half_adder.png
Получилось вот что:

Code: Select all

use ternary.all;

entity main is
    Port ( a : in FakeTrit;
           b : in FakeTrit;
           c : out FakeTrit;
           s : out FakeTrit
          );
end main;

architecture Behavioral of main is
signal r1,r2,r3,r4,r5,r6 : FakeTrit;
​begin
process (a,b)
begin
    ​r1 <= mux(a,P,N,O);
    r2 <= mux(a,O,P,N);
    r3 <= mux(b,r1,a,r2);
    r4 <= e12(a,N,O);
    r5 <= e21(a,O,P);
    r6 <= mux(b,r4,O,r5);
    s <= r3;
    c <= r6;
end process;
end Behavioral;
и он всё также занимает 4 макроячейки из 256! :o
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на 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:И что показывает вольтметр?
Напряжение вестимо ;)
Если стрелочка ближе к 0В - это логический ноль.
Если стрелочка ближе к 3В - это логическая единица.
Если 2 соседних выхода показывают 00 - это троичное O,
если 01 - это троичное P,
если 10 - это троичное N,
ну и если 11 - это исключительное состояние X...
Ага - вот это я и хотел услышать...
Т.е. это будет чисто двухпроводная троичка безо всяких "мухлей" с высокоимпедансным состоянием или же резистивным делителем между двумя выводами?
(обсуждали мы такие варианты...)
iLavr
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

Lavr wrote:Т.е. это будет чисто двухпроводная троичка безо всяких "мухлей" с высокоимпедансным состоянием или же резистивным делителем между двумя выводами?
(обсуждали мы такие варианты...)
На CPLD/FPGA наверное непросто будет эти "мухли" реализовать (если вообще возможно), так что я в лоб иду - 2 провода на трит и внутри, и снаружи...
Я тут за главного - если что шлите мыло на me собака shaos точка net