реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> NIOSII нестандартная загрузка
ZioN
сообщение May 4 2010, 18:36
Сообщение #1





Группа: Участник
Сообщений: 8
Регистрация: 2-05-10
Пользователь №: 57 019



Добрый день! Сразу скажу что системы на кристалле не строил, по этому вопросы могут быть глупыми, не судите строго 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 (то пробегали тут страшилки на форуме про лицензию)

Ну и на всякий случай общая картина:

Прикрепленное изображение
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение May 4 2010, 22:46
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988



1. читать www.altera.com/literature/ug/ug_nios2_flash_programmer.pdf , особенно раздел про elf2flash.
Цитата
Reset Vector и Exception Vector установлены на начало SRAM
сброс на начало, вектор исключений смещен относительно сброса, цифры оставить дефолтные.
2. нужна правильная лицензия, иначе ядро будет time-limited
Go to the top of the page
 
+Quote Post
ZioN
сообщение May 5 2010, 08:59
Сообщение #3





Группа: Участник
Сообщений: 8
Регистрация: 2-05-10
Пользователь №: 57 019



Цитата(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

Сообщение отредактировал ZioN - May 5 2010, 09:00
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение May 5 2010, 10:53
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988



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

наличие отсутствия правильной лицензии можно определить по словам "Opencores" в логах компиляции квартуса. то, что он не ругается при запуске еще ни о чем не говорит. если есть сомнения на этот счет, давайте мыло
Go to the top of the page
 
+Quote Post
ZioN
сообщение May 5 2010, 12:57
Сообщение #5





Группа: Участник
Сообщений: 8
Регистрация: 2-05-10
Пользователь №: 57 019



Цитата(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

Оба лога:
Прикрепленный файл  mySoC_log.txt ( 3.38 килобайт ) Кол-во скачиваний: 219
Прикрепленный файл  quartus_log.txt ( 40.07 килобайт ) Кол-во скачиваний: 671


Сообщение отредактировал ZioN - May 5 2010, 12:58
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение May 5 2010, 13:55
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988



Цитата
Можно вздохнуть спокойно?

да, только HDL-исходников не увидите
Go to the top of the page
 
+Quote Post
ZioN
сообщение May 14 2010, 15:18
Сообщение #7





Группа: Участник
Сообщений: 8
Регистрация: 2-05-10
Пользователь №: 57 019



Добрый день, появились еще вопросы.

"Модуль" для загрузки программы 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 и для чего она здесь (как с ней работать)?
Да и правильно я вообще делаю, либо опять не так понял суть?
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение May 14 2010, 23:00
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988



Цитата(ZioN @ May 14 2010, 22:18) *
Да и правильно я вообще делаю, либо опять не так понял суть?

в исходном посте вы писали, что модуль будет зашивать память во время, когда процессор сброшен, а тут он у вас уже в SOPC`е объявился. у меня есть большие сомнения, что шина Avalon будет работать во время сброса. как я понимаю, модуль должен быть внешним по отношению к SOPC + мультиплексор.
Go to the top of the page
 
+Quote Post
ZioN
сообщение May 15 2010, 02:31
Сообщение #9





Группа: Участник
Сообщений: 8
Регистрация: 2-05-10
Пользователь №: 57 019



Цитата(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 ), как правильно нужно создавать модуль для внешней памяти?

Сообщение отредактировал ZioN - May 15 2010, 02:50
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение May 15 2010, 13:58
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988



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

ЕМНИП, тип интерфейса д.б. "Avalon Memory Mapped Tristate Slave", квартуса под рукой нет.
Go to the top of the page
 
+Quote Post
ZioN
сообщение May 15 2010, 16:10
Сообщение #11





Группа: Участник
Сообщений: 8
Регистрация: 2-05-10
Пользователь №: 57 019



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


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


Прикрепленное изображение


Сообщение отредактировал ZioN - May 15 2010, 16:44
Go to the top of the page
 
+Quote Post
vadimuzzz
сообщение May 16 2010, 01:48
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 291
Регистрация: 21-07-05
Пользователь №: 6 988



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

может и так, сейчас не вспомню. в любом случае, добавили компонент - потестите его на чтение/запись. простенькая прога в on-chip, которая проверяет корректность операций с внешней памятью. потом уже внешний обвяз добавляйте. где-нибудь байты не так перевернули и, если это был код программы, уже не узнать, что произошло.
Go to the top of the page
 
+Quote Post
ZioN
сообщение May 16 2010, 05:42
Сообщение #13





Группа: Участник
Сообщений: 8
Регистрация: 2-05-10
Пользователь №: 57 019



Заработало!!! 08.gif

Не нужно было делать wire для SRAM_Data, т.к. из него нельзя тогда получить данные, одно направление (запись, без чтения), а просто inout SRAM_Data скормить обеим модулям (процессору и загрузчику), и после загрузки регистр в модуле загрузчика под данные перевести в Z состояние. laughing.gif

Сообщение отредактировал ZioN - May 16 2010, 05:43
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 04:13
Рейтинг@Mail.ru


Страница сгенерированна за 0.01464 секунд с 7
ELECTRONIX ©2004-2016