nedoPC.org

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



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

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Я почти вплотную приблизился к созданию троичного компьютера вот на этом железе:

Image

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

Внутри троичный сигнал будет состоять из двух двоичных:
00 - O (zero)
10 - N (negative)
01 - P (positive)
11 - X (exception or fatal error)

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

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

UPDATE: Ниже приаттачена версия VHDL библиотеки v1.0 от 6 июля 2018 года:


Attachments:
ternary.vhd [7.04 KiB]
Downloaded 786 times
09 Apr 2009 13:32
Profile WWW
Fanat
User avatar

Joined: 18 Nov 2014 09:17
Posts: 52
Location: Отсюда
Reply with quote
Думаю, имеет смысл переставить местами O и Z,
в смысле, Z = 00 (отключено/ошибка), O = 11 (положительный сигнал + отрицательный сигнал)
Тогда Z будет действительно disconnected

----
З.Ы. Некропостер :)


17 Mar 2015 01:30
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
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:

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


27 Jun 2018 21:46
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
в VHDL вроде как можно заводить типы данных:
Code:
type Trit is (O, P, N, X);

однако я нигде не нашёл информации во что это в результате выльется, поэтому начать можно с простого:
Code:
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:
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 - это исключение, которое должно останавливать всю систему и сигнализировать о фатальной ошибке...

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


27 Jun 2018 23:11
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Начальная реализация пакета ternary.vhd:
Code:
--  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;

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


29 Jun 2018 23:19
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Поправил начальную версию пакета ternary.vhd (см. выше) после проверки на кулраннере вот с таким примером:

Code:
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 выхода...

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


01 Jul 2018 20:34
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Shaos wrote:
Интересный вопрос - MUX можно сделать компонентом, а можно функцией (по сути это функция и есть) - как лучше сделать?

Пока сделал как функцию:
Code:
        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


Attachments:
ternary.vhd [2.69 KiB]
Downloaded 817 times

_________________
:dj: https://mastodon.social/@Shaos
01 Jul 2018 21:29
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Shaos wrote:
Поправил начальную версию пакета ternary.vhd (см. выше) после проверки на кулраннере вот с таким примером:
...
Всё рабоатет :kruto:

А как ты наблюдаешь, что "Всё рабоатет" ?

_________________
iLavr


01 Jul 2018 21:46
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Вот такая программка:
Code:
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 макроячеек)

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


01 Jul 2018 21:49
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Lavr wrote:
Shaos wrote:
Поправил начальную версию пакета ternary.vhd (см. выше) после проверки на кулраннере вот с таким примером:
...
Всё рабоатет :kruto:

А как ты наблюдаешь, что "Всё рабоатет" ?

Подаю управляющее воздействие (кнопочка и проводочки), снимаю логические уровни с выходов (светодиодик плюс вольтметр)

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


01 Jul 2018 21:51
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Shaos wrote:
Подаю управляющее воздействие (кнопочка и проводочки), снимаю логические уровни с выходов (светодиодик плюс вольтметр)

И что показывает вольтметр?

_________________
iLavr


01 Jul 2018 21:53
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Lavr wrote:
Shaos wrote:
Подаю управляющее воздействие (кнопочка и проводочки), снимаю логические уровни с выходов (светодиодик плюс вольтметр)

И что показывает вольтметр?

Напряжение вестимо ;)
Если стрелочка ближе к 0В - это логический ноль.
Если стрелочка ближе к 3В - это логическая единица.
Если 2 соседних выхода показывают 00 - это троичное O,
если 01 - это троичное P,
если 10 - это троичное N,
ну и если 11 - это исключительное состояние X...

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


01 Jul 2018 22:16
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22409
Location: Silicon Valley
Reply with quote
Shaos wrote:
Вот такая программка:
Code:
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 макроячеек)

Решил попробовать сделать троичный полусумматор в соответствии с картинкой:

Attachment:
ternary_half_adder.png
ternary_half_adder.png [ 3.1 KiB | Viewed 16695 times ]


Получилось вот что:

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


Attachments:
ternary.vhd [3.67 KiB]
Downloaded 807 times

_________________
:dj: https://mastodon.social/@Shaos
01 Jul 2018 22:34
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Shaos wrote:
Lavr wrote:
И что показывает вольтметр?

Напряжение вестимо ;)
Если стрелочка ближе к 0В - это логический ноль.
Если стрелочка ближе к 3В - это логическая единица.
Если 2 соседних выхода показывают 00 - это троичное O,
если 01 - это троичное P,
если 10 - это троичное N,
ну и если 11 - это исключительное состояние X...

Ага - вот это я и хотел услышать...
Т.е. это будет чисто двухпроводная троичка безо всяких "мухлей" с высокоимпедансным состоянием или же резистивным делителем между двумя выводами?
(обсуждали мы такие варианты...)

_________________
iLavr


01 Jul 2018 22:39
Profile
Admin
User avatar

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

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

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


01 Jul 2018 22:41
Profile WWW
Display posts from previous:  Sort by  
Reply to topic   [ 48 posts ]  Go to page 1, 2, 3, 4  Next

Who is online

Users browsing this forum: No registered users and 13 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.