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

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

Moderator: haqreu

User avatar
askfind
Devil
Posts: 798
Joined: 04 Jan 2016 09:15
Location: Russia, S.- Peterburg

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

Post by askfind »

В данном случае основание - двоичная система. А рабочая среда, троичная система, фреймворк в ней же - типа того .Так или иначе преобразование происходит что уменьшает вообще любую мощность вычислений. Это сжирание аппаратных ресурсов заточенных изначально под другую систему.
Почему вариант троичной логики на основе двоичной логики должна быть неэффективно?

Как вариант можно использовать основными логическими ячейками от троичной машины "Сетунь-1958".

Для симулятора электроники SimulIDE_0.4.15-R253 созданы троичные логические элементы {-1,0,1}.
Это реализация синхронной работы троичной вычислительной машин в целом.
Все вычисления выполняются в троичной системе счисления.

Остаются преобразования оснований (10->3) (3->10) и (2->3) (3->2), которые требуют преобразования при вводе и выводе в систему.


Список реализации троичных элементов и прикрепляю библиотеку setun_tse_lib.zip.
$> tree -L 1
.
├── A_not_B
├── Pulse_generator_A
├── TSE_0
├── TSE_00
├── TSE_01
├── TSE_02
├── TSE_03
├── TSE_1
├── TSE_11
├── TSE_22
├── TSE_23
├── TSE_24
├── TSE_27
├── TSE_28
├── TSE_2_V1
├── TSE_2_V2
├── TSE_2_V3
├── TSE_43
├── TSE_44
├── TSE_47
├── TSE_4_V1
├── TSE_4_V2
├── TSE_4_V3
└── TSE_71

24 directories, 0 files
You do not have the required permissions to view the files attached to this post.
"Ученье свет, а неученье — тьма. Дело мастера боится, и коль крестьянин не умеет сохою владеть — хлеб не родится." (С)
User avatar
askfind
Devil
Posts: 798
Joined: 04 Jan 2016 09:15
Location: Russia, S.- Peterburg

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

Post by askfind »

СТАРТАП №2
"Троичные цифровые элементы в FPGA"

Хештег: #TERNARY_FPGA

FPGA Tang Nano 9K фирмы GoWin - доставили!

Начинается этап обучения и создание троичных цифровых элементов на FPGA.

Некоторые основные характеристики платы ввода-вывода Sipeed Tang Nano 9K FPGA:

Кристалл: GOWIN GW1NR-9 FPGA c 8640 LUT4 и 6480 FF

Напряжение питания: от 3,3 до 5 В.
Процессор: GOWIN GW1NR-9.
Тактовая частота: 27 МГц.
Количество логических элементов: 8 640.
shadowSRAM SSRAM (бит): 17280.
Block SRAM BSRAM (Кбит): 468.
SDRAM: 64 Мбит (32 разряда).
ПЗУ: 32 Мбит SPI flash.

Периферия:
USB Type-C, USB-UART, USB-JTAG, HDMI, разъём FPC40P для подключения RGB LCD, VGA адаптера, разъём FPC8P для подключения дисплеев с SPI интерфейсом, разъём microSD карты.

------------------------------
Всем, всем, всем!

Приглашу сбор донатов для создания библиотеки троичных цифровых элементов для FPGA.

— Девиз —

«Троичная логика - это прорыв в технологиях, которая была
разработана в СССР» , - в московском университете МГУ. -
«Нужно стряхнуть пыль и начать путь к совершенству!»
«КидерДеда»(С)

«Сделаем троичный процессор - отечественный!»
Владимир В.(С)

— Донат —

Для Донов. Отправлять перевод, донат, с подписью:
"Троичный FPGA".
You do not have the required permissions to view the files attached to this post.
"Ученье свет, а неученье — тьма. Дело мастера боится, и коль крестьянин не умеет сохою владеть — хлеб не родится." (С)
User avatar
askfind
Devil
Posts: 798
Joined: 04 Jan 2016 09:15
Location: Russia, S.- Peterburg

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

Post by askfind »

Язык описания аппаратуры Virilog для FPGA поддерживает троичные логические операции "из коробки"!


TRUE - "1"
ANY - "0"
FALSE - "-1"

Code: Select all

   module logical_operators();
   
   initial begin
     // Logical AND
     $display ("1'b1 && 1'b1 = %b", (1'b1 && 1'b1));
    $display ("1'b1 && 1'b0 = %b", (1'b1 && 1'b0));
    $display ("1'b1 && 1'bx = %b", (1'b1 && 1'bx));
    // Logical OR
    $display ("1'b1 || 1'b0 = %b", (1'b1 || 1'b0));
   $display ("1'b0 || 1'b0 = %b", (1'b0 || 1'b0));
   $display ("1'b0 || 1'bx = %b", (1'b0 || 1'bx));
   // Logical Negation
    $display ("! 1'b1       = %b", ( !   1'b1));
    $display ("! 1'b0       = %b", ( !   1'b0));
     #10  $finish;
  end
  
 endmodule

ТЕСТ

Code: Select all

 1'b1 && 1'b1 = 1
 1'b1 && 1'b0 = 0
 1'b1 && 1'bx = x
 1'b1  1'b0 = 1
 1'b0  1'b0 = 0
 1'b0 || 1'bx = x
 ! 1'b1       = 0
 ! 1'b0       = 1
P.S.
Стоит попробовать посмотреть затраты ресурсов а ПЛИС.
You do not have the required permissions to view the files attached to this post.
"Ученье свет, а неученье — тьма. Дело мастера боится, и коль крестьянин не умеет сохою владеть — хлеб не родится." (С)
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

Мы когда-то это уже обсуждали - оно не будет работать нормально
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
askfind
Devil
Posts: 798
Joined: 04 Jan 2016 09:15
Location: Russia, S.- Peterburg

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

Post by askfind »

ЭВРИКА!
Дата: 12.03.2025
страна: Россия
город: .Старая-Русса.

На языке Verilog троичные типы чисел работают !!

Code: Select all

$ cat neg_trit.v
//
// Filename: "neg_trit_test.v"
//
// Project: Троичный процессор для RISC-V
//
// Description: Операция инверсия трита NEG.
//
// Create date: 11.03.2025
// Edit date:   12.03.2025
//
//
// Author:      Vladimir Vasilev
// E-mail:      askfind@ya.ru
//
// GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007
//

// Троичное инверсия трита
//      NEG
// .-----------.
// |  -  |  +  |
// |-----------|
// |  0  |  0  |
// |-----------|
// |  +  |  -  |
// .-----------.

module neg_trit(a,c);

input  wire a;
output wire c;

assign c = ~a;

endmodule
Тестирование Ok':

$make compile
iverilog -o extfile ./neg_trit.v ./neg_trit_test.v

$ make simulation
vvp extfile
VCD info: dumpfile extfile.vcd opened for output.
Time = 00: trit a = x, trit c = x
Time = 10: trit a = 1, trit c = 0
Time = 20: trit a = x, trit c = x
Time = 30: trit a = 0, trit c = 1

Отображение сигналов эмуляции троичной операции NEG в программе,
GTKWave, для анализа сигналов.
You do not have the required permissions to view the files attached to this post.
"Ученье свет, а неученье — тьма. Дело мастера боится, и коль крестьянин не умеет сохою владеть — хлеб не родится." (С)
User avatar
askfind
Devil
Posts: 798
Joined: 04 Jan 2016 09:15
Location: Russia, S.- Peterburg

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

Post by askfind »

Shaos wrote: 12 Mar 2025 07:31 Мы когда-то это уже обсуждали - оно не будет работать нормально
А где почитать про ваши опыты?

Пока получается. Проверю как триты работает на "железе" tang nano 9k. Сделаю вывод на светодиоды 2 шт.
"Ученье свет, а неученье — тьма. Дело мастера боится, и коль крестьянин не умеет сохою владеть — хлеб не родится." (С)
Mixa64
Doomed
Posts: 478
Joined: 25 Aug 2009 07:02
Location: Москва

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

Post by Mixa64 »

Зачем Tang ? Возьмите 155ЛН1, оно как раз под верилоговское описание подходит. Вместо 1 подавайте лог. 1 на вход, вместо 0 подавайте лог. 0, вместо x подавайте шум от лог. 0 до лог. 1, такой, чтобы широкую полосу осциллограф показывал. Картинку увидите ровно ту, которую моделировщик намоделировал.
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

Кстати моделироваться то оно может и моделируется, а вот сможет ли оно быть синтезировано под конкретный девайс - вот в чём вопрос…
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
askfind
Devil
Posts: 798
Joined: 04 Jan 2016 09:15
Location: Russia, S.- Peterburg

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

Post by askfind »

Shaos wrote: 13 Mar 2025 11:31 Кстати моделироваться то оно может и моделируется, а вот сможет ли оно быть синтезировано под конкретный девайс - вот в чём вопрос…
Точно!

"Ошибка! Жми кнопку "Успех" (С)

Вариант Б
На "железе" в FPGA (ПЛИС) троичные операции не работают.
В умной книге написали о поддержке логических операций со значениями {0,1,x,z} в с и м у л я т о р е цифровой схемы. Поэтому-то в приложении iverilog.

Вариант А
Действую в направлении синтеза троичных элементов и использовать две линии для передачи трита между цифровыми элементами. Классические двоичные цифровые элементы.

Продолжение следует....
"Ученье свет, а неученье — тьма. Дело мастера боится, и коль крестьянин не умеет сохою владеть — хлеб не родится." (С)
User avatar
askfind
Devil
Posts: 798
Joined: 04 Jan 2016 09:15
Location: Russia, S.- Peterburg

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

Post by askfind »

Mixa64 wrote: 13 Mar 2025 11:10 Зачем Tang ? Возьмите 155ЛН1, оно как раз под верилоговское описание подходит. Вместо 1 подавайте лог. 1 на вход, вместо 0 подавайте лог. 0, вместо x подавайте шум от лог. 0 до лог. 1, такой, чтобы широкую полосу осциллограф показывал. Картинку увидите ровно ту, которую моделировщик намоделировал.
Троичные базовые синхронные элементы на микросхемах К561хх синтезировал.

Почему Tang?

В RISC-V на Verilog добавить специализированный троичный модуль .

1) https://rutube.ru/video/7415342a7589d1d ... b2468/?r=a
2) https://rutube.ru/video/73b5908be00a7f9 ... 88de6/?r=a

Сразу на "железе" учиться и накапливать опыт.
"Ученье свет, а неученье — тьма. Дело мастера боится, и коль крестьянин не умеет сохою владеть — хлеб не родится." (С)
User avatar
askfind
Devil
Posts: 798
Joined: 04 Jan 2016 09:15
Location: Russia, S.- Peterburg

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

Post by askfind »

Перевод:

Понедельник, 1 июля 2013 года
Тернарный оператор в Verilog

https://fpganasic.blogspot.com/2013/07/ ... rilog.html

Тернарный оператор используется для проверки условия "if then else" в Verilog. Он имеет три операнда.
w = x ? y : z;
Формат тернарного оператора показан выше. Если значение x равно 1, то y присваивается переменной w, иначе присваивается z. Тернарный оператор может быть вложенным для создания многоуровневых условных операторов.

Следующий пример кода и его вывод демонстрируют работу оператора:
module ternary_operators;
reg [1:0] a, b, c;
reg d;
initial begin
a = 0;
b = 1;
c = 2;
d = 1;
a = d ? b : c;
$display(" a = %d", a);
$finish;
end
endmodule

Вывод:
$ a = 1

В приведенном примере значение переменной a присваивается с использованием тернарного оператора. Здесь сначала проверяется значение переменной d, которое равно 1. Следовательно, переменной a присваивается значение переменной b, то есть 1. Если бы значение d было равно 0, то переменной a было бы присвоено значение 2. Это работает как 2x1 мультиплексор.
"Ученье свет, а неученье — тьма. Дело мастера боится, и коль крестьянин не умеет сохою владеть — хлеб не родится." (С)
User avatar
askfind
Devil
Posts: 798
Joined: 04 Jan 2016 09:15
Location: Russia, S.- Peterburg

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

Post by askfind »

Реализация инверсии трита и проверки на достоверность операции на языке Verilog

Исходный код на Verilog и пояснение, что он делает.
//
// Filename: "neg_te.v"
//
// Project: Троичный процессор для RISC-V
//
// Description: Операция инверсия трита. Мнемоника NEG_TE.
//
// Create date: 11.03.2025
// Edit date: 15.03.2025
//
//
// Author: Vladimir Vasilev
// E-mail: askfind@ya.ru
//
// GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007
//
//
// trit = {-1,0,1} - значения трита
//
// Таб.2 Троичное инверсия трита
// NEG
// .-----------.
// | - | + |
// |-----------|
// | 0 | 0 |
// |-----------|
// | + | - |
// .-----------.

//
// Кодирование трита и интерпретация trit:
//
// a[1:0] -> {1,0} = '+1'
// a[1:0] -> {0,0} = '0'
// a[1:0] -> {0,1} = '-1'
// a[1:0] -> {1,1} = 'Error'
//

module neg_te(a,c,err);

input wire[1:0] a;
output wire[1:0] c;
output err;

assign c[1] = ~a[1] & a[0];
assign c[0] = ~a[0] & a[1];
assign err = ( (a == 2'b11) || (c == 2'b11) ) ? 1 : 0;

endmodule
Троичное инверсия трита. Мнемоника NEG trit

Описание модуля
module neg_te(a, c, err);
Объявляется модуль с именем neg_te.
У модуля три порта:

a — входной сигнал (2-битный).
c — выходной сигнал (2-битный).
err — выходной сигнал (1-битный).

Объявление входов и выходов
input wire[1:0] a;
output wire[1:0] c;
output err;
a — это 2-битный входной сигнал (тип wire).
c — это 2-битный выходной сигнал (тип wire).
err — это 1-битный выходной сигнал.

Логика работы
assign c[1] = ~a[1] & a[0];
Для бита c[1] (старший бит выходного сигнала c) выполняется операция:
Инвертируется бит a[1] (логическое НЕ).
Результат логически умножается (И) на бит a[0].
То есть c[1] = (не a[1]) И a[0].
assign c[0] = ~a[0] & a[1];
Для бита c[0] (младший бит выходного сигнала c) выполняется операция:

Инвертируется бит a[0] (логическое НЕ).
Результат логически умножается (И) на бит a[1].
То есть c[0] = (не a[0]) И a[1].
assign err = ( (a == 2'b11) || (c == 2'b11) ) ? 1 : 0;
Для сигнала err выполняется проверка:
Если входной сигнал a равен 2'b11 (двоичное число 11, то есть 3 в десятичной системе), или
Если выходной сигнал c равен 2'b11 (двоичное число 11),
То err устанавливается в 1 (истина), иначе — в 0 (ложь).
Таблица истинности
Давайте построим таблицу истинности для этого модуля, чтобы лучше понять его работу.
a[1] a[0] c[1] c[0] c err
0 0 0 0 00 0
0 1 1 0 10 0
1 0 0 1 01 0
1 1 0 0 00 1
Когда a = 2'b11, err становится 1, так как выполняется условие (a == 2'b11).
Когда a = 2'b01, c = 2'b10, и err остается 0.
Когда a = 2'b10, c = 2'b01, и err остается 0.

Итог
Этот модуль выполняет следующие операции:
Вычисляет выходной сигнал c на основе входного сигнала a с использованием логических операций НЕ и И.
Проверяет, равен ли входной сигнал a или выходной сигнал c значению 2'b11, и устанавливает сигнал err в 1, если это так.

Этот код может быть частью более сложной системы, где требуется обработка ошибок или преобразование входных данных.

(New chat AI-generated, for reference only deepseek)
You do not have the required permissions to view the files attached to this post.
"Ученье свет, а неученье — тьма. Дело мастера боится, и коль крестьянин не умеет сохою владеть — хлеб не родится." (С)
User avatar
askfind
Devil
Posts: 798
Joined: 04 Jan 2016 09:15
Location: Russia, S.- Peterburg

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

Post by askfind »

Троичная операция на Verilog

c_trit = xor( a_trit XOR b_trit)

Code: Select all

//
// Filename: "xor_te.v"
//
// Project: Троичный процессор для RISC-V
//
// Description: Операция инверсия трита. Мнемоника XOR_TE.
//
// Create date: 11.03.2025
// Edit date:   15.03.2025
//
//
// Author:      Vladimir Vasilev
// E-mail:      askfind@ya.ru
//
// GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007
//

// Таб.1 Алфавит троичной симметричной системы счисления
// +--------------------------+-------+-------+-------+
// | Числа                    |  -1   |   0   |   1   |
// +--------------------------+-------+-------+-------+
// | Логика                   | false |  nil  | true  |
// +--------------------------+-------+-------+-------+
// | Логика                   |   f   |   n   |   t   |
// +--------------------------+-------+-------+-------+
// | Символы                  |   -   |	  0   |	  +   |
// +--------------------------+-------+-------+-------+
// | Символы                  |   N   |	  Z   |	  P   |
// +--------------------------+-------+-------+-------+
// | Символы                  |   N   |	  O   |	  P   |
// +--------------------------+-------+-------+-------+
// | Символы                  |   0   |	  i   |	  1   |
// +--------------------------+-------+-------+-------+
// | Символы                  |   v   |	  0   |	  ^   |
// +--------------------------+-------+-------+-------+

//
// trit = {-1,0,1}  - значения трита
//
// Кодирование трита и интерпретация trit:
//
// a[1:0] -> {1,0} = '+1'
// a[1:0] -> {0,0} =  '0'
// a[1:0] -> {0,1} = '-1'
// a[1:0] -> {1,1} = 'Error'
//


// Таб.8 Троичное исключающее или
//       XOR
// .-----------------------.
// |     | -1  |  0  |  1  |
// |-----------------------|
// | -1  |  -  |  0  |  +  |
// |-----------------------|
// |  0  |  0  |  0  |  0  |
// |-----------------------|
// |  1  |  +  |  0  |  -  |
// .-----------------------.

Code: Select all

module xor_te(a,b,c,err);

input  [1:0] a;
input  [1:0] b;
output reg[1:0] c;
output err;

always @(*) begin
    case ({a, b})
        4'b0000: c = 2'b00; // a=0, b=0 -> c=0
        4'b0001: c = 2'b00; // a=0, b=1 -> c=0
        4'b0010: c = 2'b00; // a=0, b=2 -> c=0
        4'b0100: c = 2'b01; // a=1, b=0 -> c=1
        4'b0101: c = 2'b00; // a=1, b=1 -> c=0
        4'b0110: c = 2'b10; // a=1, b=2 -> c=2
        4'b1000: c = 2'b10; // a=2, b=0 -> c=2
        4'b1001: c = 2'b00; // a=2, b=1 -> c=0
        4'b1010: c = 2'b01; // a=2, b=2 -> c=1
        default: c = 2'b00; // По умолчанию c=0
    endcase
end

assign err = ( (a == 2'b11) || (b == 2'b11) || (c == 2'b11) ) ? 1 : 0;

endmodule
You do not have the required permissions to view the files attached to this post.
"Ученье свет, а неученье — тьма. Дело мастера боится, и коль крестьянин не умеет сохою владеть — хлеб не родится." (С)
User avatar
askfind
Devil
Posts: 798
Joined: 04 Jan 2016 09:15
Location: Russia, S.- Peterburg

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

Post by askfind »

Отладка троичных операций для трит

fpga_digital_ternary/src$ tree -L 1
.
├── add_full_te
├── add_half_te
├── and_te
├── extfile
├── extfile.vcd
├── fpga_digital_ternary.cst
├── fpga_digital_ternary.gao
├── Makefile
├── opers_trit_testbench.v
└── opers_trit.v
7 directories, 7 files
You do not have the required permissions to view the files attached to this post.
"Ученье свет, а неученье — тьма. Дело мастера боится, и коль крестьянин не умеет сохою владеть — хлеб не родится." (С)
User avatar
Shaos
Admin
Posts: 23989
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

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

Post by Shaos »

input [1:0] a;
input [1:0] b;
output reg[1:0] c;
output err;
А спрятать эту двоичность через Verilog никак нельзя?

На VHDL в самом начале топика ( см. viewtopic.php?p=145055#p145055 ) я это спрятал:

Code: Select all

        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";
P.S. Вроде можно и в верилоге спрятать: typedef bit [1:0] FakeTrit;

P.P.S. Я попросил гугловский AI Gemini написать код на Verilog, который создаёт и тестирует такой троичный тип :mrgreen:

Code: Select all

module enum_manipulation (
  input  logic [1:0] in_val,
  output logic [1:0] out_val
);

  // Define the enumerated type
  typedef enum logic [1:0] {N = 2'b00, O = 2'b01, P = 2'b10, X = 2'b11} my_enum_t;

  my_enum_t input_enum, output_enum;

  // Assign the input to the enumerated type
  assign input_enum = my_enum_t'(in_val);

  // Implement the transformation logic
  always_comb begin
    case (input_enum)
      N: output_enum = P;
      P: output_enum = N;
      O: output_enum = O;
      X: output_enum = X;
      default: output_enum = X; // Default case for safety
    endcase
  end

  // Assign the output to the output port
  assign out_val = output_enum;

endmodule

// Testbench
module enum_manipulation_tb;

  reg  [1:0] test_in;
  wire [1:0] test_out;

  enum_manipulation dut (
    .in_val(test_in),
    .out_val(test_out)
  );

  initial begin
    $dumpfile("enum_manipulation.vcd");
    $dumpvars(0, enum_manipulation_tb);

    // Test cases
    test_in = 2'b00; #10; // N -> P
    $display("Input: %b, Output: %b", test_in, test_out);

    test_in = 2'b01; #10; // O -> O
    $display("Input: %b, Output: %b", test_in, test_out);

    test_in = 2'b10; #10; // P -> N
    $display("Input: %b, Output: %b", test_in, test_out);

    test_in = 2'b11; #10; // X -> X
    $display("Input: %b, Output: %b", test_in, test_out);

    test_in = 2'b111; #10; // Default case
    $display("Input: %b, Output: %b", test_in, test_out);

    $finish;
  end

endmodule
Константы можно немножко попереставлять, my_enum_t можно перименовать в trit_t и вперёд :lol:
Я тут за главного - если что шлите мыло на me собака shaos точка net