nedoPC.org

Community of electronics hobbyists established in 2002

...
Atom Feed | View unanswered posts | View active topics It is currently 16 Jan 2019 20:54



Reply to topic  [ 30 posts ]  Go to page Previous  1, 2
32-битный персональный компьютер nedoPC-5 на RISC-V 
Author Message
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17307
Location: Colorado
Reply with quote
Добил почти все тесты на совместимость - один никак не поддаётся :(
Code:
Check         I-ADD-01 ... OK
Check        I-ADDI-01 ... OK
Check         I-AND-01 ... OK
Check        I-ANDI-01 ... OK
Check       I-AUIPC-01 ... OK
Check         I-BEQ-01 ... OK
Check         I-BGE-01 ... OK
Check        I-BGEU-01 ... OK
Check         I-BLT-01 ... OK
Check        I-BLTU-01 ... OK
Check         I-BNE-01 ... OK
Check       I-CSRRC-01 ... OK
Check      I-CSRRCI-01 ... OK
Check       I-CSRRS-01 ... OK
Check      I-CSRRSI-01 ... OK
Check       I-CSRRW-01 ... OK
Check      I-CSRRWI-01 ... OK
Check I-DELAY_SLOTS-01 ... OK
Check      I-EBREAK-01 ... OK
Check       I-ECALL-01 ... OK
Check   I-ENDIANESS-01 ... OK
Check     I-FENCE.I-01 ... OK
Check             I-IO ... OK
Check         I-JAL-01 ... OK
Check        I-JALR-01 ... OK
Check          I-LB-01 ... OK
Check         I-LBU-01 ... OK
Check          I-LH-01 ... OK
Check         I-LHU-01 ... OK
Check         I-LUI-01 ... OK
Check          I-LW-01 ... OK
Check I-MISALIGN_JMP-01 ... FAIL
Check I-MISALIGN_LDST-01 ... OK
Check         I-NOP-01 ... OK
Check          I-OR-01 ... OK
Check         I-ORI-01 ... OK
Check     I-RF_size-01 ... OK
Check    I-RF_width-01 ... OK
Check       I-RF_x0-01 ... OK
Check          I-SB-01 ... OK
Check          I-SH-01 ... OK
Check         I-SLL-01 ... OK
Check        I-SLLI-01 ... OK
Check         I-SLT-01 ... OK
Check        I-SLTI-01 ... OK
Check       I-SLTIU-01 ... OK
Check        I-SLTU-01 ... OK
Check         I-SRA-01 ... OK
Check        I-SRAI-01 ... OK
Check         I-SRL-01 ... OK
Check        I-SRLI-01 ... OK
Check         I-SUB-01 ... OK
Check          I-SW-01 ... OK
Check         I-XOR-01 ... OK
Check        I-XORI-01 ... OK
--------------------------------
FAIL: 1/55

_________________
:eugeek: https://twitter.com/Shaos1973


27 Nov 2018 01:41
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17307
Location: Colorado
Reply with quote
Shaos wrote:
UPDATE 22-NOV-2018: Первую версию компьютера (альфа) nedoPC-5-A планирую сделать вот на этой платке, что чуть ниже, которая имеет на борту FPGA iCE40 5K (с 5 тыщами лутов и 1 мегабитом блочной памяти), и назвать сей продукт "IceAge" :mrgreen:
Для FPGA надо будет написать на "Вырвиглотке" свою реализацию RISC-V (как минимум подсистемы RV32I) и назвать её скажем Retro-V, т.к. она будет давать людям возможность работать с этой платкой, как старым добрым микропроцессором - у платки будет внешняя шина адреса (16 бит) и данных (8 бит) с некоторым количеством управляющих сигналов (внутренняя память тоже возможно будет задействована, но там будет скажем подпрограммы для имитации команд работы с плавающей точкой RV32F и RV32D, которые будут вызываться по исключительному состоянию нелегального опкода ну и например графическая подсистема : )


Надо попробовать сделать шину данных у FPGA как ввод-вывод (чтобы на настоящий микропроцессор больше походило) вот по этому рецепту:

https://electronics.stackexchange.com/questions/22220/how-to-assign-value-to-bidirectional-port-in-verilog

Code:
module test (value, var);
  inout value;
  output reg var;

  assign value = (condition) ? <some value / expression> : 'bz;

  always @(<event>)
    var = value;

endmodule

_________________
:eugeek: https://twitter.com/Shaos1973


27 Nov 2018 17:42
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17307
Location: Colorado
Reply with quote
Shaos wrote:
Получил бесплатно платку UPDuino v2.0 для экспериментов ;)

Attachment:
The attachment UPDuino2.jpg is no longer available


Quote:
A low cost, minimalistic Arduino-like breakout board with Lattice Ultraplus FPGA and a USB programming device

Gnarly Grey UPDuino v2.0 Board Features:
  • Lattice UltraPlus FPGA
  • 5.3K LUTs, 1Mb SPRAM, 120Kb DPRAM, 8 Multipliers
  • FTDI FT232H USB to SPI Device for FPGA programming
  • 12Mhz Crystal Oscillator Clock Source
  • 34 GPIO on 0.1” headers
  • SPI Flash, RGB LED, 3.3V and 1.2V Regulators
  • Open source PCB design in Eagle and Programming Instructions


P.S. Она опенсорц даже: https://github.com/gtjennings1/UPDuino_v2_0

Ещё приобрёл UPDuino v1.0 - она всего за $7.99 продаётся т.к. без USB и с ошибками - как минимум надо 3 микрофарадных конденсатора припаять - 2 с лицевой стороны (как на фотке) и ещё один сзади на второй регулятор напряжения:

Attachment:
upduino_caps.jpg
upduino_caps.jpg [ 33.01 KiB | Viewed 695 times ]

Источник: https://www.eevblog.com/forum/microcontrollers/8$-ice40-developer-board/100/

_________________
:eugeek: https://twitter.com/Shaos1973


28 Nov 2018 00:20
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17307
Location: Colorado
Reply with quote
Померял скорость в вериляторе (который компилирует верилог в си++) - получилось, что за секунду моя модель RISC-V (см. https://gitlab.com/shaos/retro-v) успевает пробежать 1.8 миллионов тактов, что я считаю ОЧЕНЬ неплохо (т.е. 1.8 МГц частота виртуального процессора - это при в 2 раза большем количестве шагов симуляции т.к. симулируется clk=1 и потом clk=0)

P.S. А на домашнем AMD64 серваке получилось аж 2.2 МГц!!! :o

P.P.S. Прогнал Dhrystone собранный для RISC-V на вериляторе через свою модель (поставив правильное значение HZ для измерения счётчика RDCYCLE, который используется в Dhrystone варианте для RISC-V):
Code:
Dhrystone Benchmark, Version C, Version 2.2
Program compiled without 'register' attribute
Using rdcycle(), HZ=500000

Trying 500 runs through Dhrystone:
Final values of the variables used in the benchmark:

Int_Glob:            5
        should be:   5
Bool_Glob:           1
        should be:   1
Ch_1_Glob:           A
        should be:   A
Ch_2_Glob:           B
        should be:   B
Arr_1_Glob[8]:       7
        should be:   7
Arr_2_Glob[8][7]:    510
        should be:   Number_Of_Runs + 10
Ptr_Glob->
  Ptr_Comp:          -2147452480
        should be:   (implementation-dependent)
  Discr:             0
        should be:   0
  Enum_Comp:         2
        should be:   2
  Int_Comp:          17
        should be:   17
  Str_Comp:          DHRYSTONE PROGRAM, SOME STRING
        should be:   DHRYSTONE PROGRAM, SOME STRING
Next_Ptr_Glob->
  Ptr_Comp:          -2147452480
        should be:   (implementation-dependent), same as above
  Discr:             0
        should be:   0
  Enum_Comp:         1
        should be:   1
  Int_Comp:          18
        should be:   18
  Str_Comp:          DHRYSTONE PROGRAM, SOME STRING
        should be:   DHRYSTONE PROGRAM, SOME STRING
Int_1_Loc:           5
        should be:   5
Int_2_Loc:           13
        should be:   13
Int_3_Loc:           7
        should be:   7
Enum_Loc:            1
        should be:   1
Str_1_Loc:           DHRYSTONE PROGRAM, 1'ST STRING
        should be:   DHRYSTONE PROGRAM, 1'ST STRING
Str_2_Loc:           DHRYSTONE PROGRAM, 2'ND STRING
        should be:   DHRYSTONE PROGRAM, 2'ND STRING

Microseconds for one run through Dhrystone: 902
Dhrystones per Second:                      1108
mcycle = 225523

что есть 1108 / 1757 = 0.63 DMIPS

Если симулируется 2 МГц, то у меня получается 0.63/2=0.315 DMIPS/MHz, что в 5.5 раз меньше официального RISC-V rocket core показателя в 1.72 DMIPS/MHz (см. https://riscv.org/2014/10/about-our-dhrystone-benchmarking-methodology/), что объяснимо, т.к. там вроде как инструкция на такт (а у меня инструкция на 4 такта).

Если мы будем запускать FPGA с тактовой частотой 25 МГц (предполагаемая максимальная частота по результатам синтеза в iCEcube2), то теоретически должно получиться 0.315*25=7.87 DMIPS

P.P.P.S. Статистика по использованию инструкций в Dhrystone такая (собрано 23 декабря 2018):
Code:
Instructions Stat:
LUI   = 892
AUIPC   = 7716
JAL   = 11212
JALR   = 12850
BEQ   = 33399
BNE   = 11298
BLT   = 1721
BGE   = 3480
BLTU   = 7017
BGEU   = 2248
LW   = 31050
LBU   = 27712
LHU   = 502
SB   = 4968
SH   = 502
SW   = 33037
ADDI   = 87830
SLTIU   = 1500
XORI   = 1
ORI   = 1
ANDI   = 6151
SLLI   = 10647
SRLI   = 9534
SRAI   = 95
ADD   = 11486
SUB   = 2813
SLL   = 402
SLTU   = 1844
SRL   = 353
OR   = 2459
CSRRW   = 1
CSRRS   = 8
LI*   = 20602

Five Most Frequent:
1) ADDI   = 87830 (27.05%)
2) BEQ   = 33399 (10.29%)
3) SW   = 33037 (10.17%)
4) LW   = 31050 (9.56%)
5) LBU   = 27712 (8.53%)

Memory Reading Area 80000000...80007ae2
Memory Writing Area 80001000...80007b3f

>>> Execution time: 1425296449 ns
>>> Instruction count: 324730 (IPS=227833)
>>> Jumps: 50209 (15.46%) - 18074 forwards, 32135 backwards
>>> Branching T=26147 (44.19%) F=33016 (55.81%)

надо прикинуть CPI (Cycles Per Instruction) в Retro-V:
обычно инструкции занимают в Retro-V 4 такта, но передача управления - 5, а тут это происходило в 15.46% инструкций, т.е. 15.46% команд выполнялся 5 тактов
далее
SW = 33037 (10.17%) - 9 тактов
SH = 502 (0.15%) - 7 тактов
SB = 4968 (1.5%) - 6 тактов
LW = 31050 (9.56%) - 8 тактов
LHU = 502 (0.15%) - 6 тактов
LBU = 27712 (8.53%) - 5 тактов
можно пренебречь теми что меньше 1 процента, остаётся:
15.46% - 5 тактов
10.17% - 9 тактов
1.5% - 6 тактов
9.56% - 8 тактов
8.53% - 5 тактов
плюс оставшиеся
54.78% - 4 такта
получается 0.5478*4+0.0853*5+0.0956*8+0.015*6+0.1017*9+0.1546*5 = 5.1608 тактов на инструкцию в среднем (на примере теста Dhrystone)

_________________
:eugeek: https://twitter.com/Shaos1973


02 Dec 2018 00:21
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17307
Location: Colorado
Reply with quote
Сегодня исправил ошибку в картинке ниже - ногу 36 они неправильно назвали 35 т.е. на картинке как бы две ноги с именем 35 было - я полдня убил пока понял почему у меня не то этот выход показывает...


Attachments:
top_orientation.jpg
top_orientation.jpg [ 142.42 KiB | Viewed 553 times ]

_________________
:eugeek: https://twitter.com/Shaos1973
09 Dec 2018 21:58
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17307
Location: Colorado
Reply with quote
вот эту программку запускаю на реальной железяке в своей реализации RISC-V:
Code:
/*
 Frank Buss: compile like this: riscv32-unknown-elf-gcc -O3 -nostdlib test1.c -o test1
 or
 riscv64-unknown-elf-gcc -march=rv32i -mabi=ilp32 -O3 -nostdlib test1.c -o test1
*/
void _start()
{
    volatile char* tx = (volatile char*) 0x40002000;
    const char* hello = "Hello RISC-V!\n";
    while (*hello) {
        *tx = *hello;
        hello++;
    }
}

которая компилируется вот в такой код:
Code:
test1:     file format elf32-littleriscv


Disassembly of section .text:

00010054 <_start>:
   10054:   000107b7             lui   a5,0x10
   10058:   07878793             addi   a5,a5,120 # 10078 <_start+0x24>
   1005c:   04800713             li   a4,72
   10060:   400026b7             lui   a3,0x40002
   10064:   00e68023             sb   a4,0(a3) # 40002000 <__global_pointer$+0x3fff0778>
   10068:   00178793             addi   a5,a5,1
   1006c:   0007c703             lbu   a4,0(a5)
   10070:   fe071ae3             bnez   a4,10064 <_start+0x10>
   10074:   00008067             ret

вроде по адресам бежит верно и где надо читает и пишет данные с шины, но пока чего-то буквы не выводятся...

P.S. наконец вывелась первая буква 'H' (0x48 или 72):


Attachments:
UPDuino2bb1.jpg
UPDuino2bb1.jpg [ 36.68 KiB | Viewed 552 times ]

_________________
:eugeek: https://twitter.com/Shaos1973
09 Dec 2018 22:58
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17307
Location: Colorado
Reply with quote
Но кроме 'H' оно почему-то больше ничего не выводит :(

Теперь надо понять толи у меня LOAD неправильно работает (который читает буквы из памяти), то ли STORE (которым эти буквы пишутся в порт вывода)

P.S. т.к. 'H' через STORE таки выводится, могу предположить, что неправильно работает LOAD...

_________________
:eugeek: https://twitter.com/Shaos1973


10 Dec 2018 01:25
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17307
Location: Colorado
Reply with quote
А сегодня оно почему-то взяло и стало "печатать" все буквы! :o
Code:
01001000 = 0x48 = 'H'
01100101 = 0x65 = 'e'
01101100 = 0x6C = 'l'
​01101100 = 0x6C = 'l'
​01101111 = 0x6F = 'o'
​00100000 = 0x20 = ' '
​01010010 = 0x52 = 'R'
​01001001 = 0x49 = 'I'
​01010011 = 0x53 = 'S'
​01000011 = 0x43 = 'C'
​00101101 = 0x2D = '-'
​01010110 = 0x56 = 'V'
​00100001 = 0x21 = '!'
​00001010 = 0x0A = '\n'

Выложил исходники, пока работает ;)

https://gitlab.com/shaos/retro-v/tree/m ... ube2-test1

Вот как оно всё собирается вместе:
Code:
module top(dataout,addrout,wren,REDn,BLUn,GRNn);

output [7:0] dataout;
output [15:0] addrout;
output wire wren;
output  wire        REDn,       // Red
output  wire        BLUn,       // Blue
output  wire        GRNn,       // Green

reg [27:0]  frequency_counter_i;

wire [15:0] address;
wire [7:0] data;
wire clk;

//----------------------------------------------------------------------------
//                                                                          --
//                       Internal Oscillator                                --
//                                                                          --
//----------------------------------------------------------------------------
    SB_HFOSC  u_SB_HFOSC(.CLKHFPU(1'b1), .CLKHFEN(1'b1), .CLKHF(int_osc));


//----------------------------------------------------------------------------
//                                                                          --
//                       Counter                                            --
//                                                                          --
//----------------------------------------------------------------------------
    always @(posedge int_osc) begin
       frequency_counter_i <= frequency_counter_i + 1'b1;
    end

assign clk = frequency_counter_i[23];

retro cpu (
.nres(1'b1),
.clk(clk),
.hold(1'b0),
.address(address),
.data_in(data),
.data_out(dataout),
.wren(wren)
);

assign addrout = address;

// rom #(10) prog (address[9:0],data);

rom prog (address[7:0],data);

//----------------------------------------------------------------------------
//                                                                          --
//                       Instantiate RGB primitive                          --
//                                                                          --
//----------------------------------------------------------------------------
    SB_RGBA_DRV RGB_DRIVER (
      .RGBLEDEN (1'b1),
      .RGB0PWM  (1'b0),//(frequency_counter_i[25]),//(frequency_counter_i[25]&frequency_counter_i[24]),//GREEN
      .RGB1PWM  (clk),//(frequency_counter_i[26]),//(frequency_counter_i[25]&~frequency_counter_i[24]),//BLUE
      .RGB2PWM  (wren),//(frequency_counter_i[27]),//(~frequency_counter_i[25]&frequency_counter_i[24]),//RED
      .CURREN   (1'b1),
      .RGB0     (GRNn), //Actual Hardware connection - black,green,blue,cyan,red,yellow,magenta,white
      .RGB1     (BLUn),
      .RGB2     (REDn)
    );
    defparam RGB_DRIVER.RGB0_CURRENT = "0b000001";
    defparam RGB_DRIVER.RGB1_CURRENT = "0b000001";
    defparam RGB_DRIVER.RGB2_CURRENT = "0b000001";

endmodule


Привязка ног:
Code:
# ##############################################################################
# iCEcube PCF
# Version:            2017.08.27940
# File Generated:     Dec 9 2018 21:39:48
# Family & Device:    iCE40UP5K
# Package:            SG48
# ##############################################################################

###IOSet List 9
set_io dataout[0] 2
set_io dataout[1] 46
set_io dataout[2] 47
set_io dataout[3] 45
set_io dataout[4] 48
set_io dataout[5] 3
set_io dataout[6] 4
set_io dataout[7] 44
set_io wren 6


Статистика по использованным ресурсам:
Code:
Design statistics:
------------------
    FFs:                  336
    LUTs:                 2211
    RAMs:                 4
    IOBs:                 25
    GBs:                  5
    PLLs:                 0
    Warm Boots:           0
    SPIs:                 0
    I2Cs:                 0
    HFOSCs:               1
    LFOSCs:               0
    RGBA_DRVs:            1
    LEDDA_IPs:            0
    DSPs:                 0
    SPRAMs:               0
    FILTER_50NSs:         0

Logic Resource Utilization:
---------------------------
    Total Logic Cells: 2313/5280
        Combinational Logic Cells: 1977     out of   5280      37.4432%
        Sequential Logic Cells:    336      out of   5280      6.36364%
        Logic Tiles:               342      out of   660       51.8182%
    Registers:
        Logic Registers:           336      out of   5280      6.36364%
        IO Registers:              0        out of   480       0
    Block RAMs:                    4        out of   30        13.3333%
    Warm Boots:                    0        out of   1         0%
    SPIs:                          0        out of   2         0%
    I2Cs:                          0        out of   2         0%
    HFOSCs:                        1        out of   1         100%
    LFOSCs:                        0        out of   1         0%
    RGBA_DRVs:                     1        out of   1         100%
    LEDDA_IPs:                     0        out of   1         0%
    DSPs:                          0        out of   8         0%
    SPRAMs:                        0        out of   4         0%
    FILTER_50NSs:                  0        out of   2         0%
    Pins:
        Input Pins:                0        out of   39        0%
        Output Pins:               25       out of   39        64.1026%
        InOut Pins:                0        out of   39        0%
    Global Buffers:                5        out of   8         62.5%
    PLLs:                          0        out of   1         0%

IO Bank Utilization:
--------------------
    Bank 3: 0        out of   0         0%
    Bank 1: 0        out of   0         0%
    Bank 0: 13       out of   17        76.4706%
    Bank 2: 12       out of   22        54.5455%

_________________
:eugeek: https://twitter.com/Shaos1973


12 Dec 2018 23:16
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17307
Location: Colorado
Reply with quote
Теперь надо приладить вывод в последовательный порт со скоростью 115200 например, а пока символ выводится побитно процык надо тормозить - в таком случае можно будет на максимальной скорости гнать вычисления и спать в процессе вывода на терминал...

P.S. Далее можно будет включить внутреннюю память FPGA как ОЗУ и написать небольшую программку во встроенном ПЗУ, которая бы позволяла загонять пользовательский код в ОЗУ и запускать его на исполнение - в этом случае можно сказать уже полноценный компьютер получится...

_________________
:eugeek: https://twitter.com/Shaos1973


13 Dec 2018 00:01
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17307
Location: Colorado
Reply with quote
Shaos wrote:
А сегодня оно почему-то взяло и стало "печатать" все буквы! :o
Code:
01001000 = 0x48 = 'H'
01100101 = 0x65 = 'e'
01101100 = 0x6C = 'l'
​01101100 = 0x6C = 'l'
​01101111 = 0x6F = 'o'
​00100000 = 0x20 = ' '
​01010010 = 0x52 = 'R'
​01001001 = 0x49 = 'I'
​01010011 = 0x53 = 'S'
​01000011 = 0x43 = 'C'
​00101101 = 0x2D = '-'
​01010110 = 0x56 = 'V'
​00100001 = 0x21 = '!'
​00001010 = 0x0A = '\n'

Выложил исходники, пока работает ;)

https://gitlab.com/shaos/retro-v/tree/m ... ube2-test1

Наконец-то дошли руки записать видео :roll:


https://youtu.be/lu0mPxgJ4UI

Напоминаю, что светодиоды показывают инвертированные значения т.к. подключены к питанию...

_________________
:eugeek: https://twitter.com/Shaos1973


25 Dec 2018 02:01
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17307
Location: Colorado
Reply with quote
Добавил в проект RS232 передатчик:

https://github.com/FrankBuss/adc4/blob/master/DDR3_RTL/rs232_sender.vhd

и запитал тактирование от внешнего генератор 12 МГц (есть на той же плате UPDuino v2.0):

Code:
module top(ext_osc,uart_tx,REDn,BLUn,GRNn);
input wire ext_osc; // 12 MHz
output wire uart_tx;

output  wire        REDn;       // Red
output  wire        BLUn;       // Blue
output  wire        GRNn;       // Green

reg [27:0]  frequency_counter_i;

wire [15:0] address;
wire [7:0] data,dataout;
wire clk,wren,hold,res;

always @(posedge ext_osc) begin
    frequency_counter_i <= frequency_counter_i + 1'b1;
end

assign clk = ext_osc;//frequency_counter_i[22];

retro cpu (
.nres(1'b1),
.clk(clk),
.hold(hold),
.address(address),
.data_in(data),
.data_out(dataout),
.wren(wren)
);

//assign addrout = address;

assign res = (address==16'h0)?1'b1:1'b0;

// RS232 sender by Frank Buss:
// entity rs232_sender is
//    generic (
//   system_speed, -- clk_i speed, in hz
//   baudrate : integer); -- baudrate, in bps
//    port (
//   clk_i : in std_logic;
//   dat_i : in unsigned(7 downto 0);
//   rst_i : in std_logic;
//   stb_i : in std_logic;
//   tx    : out std_logic;
//   busy  : out std_logic);
//end entity rs232_sender;

rs232_sender #(12000000,115200) TX (
.clk_i (ext_osc),
.dat_i (dataout),
.rst_i (res),
.stb_i (wren),
.tx (uart_tx),
.busy (hold)
);

//rom #(10) prog (clk,address[9:0],data);

rom prog (address[7:0],data);

SB_RGBA_DRV RGB_DRIVER (
      .RGBLEDEN (1'b1),
      .RGB0PWM  (hold),//GREEN
      .RGB1PWM  (clk),//BLUE
      .RGB2PWM  (wren),//RED
      .CURREN   (1'b1),
      .RGB0     (GRNn),
      .RGB1     (BLUn),
      .RGB2     (REDn)
);
defparam RGB_DRIVER.RGB0_CURRENT = "0b000001";
defparam RGB_DRIVER.RGB1_CURRENT = "0b000001";
defparam RGB_DRIVER.RGB2_CURRENT = "0b000001";

endmodule

RGB на такой частоте просто белым светит, ну да ладно - пусть остаётся...

RS232 посылальщик когда получает букву для отправки, выставляет сигнал "busy", который ставит Retro-V ЦПУ в режим "hold", пока буква не отправится, а так процык работает на 12 МГц и печатает в терминале это:
Code:
Hello RISC-V!
Hello RISC-V!
Hello RISC-V!
Hello RISC-V!
Hello RISC-V!
Hello RISC-V!
Hello RISC-V!


Судя по выводу iCEcube2 процык здесь может до 20 МГц быть разогнан :roll:
Code:
#####################################################################
                     Clock Summary
=====================================================================
Number of clocks: 1
Clock: top|ext_osc | Frequency: 19.98 MHz | Target: 36.62 MHz
=====================================================================
                     End of Clock Summary
#####################################################################


Ниже картинка из iCEcube2 где видно номера ног (37 пин надо проводочком соединить со вторым справа-снизу - это 12 МГц):


Attachments:
iCEcube2-retro1s-pins.gif
iCEcube2-retro1s-pins.gif [ 44.38 KiB | Viewed 314 times ]

_________________
:eugeek: https://twitter.com/Shaos1973
30 Dec 2018 01:45
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17307
Location: Colorado
Reply with quote
Все необходимые файлы для этого теста - тут:

https://gitlab.com/shaos/retro-v/tree/master/FPGA/iCEcube2-test1s

P.S. Заметки на полях:
ROM с программой "Hello RISC-V" занимает 196 LUTs
Barrel Shifter (выполняющий 32-битный сдвиг на любое количество бит за 1 такт) занимает 727 LUTs
А всё вместе:
Code:
Final Design Statistics
    Number of LUTs         :   2301
    Number of DFFs         :   340
    Number of DFFs packed to IO   :   0
    Number of Carrys       :   281
    Number of RAMs         :   4
    Number of ROMs         :   0
    Number of IOs          :   1
    Number of GBIOs        :   1
    Number of GBs          :   4
    Number of WarmBoot     :   0
    Number of PLLs         :   0
    Number of I2Cs         :   0
    Number of SPIs         :   0
    Number of DSPs        :   0
    Number of SBIOODs        :   0
    Number of LEDDAIPs        :   0
    Number of RGBADRVs        :   1
    Number of LFOSCs        :   0
    Number of HFOSCs        :   0
    Number of FILTER_50NSs        :   0
    Number of SPRAMs        :   0
Device Utilization Summary
    LogicCells                  :   2393/5280
    PLBs                        :   357/660
    BRAMs                       :   4/30
    IOs and GBIOs               :   2/36
    PLLs                        :   0/1
    I2Cs                        :   0/2
    SPIs                        :   0/2
    DSPs                        :   0/8
    SBIOODs                     :   0/3
    RGBADRVs                    :   1/1
    LEDDAIPs                    :   0/1
    LFOSCs                      :   0/1
    HFOSCs                      :   0/1
    SPRAMs                      :   0/4
    FILTER50NSs                 :   0/2

т.е. если я смогу сделать шифтер покомпактее (размазав вычисления на несколько тактов), то ядро Retro-V без системных регистров и трапов (как сейчас) может уместиться в 1.5K LUT-ов...

_________________
:eugeek: https://twitter.com/Shaos1973


30 Dec 2018 11:24
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17307
Location: Colorado
Reply with quote
Вот на всякий случай диалог создания нового проекта в iCEcube2 для UPDuino - надо Device Package поставить в SG48 и напряжение в банках IO выбрать 3.3V:


Attachments:
iCEcube2-new.png
iCEcube2-new.png [ 44.28 KiB | Viewed 286 times ]

_________________
:eugeek: https://twitter.com/Shaos1973
30 Dec 2018 14:44
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17307
Location: Colorado
Reply with quote
Подцепил вот такую штуку (их в чипе четыре) - команды LOAD и STORE вроде работают (clock правда пришлось инвертировать, чтобы читало адрес когда надо):

Attachment:
SB_SPRAM256KA.gif
SB_SPRAM256KA.gif [ 111.66 KiB | Viewed 273 times ]


Цеплял вот так:
Code:
module top(ext_osc,uart_tx,REDn,BLUn,GRNn);
input wire ext_osc; // 12 MHz
output wire uart_tx;

output  wire        REDn;       // Red
output  wire        BLUn;       // Blue
output  wire        GRNn;       // Green

wire [16:0] address;
wire [7:0] data,datah,datal,dataout;
wire clk,wren,hold,res;

parameter CUSTOM_START = 32'h00010054;

assign clk = ext_osc;

retro cpu (
.nres(1'b1),
.clk(clk),
.hold(hold),
.address(address),
.data_in(address[16]?data:(address[0]?datah:datal)),
.data_out(dataout),
.wren(wren)
);
defparam cpu.ADDRESS_WIDTH = 17;
defparam cpu.START_ADDR = CUSTOM_START;

//assign addrout = address;

assign res = (address==CUSTOM_START[16:0])?1'b1:1'b0;

// RS232 sender by Frank Buss:
// entity rs232_sender is
//    generic (
//   system_speed, -- clk_i speed, in hz
//   baudrate : integer); -- baudrate, in bps
//    port (
//   clk_i : in std_logic;
//   dat_i : in unsigned(7 downto 0);
//   rst_i : in std_logic;
//   stb_i : in std_logic;
//   tx    : out std_logic;
//   busy  : out std_logic);
//end entity rs232_sender;

rs232_sender #(12000000,115200) TX (
.clk_i (ext_osc),
.dat_i (dataout),
.rst_i (res),
.stb_i ((address==17'b11111111111111111)?wren:1'b0),
.tx (uart_tx),
.busy (hold)
);

rom prog (address[8:0],data);

SB_SPRAM256KA MEM (
.ADDRESS (address[14:1]),
.DATAIN ({dataout,dataout}),
.DATAOUT ({datah,datal}),
.MASKWREN (address[0]?4'b1100:4'b0011),
.WREN (wren),
.CHIPSELECT (~address[16]),
.CLOCK (~clk),
.POWEROFF (1'b1)
);

SB_RGBA_DRV RGB_DRIVER (
      .RGBLEDEN (1'b1),
      .RGB0PWM  (hold),//GREEN
      .RGB1PWM  (clk),//BLUE
      .RGB2PWM  (wren),//RED
      .CURREN   (1'b1),
      .RGB0     (GRNn),
      .RGB1     (BLUn),
      .RGB2     (REDn)
);
defparam RGB_DRIVER.RGB0_CURRENT = "0b000001";
defparam RGB_DRIVER.RGB1_CURRENT = "0b000001";
defparam RGB_DRIVER.RGB2_CURRENT = "0b000001";

endmodule

тут как бы 2 памяти живут - ROM для стартовой программы (xxx10000) и RAM для данных (xxx00000) - выбирается 17м битом адреса (address[16])
может ли код запускаться из этого RAM пока незнаю - у меня STORE/LOAD и FETCH в Retro-V работают в противофазе...

_________________
:eugeek: https://twitter.com/Shaos1973


31 Dec 2018 01:03
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 17307
Location: Colorado
Reply with quote
Теперь надо бы запись в память сделать по RS-232 и запуск с произвольного адреса...

P.S. Например по адресу 0xFFFFFFFE можно будет программно проверять не пришёл ли символ (0 - не пришёл), а по адресу 0xFFFFFFFF - забирать код пришедшего символа:
Code:
char termin(void)
{
 volatile char* rx = (volatile char*) 0xFFFFFFFF;
 volatile char* rx_status = (volatile char*) 0xFFFFFFFE;
 while(!*rx_status); // ждём сивмола из RS232
 return *rx; // возвращаем код символа
}
При частоте 12 МГц и скорости 115200 у нас будет больше тысячи тактов (это больше 200 инструкций), чтобы забрать пришедший символ, пока приёмник не принял следующий из RS-232

_________________
:eugeek: https://twitter.com/Shaos1973


02 Jan 2019 00:28
Profile WWW
Display posts from previous:  Sort by  
Reply to topic   [ 30 posts ]  Go to page Previous  1, 2

Who is online

Users browsing this forum: No registered users and 3 guests


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.