Я почти вплотную приблизился к созданию троичного компьютера вот на этом железе:
Конечно же это будет 3niti alpha
На котором можно написать эмулятор системы команд Тунгуски...
Внутри троичный сигнал будет состоять из двух двоичных:
00 - O (zero)
10 - N (negative)
01 - P (positive)
11 - X (exception or fatal error)
Если в качестве исходных схем использовать схемы для тримулятора, то там четвёртое значение - это Z (disconnected).
Я думаю, что сначала я всё таки сделаю первый вариант - непосредственно на языке схем Xilinx. Второй же вариант подразумевает наличие некоего конвертера из схем тримулятора в VHDL (что вполне возможно сделать, но требует некоторого времени).
UPDATE: Последняя версия троичной VHDL-либы с примерами всегда будет тут:
Думаю, имеет смысл переставить местами O и Z,
в смысле, Z = 00 (отключено/ошибка), O = 11 (положительный сигнал + отрицательный сигнал)
Тогда Z будет действительно disconnected
Shaos wrote:Внутри троичный сигнал будет состоять из двух двоичных:
00 - O (zero)
10 - N (negative)
01 - P (positive)
11 - X (exception or fatal error)
Если в качестве исходных схем использовать схемы для тримулятора, то там четвёртое значение - это Z (disconnected).
Я думаю, что сначала я всё таки сделаю первый вариант - непосредственно на языке схем Xilinx. Второй же вариант подразумевает наличие некоего конвертера из схем тримулятора в VHDL (что вполне возможно сделать, но требует некоторого времени).
Для начала можно взять CPLD от Xilinx - всё равно тот же VHDL будет использоваться:
А в качестве исходных схем таки будет Logisim
Ну и DDT, когда оно таки заработает как полноценный автомат...
P.S. Задача номер раз - узнать сколько троичных мультиплексоров влезет в CollRunner-II XC2C256/144
Я тут за главного - если что шлите мыло на me собака shaos точка net
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 - можно даже завести константы под это дело:
-- 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
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;
Всё рабоатет
Интересный вопрос - MUX можно сделать компонентом, а можно функцией (по сути это функция и есть) - как лучше сделать?
P.S. MEM точно придётся делать компонентом т.к. там есть память
P.P.S. DMUX кстати тоже - там 3 выхода...
Я тут за главного - если что шлите мыло на me собака shaos точка net
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;
Shaos wrote:Подаю управляющее воздействие (кнопочка и проводочки), снимаю логические уровни с выходов (светодиодик плюс вольтметр)
И что показывает вольтметр?
Напряжение вестимо
Если стрелочка ближе к 0В - это логический ноль.
Если стрелочка ближе к 3В - это логическая единица.
Если 2 соседних выхода показывают 00 - это троичное O,
если 01 - это троичное P,
если 10 - это троичное N,
ну и если 11 - это исключительное состояние X...
Я тут за главного - если что шлите мыло на me собака shaos точка net
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!
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
Напряжение вестимо
Если стрелочка ближе к 0В - это логический ноль.
Если стрелочка ближе к 3В - это логическая единица.
Если 2 соседних выхода показывают 00 - это троичное O,
если 01 - это троичное P,
если 10 - это троичное N,
ну и если 11 - это исключительное состояние X...
Ага - вот это я и хотел услышать...
Т.е. это будет чисто двухпроводная троичка безо всяких "мухлей" с высокоимпедансным состоянием или же резистивным делителем между двумя выводами? (обсуждали мы такие варианты...)
Lavr wrote:Т.е. это будет чисто двухпроводная троичка безо всяких "мухлей" с высокоимпедансным состоянием или же резистивным делителем между двумя выводами? (обсуждали мы такие варианты...)
На CPLD/FPGA наверное непросто будет эти "мухли" реализовать (если вообще возможно), так что я в лоб иду - 2 провода на трит и внутри, и снаружи...
Я тут за главного - если что шлите мыло на me собака shaos точка net