|
nedoPC.orgCommunity for electronics hobbyists, established in 2002 |
|
Использование двоичного FPGA для реализации троичного компа
Author |
Message |
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Ну просто я помню, твой старый друк тебе тут в Ternary намекал про возможность использования третьего состояния в CPLD/FPGA, но я не полез тогда уточнять...
_________________ iLavr
|
01 Jul 2018 22:52 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23375 Location: Silicon Valley
|
Да, в VHDL обычно юзают тип STD_LOGIC, который получается из STD_ULOGIC: По идее всё это многообразие значений можно использовать и внутри программируемой логики, но во что оно выльется в реальной прошивке - фиг знает (били пара статей на тему использования 'Z' как третьего состояния внутри VHDL, но я как-то к этому скептически отношусь).
|
01 Jul 2018 23:01 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
А ссылочек нет? Я бы с интересом прочитал...
_________________ iLavr
|
01 Jul 2018 23:10 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23375 Location: Silicon Valley
|
Да я только заголовки видел в гугле - при открытии пишет, что файла более не существует...
|
01 Jul 2018 23:22 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Статьи были англоязычные?
_________________ iLavr
|
01 Jul 2018 23:48 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23375 Location: Silicon Valley
|
Угу - из Индии
|
02 Jul 2018 00:41 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23375 Location: Silicon Valley
|
Полусумматор вот чего заюзал в Кулраннере: По идее 4 макроячейки это по числу логических выходов - 2 на троичный выход S и 2 на троичный выход C Вот формулы: Надо попробовать MEM-ы задействовать и посмотреть сколько они ресурсов чипа съедят (по идее должно быть по 2 макроячейки на каждый MEM)
|
02 Jul 2018 01:12 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23375 Location: Silicon Valley
|
Полный троичный сумматор: | | | | 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: Считаем 1+1+1 = 3 Считаем (-1)+(-1)+(-1) = -3 По сравнению с полусумматором тут добавился только один троичный вход (2 двоичных), но эта схема захватила аж 8 макроячеек (4%), т.е. в 2 раза больше, чем полусумматор: Логические формулы:
|
02 Jul 2018 22:09 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23375 Location: Silicon Valley
|
Вроде возможно средствами VHDL наружу подавать третье состояние (для девайсов, которые это умеют) - т.е. по идее можно сократить количество используемых выходов вдвое...
|
03 Jul 2018 21:47 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23375 Location: Silicon Valley
|
Да вот так: http://www.nedopc.org/forum/viewtopic.php?f=79&t=362Это только для выходов, т.к. по входам третье состояние не прочитаешь...
|
04 Jul 2018 13:29 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23375 Location: Silicon Valley
|
Ну я пока буду с "двухпроводной троичкой" играться Попробовал простейшую схемку, чтобы потестить свои три троичных переключателя и три красно-зелёных светодиода: Она ожидаемо заняла 6 микроячеек (по 2 на каждый троичный выход) и главное всё работает как надо Вот привязка ног кулраннера: P.S. Ха, во как чётко Xilix ISE преобразовало вышеозначенную логику:
|
05 Jul 2018 21:19 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23375 Location: Silicon Valley
|
Демультиплексор готов и проверен: Вот такие формулы получились, которые тоже влезли в 6 макроблоков: На очереди MEM, который должен быть процессом...
|
05 Jul 2018 21:49 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23375 Location: Silicon Valley
|
После некоторых мучений сделал таки блок 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);
| | | | |
Всё работает
|
05 Jul 2018 23:42 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23375 Location: Silicon Valley
|
Добавил компонент ternary_clock, который из двоичного клока получает троичную последовательность NOPONOPONOPO: Вроде работает. Правда результирующие формулы показывают, что на считающий триггер 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
|
06 Jul 2018 01:46 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 23375 Location: Silicon Valley
|
И вот так можно подключать CPLD/FPGA в троичную систему: Получается в среднем один корпус DG403 на каждый троичный вход и на каждый троичный выход
|
06 Jul 2018 02:05 |
|
|
Who is online |
Users browsing this forum: No registered users and 1 guest |
|
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
|
|