32-битный персональный компьютер nedoPC-5 на RISC-V

Публичный форум для http://www.nedopc.org/nedopc

Moderator: Shaos

User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: 32-битный персональный компьютер nedoPC-5

Post by Shaos »

Добил почти все тесты на совместимость - один никак не поддаётся :(

Code: Select all

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
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: 32-битный персональный компьютер nedoPC-5

Post by Shaos »

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: Select all

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

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

  always @(<event>)
    var = value;

endmodule
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: 32-битный персональный компьютер nedoPC-5

Post by Shaos »

Shaos wrote:Получил бесплатно платку UPDuino v2.0 для экспериментов ;)
UPDuino2.jpg
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 с лицевой стороны (как на фотке) и ещё один сзади на второй регулятор напряжения:
upduino_caps.jpg
Источник: https://www.eevblog.com/forum/microcontrollers/8$-ice40-developer-board/100/
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: 32-битный персональный компьютер nedoPC-5

Post by Shaos »

Померял скорость в вериляторе (который компилирует верилог в си++) - получилось, что за секунду моя модель 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: Select all

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: Select all

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)
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: 32-битный персональный компьютер nedoPC-5

Post by Shaos »

Сегодня исправил ошибку в картинке ниже - ногу 36 они неправильно назвали 35 т.е. на картинке как бы две ноги с именем 35 было - я полдня убил пока понял почему у меня не то этот выход показывает...
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: 32-битный персональный компьютер nedoPC-5

Post by Shaos »

вот эту программку запускаю на реальной железяке в своей реализации RISC-V:

Code: Select all

/*
 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: Select all

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):
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: 32-битный персональный компьютер nedoPC-5

Post by Shaos »

Но кроме 'H' оно почему-то больше ничего не выводит :(

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

P.S. т.к. 'H' через STORE таки выводится, могу предположить, что неправильно работает LOAD...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: 32-битный персональный компьютер nedoPC-5

Post by Shaos »

А сегодня оно почему-то взяло и стало "печатать" все буквы! :o

Code: Select all

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 ... be2-test1​

Вот как оно всё собирается вместе:

Code: Select all

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: Select all

# ##############################################################################
# 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: Select all

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%
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: 32-битный персональный компьютер nedoPC-5

Post by Shaos »

Теперь надо приладить вывод в последовательный порт со скоростью 115200 например, а пока символ выводится побитно процык надо тормозить - в таком случае можно будет на максимальной скорости гнать вычисления и спать в процессе вывода на терминал...

P.S. Далее можно будет включить внутреннюю память FPGA как ОЗУ и написать небольшую программку во встроенном ПЗУ, которая бы позволяла загонять пользовательский код в ОЗУ и запускать его на исполнение - в этом случае можно сказать уже полноценный компьютер получится...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: 32-битный персональный компьютер nedoPC-5

Post by Shaos »

Shaos wrote:А сегодня оно почему-то взяло и стало "печатать" все буквы! :o

Code: Select all

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 ... be2-test1​
Наконец-то дошли руки записать видео :roll:


https://youtu.be/lu0mPxgJ4UI

Напоминаю, что светодиоды показывают инвертированные значения т.к. подключены к питанию...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: 32-битный персональный компьютер nedoPC-5 на RISC-V

Post by Shaos »

Добавил в проект RS232 передатчик:

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

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

Code: Select all

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: Select all

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: Select all

#####################################################################
                     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 МГц):
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: 32-битный персональный компьютер nedoPC-5 на RISC-V

Post by Shaos »

Все необходимые файлы для этого теста - тут:

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: Select all

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-ов...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: 32-битный персональный компьютер nedoPC-5 на RISC-V

Post by Shaos »

Вот на всякий случай диалог создания нового проекта в iCEcube2 для UPDuino - надо Device Package поставить в SG48 и напряжение в банках IO выбрать 3.3V:
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: 32-битный персональный компьютер nedoPC-5 на RISC-V

Post by Shaos »

Подцепил вот такую штуку (их в чипе четыре) - команды LOAD и STORE вроде работают (clock правда пришлось инвертировать, чтобы читало адрес когда надо):
SB_SPRAM256KA.gif
Цеплял вот так:

Code: Select all

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 работают в противофазе...
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 24008
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: 32-битный персональный компьютер nedoPC-5 на RISC-V

Post by Shaos »

Теперь надо бы запись в память сделать по RS-232 и запуск с произвольного адреса...

P.S. Например по адресу 0xFFFFFFFE можно будет программно проверять не пришёл ли символ (0 - не пришёл), а по адресу 0xFFFFFFFF - забирать код пришедшего символа:

Code: Select all

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
Я тут за главного - если что шлите мыло на me собака shaos точка net