1-битный процессор микрокода на эмиттерно-связанной логике?

Другие микроконтроллеры и микропроцессоры, не попавшие в предыдущие разделы

Moderator: Shaos

belfegor96
Senior
Posts: 100
Joined: 09 Jun 2022 07:49

Re: 1-битный процессор микрокода на эмиттерно-связанной логи

Post by belfegor96 »

Shaos wrote: Вот есть такая штука - PCBFlow для Yosys, которая из верилога (или даже VHDL) может делать печатную плату с транзисторами :)

https://github.com/cpldcpu/PCBFlow
Да, видел такую.

Но у меня проблема выглядит непонятной ещё в плане того, что есть разные "классы" соединений: логика же "трёхэтажная", в ней используются три уровня напряжений. "Верхний" выход может управлять более "нижним" на одну ступень входом, но ни как иначе. Плюс, есть конвертеры напряжений из "нижних" в "верхние"

Пока ещё не понимаю как и куда нужно вставить информацию об этих типах входов-выходов. Ситуация явно нестандартная. Возможно, нужно делать библиотеку своих готовых элементов или как-то так.
Last edited by belfegor96 on 22 Sep 2023 08:47, edited 1 time in total.
User avatar
Shaos
Admin
Posts: 23664
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

Re: 1-битный процессор микрокода на эмиттерно-связанной логи

Post by Shaos »

Ну видимо свой "techmapping" надо писать
Я тут за главного - если что шлите мыло на me собака shaos точка net
belfegor96
Senior
Posts: 100
Joined: 09 Jun 2022 07:49

Re: 1-битный процессор микрокода на эмиттерно-связанной логи

Post by belfegor96 »

Shaos wrote:Ну видимо свой "techmapping" надо писать
Не, не взлетит:

Here are some of the basics of a techmap transformation Verilog module:

a techmap transformation only operates on a single design cell.

You can not use techmap to perform multi-cell optimizations such mapping a $mul followed by an $add onto an FPGA DSP has multiply-accumulator support.

На крайний случай, процессор небольшой получается, можно после того как дизайн заработает пройтись по нему и руками заменить гейты на составные, и потом верифицировать.
belfegor96
Senior
Posts: 100
Joined: 09 Jun 2022 07:49

Re: 1-битный процессор микрокода на эмиттерно-связанной логи

Post by belfegor96 »

Придумал как вкрячить в АЛУ сдвиг вправо, чтобы не делать отдельное устройство

Изначально я для выбора текущей операции АЛУ вместо логики на AND (как в микросхеме 74181) сделал в логической схеме сумматора мультиплексор на 4 входа (см. картинку) - просто так понятнее: берём сигналы с generate, propagate и с AND между ними и переключаем их. А ещё была надежда что выходной XNOR (который из 2-х гейтов состоит на самом деле: ~(A ^ B)) как в 74181 в DCTL удастся заменить на какой-то более дешёвый DCTL-трюк (не удалось) и поэтому оставил пока более понятный мультиплексор.

В результате остался один неиспользованный вход этого мультиплексора. А ведь его можно использовать для того чтобы отдать правый бит от текущего бита операнда напрямую на выход. Получается почти бесплатное устройство битового сдвига вправо! Оно будет дешевле чем отдельное устройство сдвига и XNORы на каждый бит как в обычном АЛУ.

Code: Select all

typedef enum logic[4:0] {
    ADD  =5'b00000, // also left shift if A=B, AKA SLL
    SUB  =5'b11000, // carry_out is inverted for SUB operations
    XOR  =5'bx0100,
    XNOR =5'bx1100, // also NOT, if A=0
    COMP =5'b01000, // A-B-1 operation, if A!=B then established carry out bit means A>B, otherwise A<B
    AND  =5'bx0101,
    OR   =5'bx0110,
    RSHFT=5'b00111  // moves data2 bits to right (SLR), data1 is ignored
} AluCmd;

typedef struct packed
{
    logic carry_in; // carry input (for example, from prev stage)
    logic b_inv; // invert second operand?
    logic carry_disable;
    logic[1:0] cmd; // cmd for full adder mux switch
} AluCtrlInternal;

typedef union packed
{
    AluCmd cmd;
    AluCtrlInternal ctrl;
} AluCtrl;

module alu
    (
        input[3:0] d1,
        input[3:0] d2,
        input AluCtrl ctrl,
        output[3:0] res,
        output carry_out
    );

    wire[3:0] gen;
    wire[3:0] propagate;
    wire[3:0] d2_possible_inverted;
    wire[4:0] carry;

    wire carry_in = ctrl.ctrl.carry_in;
    assign carry[0] = carry_in;
    assign carry_out = carry[4];

    for(genvar i = 0; i < 4; i++) begin
        wire right_bit = (i < 3) ? d2_possible_inverted[i+1] : carry_in;

        full_adder fa(d1[i], d2[i], carry[i], right_bit, ctrl, res[i], gen[i], propagate[i], d2_possible_inverted[i]);
    end

    assign carry[1] = gen[0] ||
            (carry_in && propagate[0]);

    assign carry[2] = gen[1] || (
            (carry_in && propagate[0] && propagate[1]) ||
            (gen[0] && propagate[1])
        );

    assign carry[3] = gen[2] || (
            (carry_in && propagate[0] && propagate[1] && propagate[2]) ||
            (gen[0] && propagate[1] && propagate[2]) ||
            (gen[1] && propagate[2])
        );

    assign carry[4] = gen[3] || (
            (carry_in && propagate[0] && propagate[1] && propagate[2] && propagate[3]) ||
            (gen[0] && propagate[1] && propagate[2] && propagate[3]) ||
            (gen[1] && propagate[2] && propagate[3]) ||
            (gen[2] && propagate[3])
        );
endmodule

module full_adder
    (
        input data1, data2, carry_in, direct_in /*can be bypassed to output*/,
        input AluCtrlInternal ctrl,
        output ret, gen, propagate, d2_possible_inverted
    );

    assign d2_possible_inverted = data2 ^ ctrl.b_inv; // optionally inverts data2
    wire carry = carry_in & ~ctrl.carry_disable;

    assign gen = data1 & d2_possible_inverted;
    assign propagate = data1 | d2_possible_inverted;

    wire i;
    AND_gate_with_mux mux(gen, propagate, direct_in, ctrl.cmd, i);

    assign ret = i ^ carry;
endmodule

// MUX used here to utilize 3-level DCTL logic
module AND_gate_with_mux
    (
        input from_AND, from_OR, direct_in,
        input[1:0] ctrl,
        output result
    );

    wire interm = ~from_AND & from_OR;
    mux_4to1 m(result, interm, from_AND, from_OR, direct_in, ctrl);

endmodule

module mux_4to1 (
        output r,
        input a,
        input b,
        input c,
        input d,
        input[1:0] sel
    );

    assign r = sel[1] ? (sel[0] ? d : c) : (sel[0] ? b : a);
endmodule
Attachments

sum.png
sum.png (9.07 KiB) Viewed 10457 times

belfegor96
Senior
Posts: 100
Joined: 09 Jun 2022 07:49

Re: 1-битный процессор микрокода на эмиттерно-связанной логи

Post by belfegor96 »

belfegor96 wrote: Но у меня проблема выглядит непонятной ещё в плане того, что есть разные "классы" соединений: логика же "трёхэтажная", в ней используются три уровня напряжений. "Верхний" выход может управлять более "нижним" на одну ступень входом, но ни как иначе. Плюс, есть конвертеры напряжений из "нижних" в "верхние"

Пока ещё не понимаю как и куда нужно вставить информацию об этих типах входов-выходов. Ситуация явно нестандартная. Возможно, нужно делать библиотеку своих готовых элементов или как-то так.
Нашлось!

Существует Liberty User Guides and Reference Manual Suite Version 2017.06 (может и новее есть, но не нагуглилось). Там описан формат Liberty для описания характеристик (временных, например) гейтов, мультиплексоров и всего прочего необходимого.

И там есть всякое про Multivoltage Design, в том числе Cell-Level Attributes. Видимо, по понятным причинам, это всё редко используется в FPGA, потому и запрятано.

Проблема в том что в репозиториях YosysHQ слово "input_voltage_range" вообще не встречается...
User avatar
Shaos
Admin
Posts: 23664
Joined: 09 Jan 2003 06:22
Location: Silicon Valley
Contact:

Re: 1-битный процессор микрокода на эмиттерно-связанной логи

Post by Shaos »

Это не то что редко используется в FPGA - это НИКАК не используется в FPGA, т.к. FPGA это сугубо двоичный дизайн ВСЕГДА - в mixed они уходят по входам-выходам разве что - вот там можно разные логические уровни подавать на разные ноги, однако там всё равно всё двоичное - будь то 5V-толерант или 3.3V или 1.8V - всё равно есть порог выше которого "1", а ниже которого "0"...
Я тут за главного - если что шлите мыло на me собака shaos точка net
belfegor96
Senior
Posts: 100
Joined: 09 Jun 2022 07:49

Re: 1-битный процессор микрокода на эмиттерно-связанной логи

Post by belfegor96 »

Я живой и потихоньку делаю модель на SystemVerilog. Скоро она сможет jump и можно будет тестовые программы гонять
belfegor96
Senior
Posts: 100
Joined: 09 Jun 2022 07:49

Re: 1-битный процессор микрокода на эмиттерно-связанной логи

Post by belfegor96 »

Я живой. Все команды реализовал, надо ещё регистровый файл сделать и минимально юзабельную поддержку прерываний

Обмазываюсь инфой о прерываниях - ранее никогда с ними не сталкивался на таком низком уровне
Post Reply