Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: NIOSII нестандартная загрузка
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
ZioN
Добрый день! Сразу скажу что системы на кристалле не строил, по этому вопросы могут быть глупыми, не судите строго smile.gif

Есть плата собственного изготовления, на которой находится микроконтроллер с аппаратным USB интерфейсом (используется как средство конфигурирования fpga PS-mode, и как средство коммуникации компьютера и fpga), собственно fpga EP1C3, 1-Mbit (128K x 8) Static RAM и др. элементы.

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

1. Как правильно получить бинарник программы, и как правильно ее загрузить (частями по 8бит, или по 32бита), "прочитав" Alternative Nios II Boot Methods, я так понял что бинарник можно получить с помощью конвертора который есть на сайте make_flash_image_script.sh (*.elf -> *.elf.flash.bin), или это не то что мне нужно?

Нажмите для просмотра прикрепленного файла

Reset Vector и Exception Vector установлены на начало SRAM, я так понимаю этот бинарник можно загружать в начало памяти?

2. Использую "краденый" Quartus 9.0 скаченный с торрентов, полноценно ли ядро Ниоса построенное в этом квартусе? smile.gif (то пробегали тут страшилки на форуме про лицензию)

Ну и на всякий случай общая картина:
Нажмите для просмотра прикрепленного файла
vadimuzzz
1. читать www.altera.com/literature/ug/ug_nios2_flash_programmer.pdf , особенно раздел про elf2flash.
Цитата
Reset Vector и Exception Vector установлены на начало SRAM
сброс на начало, вектор исключений смещен относительно сброса, цифры оставить дефолтные.
2. нужна правильная лицензия, иначе ядро будет time-limited
ZioN
Цитата(vadimuzzz @ May 5 2010, 01:46) *
1. читать www.altera.com/literature/ug/ug_nios2_flash_programmer.pdf , особенно раздел про elf2flash.

Делаю так:
[NiosII EDS]$ elf2flash --base=0x20000 --end=0x3ffff --reset=0x20000 --input=my_soc_app.elf --output=myapp.flash

Просмотрев флеш файл и objdump, я так понял что из того что там есть, нужные данные начинаются здесь:
Цитата
S00600002D454C3B
S32500000000140081003A48011004F8BF1016FDBF00B4004000145440083A68000800000000C7
S3250000002004EDFFDE1500C0DF150240D8150380D81504C0D8150500D9150640D9150780D94C
S325000000401508C0D97A300B00150900DA150A40DA150B80DA150CC0DA150D00DB150E40DB8E
S32500000060150F80DB1510C0DB151140D904FFFFEB1512C0DB3A3109004C00802826030010AC
S3250000008026020020C00E200006030000151240DF17FFBFE83AA03D00171140D9171240DF78
S325000000A01700C0DF7A700128170240D8170380D81704C0D8170500D9170640D9170780D979
.....

А можно прочитать где-то про протокол этого формата? (flash) Я так понимаю то что слева в строке включает в себя адрес и еще что-то, а последнее в строке, что-то вроде контрольной суммы?

Цитата(vadimuzzz @ May 5 2010, 01:46) *
сброс на начало, вектор исключений смещен относительно сброса, цифры оставить дефолтные.

Нажмите для просмотра прикрепленного файла

Цитата(vadimuzzz @ May 5 2010, 01:46) *
2. нужна правильная лицензия, иначе ядро будет time-limited

Нажмите для просмотра прикрепленного файла Нажмите для просмотра прикрепленного файла


2vadimuzzz: Спасибо что не поленились ответить на простые вопросы! smile.gif
vadimuzzz
Цитата
А можно прочитать где-то про протокол этого формата? (flash) Я так понимаю то что слева в строке включает в себя адрес и еще что-то, а последнее в строке, что-то вроде контрольной суммы?
да, примерно так. сам формат называется Motorola S-record, описание например тут

наличие отсутствия правильной лицензии можно определить по словам "Opencores" в логах компиляции квартуса. то, что он не ругается при запуске еще ни о чем не говорит. если есть сомнения на этот счет, давайте мыло
ZioN
Цитата(vadimuzzz @ May 5 2010, 13:53) *
да, примерно так. сам формат называется Motorola S-record, описание например тут

Теперь более чем понятно smile.gif Спасибо.

Цитата(vadimuzzz @ May 5 2010, 13:53) *
наличие отсутствия правильной лицензии можно определить по словам "Opencores" в логах компиляции квартуса. то, что он не ругается при запуске еще ни о чем не говорит. если есть сомнения на этот счет, давайте мыло


"Opencores" не нашел, но вот такое в логе присутствует, часть выхлопа SoPC Builder`а:

Цитата
# 2010.05.03 13:53:10 (*) Running Generator Program for cpu_0

# 2010.05.03 13:53:12 (*) Checking for plaintext license.
# 2010.05.03 13:53:13 (*) Couldn't query license setup in Quartus directory c:/altera/90/quartus
# 2010.05.03 13:53:13 (*) Defaulting to contents of LM_LICENSE_FILE environment variable
# 2010.05.03 13:53:14 (*) Plaintext license not found.
# 2010.05.03 13:53:14 (*) Checking for encrypted license (non-evaluation).
# 2010.05.03 13:53:14 (*) Couldn't query license setup in Quartus directory c:/altera/90/quartus
# 2010.05.03 13:53:14 (*) Defaulting to contents of LM_LICENSE_FILE environment variable

# 2010.05.03 13:53:15 (*) Encrypted license found. SOF will not be time-limited.
# 2010.05.03 13:53:15 (*) Getting CPU configuration settings
# 2010.05.03 13:53:15 (*) Elaborating CPU configuration settings
# 2010.05.03 13:53:15 (*) Creating all objects for CPU
# 2010.05.03 13:53:15 (*) Testbench
# 2010.05.03 13:53:16 (*) Instruction decoding
# 2010.05.03 13:53:16 (*) Instruction fields
# 2010.05.03 13:53:16 (*) Instruction decodes
# 2010.05.03 13:53:19 (*) Signals for RTL simulation waveforms

# 2010.05.03 13:53:20 (*) Instruction controls
# 2010.05.03 13:53:20 (*) Pipeline frontend
# 2010.05.03 13:53:20 (*) Pipeline backend
# 2010.05.03 13:53:27 (*) Generating HDL from CPU objects
# 2010.05.03 13:53:32 (*) Creating encrypted HDL


Можно вздохнуть спокойно? smile.gif

Оба лога:
Нажмите для просмотра прикрепленного файлаНажмите для просмотра прикрепленного файла
vadimuzzz
Цитата
Можно вздохнуть спокойно?

да, только HDL-исходников не увидите
ZioN
Добрый день, появились еще вопросы.

"Модуль" для загрузки программы Nios`а во внешнюю память сделал (пока процессор находится в сброшенном состоянии), теперь вот пытаюсь сделать модуль для SRAM (128K x 8) на Tristate bridge

Signals:
Нажмите для просмотра прикрепленного файла

Interfaces:
Нажмите для просмотра прикрепленного файла

Сам модуль:
Код
module new_component (
        input  wire        clk,            //       clock.clk
        input  wire        reset_n,        //            .reset_n
        input  wire [16:0] ats_s0_address, //          s0.address
        input  wire        ats_s0_read_n,  //            .read_n
        inout  wire [7:0]  ats_s0_data,    //            .data
        input  wire        ats_s0_write_n, //            .write_n
        output wire [16:0] HRW_Addr,       // conduit_end.export
        inout  wire [7:0]  HRW_Data,       //            .export
        output wire        HRW_nOE,        //            .export
        output wire        HRW_nWE         //            .export
    );
    
    assign HRW_Addr = ats_s0_address;
    assign HRW_Data = ats_s0_data;
    assign HRW_nOE = ats_s0_read_n;
    assign HRW_nWE = ats_s0_write_n;

endmodule



Сам процессор получился с такими вх./вых. параметрами:
Цитата
module mySoC (
// 1) global signals:
clk_0,
new_component_0_s0_data,
reset_n,

// the_new_component_0
HRW_Addr_from_the_new_component_0,
HRW_Data_to_and_from_the_new_component_0,
HRW_nOE_from_the_new_component_0,
HRW_nWE_from_the_new_component_0,

// the_pio_0
out_port_from_the_pio_0,

// the_spi_0
MISO_to_the_spi_0,
MOSI_from_the_spi_0,
SCLK_from_the_spi_0,
SS_n_from_the_spi_0,

// the_spi_1
MISO_to_the_spi_1,
MOSI_from_the_spi_1,
SCLK_from_the_spi_1,
SS_n_from_the_spi_1
);


Вот не могу понять что это за new_component_0_s0_data и для чего она здесь (как с ней работать)?
Да и правильно я вообще делаю, либо опять не так понял суть?
vadimuzzz
Цитата(ZioN @ May 14 2010, 22:18) *
Да и правильно я вообще делаю, либо опять не так понял суть?

в исходном посте вы писали, что модуль будет зашивать память во время, когда процессор сброшен, а тут он у вас уже в SOPC`е объявился. у меня есть большие сомнения, что шина Avalon будет работать во время сброса. как я понимаю, модуль должен быть внешним по отношению к SOPC + мультиплексор.
ZioN
Цитата(vadimuzzz @ May 15 2010, 02:00) *
в исходном посте вы писали, что модуль будет зашивать память во время, когда процессор сброшен, а тут он у вас уже в SOPC`е объявился. у меня есть большие сомнения, что шина Avalon будет работать во время сброса. как я понимаю, модуль должен быть внешним по отношению к SOPC + мультиплексор.


К плису подключен микроконтроллер, который собственное его конфигурирует, и передает в него данные ("пакетами" 63 байта + 1 байт команда = 64).

При передаче организован командный режим, т.е. по команде от контроллера, процессор запускается. (Есть команда последовательной загрузки в память с инкрементированием адреса).

Загрузка орагнизована таким образом, шина Авалона для связи "загручика" и памяти не используется, немного основного кода

Код
module TopLevelModule (
                    OSC_40,        //    Clock 40 MHz
                    TransIO,           //      Output test 16bit port                  
                    iuC,                  //      Шина для приема данных 8bit
                    iouC,                //      Вход тактирования шины
                    SRAM_Addr,
                    SRAM_Data,
                    SRAM_nOE,
                    SRAM_nWE
                );


input              OSC_40;
output     [15:0]   TransIO;
input      [7:0]  iuC;
input             iouC;

wire              processor_reset;

output  [16:0]  SRAM_Addr;
inout   [7:0]   SRAM_Data;
output             SRAM_nOE;
output             SRAM_nWE;

wire   [16:0]   mSRAM_Addr;
wire   [7:0]    mSRAM_Data;
wire            mSRAM_nOE;
wire            mSRAM_nWE;

wire  [16:0]    cpuSRAM_Addr;
wire  [7:0]     cpuSRAM_Data;
wire            cpuSRAM_nOE;
wire            cpuSRAM_nWE;

assign    SRAM_Addr = (processor_reset ? cpuSRAM_Addr : mSRAM_Addr);
assign    SRAM_Data = (processor_reset ? cpuSRAM_Data : mSRAM_Data);
assign    SRAM_nOE = (processor_reset ? cpuSRAM_nOE : mSRAM_nOE);
assign    SRAM_nWE = (processor_reset ? cpuSRAM_nWE : mSRAM_nWE);



mySoC   u2 (
            .clk_0(OSC_40), .reset_n(processor_reset),
            
            .out_port_from_the_pio_0(TransIO[15:8]),
            
            .new_component_0_s0_data(cpuSRAM_Data),
            
            .HRW_Addr_from_the_new_component_0(cpuSRAM_Addr),
            .HRW_nOE_from_the_new_component_0(cpuSRAM_nOE),
            .HRW_nWE_from_the_new_component_0(cpuSRAM_nWE)
            );
            
Bootloader u3 (
               .OSC_40(OSC_40), .iuC(iuC), .iouC(iouC), .processor_reset(processor_reset),
               .TransIO(TransIO[7:0]),
               .SRAM_Addr(mSRAM_Addr),
               .SRAM_Data(mSRAM_Data),
               .SRAM_nOE(mSRAM_nOE),
               .SRAM_nWE(mSRAM_nWE)
             );

endmodule


Сбросом процессора Ниос управляет модуль Bootloader там находится этот регистр с начальным состоянием = 1'b0

Пробовал загружать во внешнюю память программу (модуль загрузки, проверил как мог дома, вроде как все загружается правильно, проверял текущий адрес мультиметром smile.gif , ни лог. анализатора, ни осциллографа нет, симулятором так и не успел научится пользоваться времени в обрез sad.gif диплом.., попробую еще помучатся в Университете если дома не получится )

Запустил как есть, такое ощущение что процессор просто гуляет по памяти(беспрерывно считывает, смотрел что за уровень на nOE) и толком ничего не делает, при этом нагревая память (возможно даже логическое КЗ, на ножках данных) и так промучившись уйму времени, так и не получилось запустить его с статической памяти.

В память SRAM загружаю простенькую программу (в адрес начиная с 0, по байтам, последовательно), которая "мигает" портом вывода, скомпилировал ее, преобразовал elf в flash формат (как уже выше писалось), преобразовал flash в бинарный формат своей программой на ПК, которая передает данные для конфигруации ПЛИС, и осуществляет связь с ПЛИС - загружает данные в SRAM. И командой запускал процессор.

Код
#include "altera_avalon_pio_regs.h"
#include "system.h"

int main()
{
    int i;
    while(1)
    {
        IOWR_ALTERA_AVALON_PIO_DATA(PIO_0_BASE,0xff);
        for (i=0;i<20000000;i++);
        IOWR_ALTERA_AVALON_PIO_DATA(PIO_0_BASE,0x00);
        for (i=0;i<20000000;i++);
    }
}


Думал уже может тут где-то ошибся, потом пересобрав процессор на On-chip memory RAM (с инициализацией памяти), установил вектора на нее и загрузив его в ПЛИС убедился что программа работает, подключенный светодиод мигал (командный режим запуска процессора работает, сброс с процессора убирается)

Замтелил еще вот что, при настройке Tri-state bridge:
Нажмите для просмотра прикрепленного файла

Оставлял так и генерировал процессор, потом ставил галочки везде и генерировал процестор, но на выходе получалось одно и тоже:
Код
module mySoC (
               // 1) global signals:
                clk_0,
                new_component_0_s0_data,
                reset_n,

               // the_pio_0
                out_port_from_the_pio_0,

               // the_spi_0
                MISO_to_the_spi_0,
                MOSI_from_the_spi_0,
                SCLK_from_the_spi_0,
                SS_n_from_the_spi_0,

               // the_spi_1
                MISO_to_the_spi_1,
                MOSI_from_the_spi_1,
                SCLK_from_the_spi_1,
                SS_n_from_the_spi_1
             );


Я так понимаю с new_component_0_s0_data должен был появится и *_adress, *_noe, *_nwe или я не прав, sopc builder издевается? (в хендбуках искал, так и ничего не понял)

Смотрел и тут на форуме посты и ссылку которую Вы давали посмотреть по подключению внешней памяти ( http://www.alteraforum.com/forum/showthread.php?t=6255 ), как правильно нужно создавать модуль для внешней памяти?
vadimuzzz
Цитата(ZioN @ May 15 2010, 09:31) *
Я так понимаю с new_component_0_s0_data должен был появится и *_adress, *_noe, *_nwe или я не прав, sopc builder издевается? (в хендбуках искал, так и ничего не понял)

ЕМНИП, тип интерфейса д.б. "Avalon Memory Mapped Tristate Slave", квартуса под рукой нет.
ZioN
Цитата(vadimuzzz @ May 15 2010, 16:58) *
ЕМНИП, тип интерфейса д.б. "Avalon Memory Mapped Tristate Slave", квартуса под рукой нет.


Эм, не совсем понял, для памяти я создаю новый компонент, выбираю из шаблонов "Add Typical Avalon-MM Tristate Slave", правда потом в SoPC Builder`е не могу отредактировать свой компонент (если билдер закрыть и обратно открыть) может стоит поставить другой версии квартус?

Нажмите для просмотра прикрепленного файла
vadimuzzz
Цитата(ZioN @ May 15 2010, 23:10) *
Эм, не совсем понял, для памяти я создаю новый компонент, выбираю из шаблонов "Add Typical Avalon-MM Tristate Slave", правда потом в SoPC Builder`е не могу отредактировать свой компонент (если билдер закрыть и обратно открыть) может стоит поставить другой версии квартус?

может и так, сейчас не вспомню. в любом случае, добавили компонент - потестите его на чтение/запись. простенькая прога в on-chip, которая проверяет корректность операций с внешней памятью. потом уже внешний обвяз добавляйте. где-нибудь байты не так перевернули и, если это был код программы, уже не узнать, что произошло.
ZioN
Заработало!!! 08.gif

Не нужно было делать wire для SRAM_Data, т.к. из него нельзя тогда получить данные, одно направление (запись, без чтения), а просто inout SRAM_Data скормить обеим модулям (процессору и загрузчику), и после загрузки регистр в модуле загрузчика под данные перевести в Z состояние. laughing.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.