nedoPC.org

Community for electronics hobbyists, established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 09 Dec 2024 09:20



Reply to topic  [ 68 posts ]  Go to page Previous  1, 2, 3, 4, 5
1-битный процессор микрокода на эмиттерно-связанной логике? 
Author Message
Fanat

Joined: 09 Jun 2022 00:49
Posts: 83
Reply with quote
Shaos wrote:
Вот есть такая штука - PCBFlow для Yosys, которая из верилога (или даже VHDL) может делать печатную плату с транзисторами :)

https://github.com/cpldcpu/PCBFlow


Да, видел такую.

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

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


Last edited by belfegor96 on 22 Sep 2023 01:47, edited 1 time in total.



21 Sep 2023 02:40
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 23466
Location: Silicon Valley
Reply with quote
Ну видимо свой "techmapping" надо писать

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973


21 Sep 2023 08:18
Profile WWW
Fanat

Joined: 09 Jun 2022 00:49
Posts: 83
Reply with quote
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.

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


22 Sep 2023 17:37
Profile
Fanat

Joined: 09 Jun 2022 00:49
Posts: 83
Reply with quote
Придумал как вкрячить в АЛУ сдвиг вправо, чтобы не делать отдельное устройство

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

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

Code:
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 10336 times ]
23 Sep 2023 06:34
Profile
Fanat

Joined: 09 Jun 2022 00:49
Posts: 83
Reply with quote
belfegor96 wrote:
Но у меня проблема выглядит непонятной ещё в плане того, что есть разные "классы" соединений: логика же "трёхэтажная", в ней используются три уровня напряжений. "Верхний" выход может управлять более "нижним" на одну ступень входом, но ни как иначе. Плюс, есть конвертеры напряжений из "нижних" в "верхние"

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

Нашлось!

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

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

Проблема в том что в репозиториях YosysHQ слово "input_voltage_range" вообще не встречается...


05 Nov 2023 02:24
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 23466
Location: Silicon Valley
Reply with quote
Это не то что редко используется в FPGA - это НИКАК не используется в FPGA, т.к. FPGA это сугубо двоичный дизайн ВСЕГДА - в mixed они уходят по входам-выходам разве что - вот там можно разные логические уровни подавать на разные ноги, однако там всё равно всё двоичное - будь то 5V-толерант или 3.3V или 1.8V - всё равно есть порог выше которого "1", а ниже которого "0"...

_________________
https://mastodon.social/@Shaos :dj:
https://www.youtube.com/@Shaos1973


05 Nov 2023 12:43
Profile WWW
Fanat

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


18 Dec 2023 14:04
Profile
Fanat

Joined: 09 Jun 2022 00:49
Posts: 83
Reply with quote
Я живой. Все команды реализовал, надо ещё регистровый файл сделать и минимально юзабельную поддержку прерываний

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


31 Jul 2024 17:11
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 68 posts ]  Go to page Previous  1, 2, 3, 4, 5

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

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.