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

|
Добрый день! Сразу скажу что системы на кристалле не строил, по этому вопросы могут быть глупыми, не судите строго  Есть плата собственного изготовления, на которой находится микроконтроллер с аппаратным 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 скаченный с торрентов, полноценно ли ядро Ниоса построенное в этом квартусе?  (то пробегали тут страшилки на форуме про лицензию) Ну и на всякий случай общая картина:
|
|
|
|
|
May 5 2010, 08:59
|
Группа: Участник
Сообщений: 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
2 vadimuzzz: Спасибо что не поленились ответить на простые вопросы!
Сообщение отредактировал ZioN - May 5 2010, 09:00
|
|
|
|
|
May 5 2010, 12:57
|
Группа: Участник
Сообщений: 8
Регистрация: 2-05-10
Пользователь №: 57 019

|
Цитата(vadimuzzz @ May 5 2010, 13:53)  да, примерно так. сам формат называется Motorola S-record, описание например тутТеперь более чем понятно  Спасибо. Цитата(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 Можно вздохнуть спокойно?  Оба лога:
mySoC_log.txt ( 3.38 килобайт )
Кол-во скачиваний: 219
quartus_log.txt ( 40.07 килобайт )
Кол-во скачиваний: 671
Сообщение отредактировал ZioN - May 5 2010, 12:58
|
|
|
|
|
May 14 2010, 15:18
|
Группа: Участник
Сообщений: 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 и для чего она здесь (как с ней работать)? Да и правильно я вообще делаю, либо опять не так понял суть?
|
|
|
|
|
May 15 2010, 02:31
|
Группа: Участник
Сообщений: 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 Пробовал загружать во внешнюю память программу (модуль загрузки, проверил как мог дома, вроде как все загружается правильно, проверял текущий адрес мультиметром  , ни лог. анализатора, ни осциллографа нет, симулятором так и не успел научится пользоваться времени в обрез  диплом.., попробую еще помучатся в Университете если дома не получится ) Запустил как есть, такое ощущение что процессор просто гуляет по памяти(беспрерывно считывает, смотрел что за уровень на 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
|
|
|
|
|
May 15 2010, 16:10
|
Группа: Участник
Сообщений: 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
|
|
|
|
|
May 16 2010, 01:48
|

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

|
Цитата(ZioN @ May 15 2010, 23:10)  Эм, не совсем понял, для памяти я создаю новый компонент, выбираю из шаблонов "Add Typical Avalon-MM Tristate Slave", правда потом в SoPC Builder`е не могу отредактировать свой компонент (если билдер закрыть и обратно открыть) может стоит поставить другой версии квартус? может и так, сейчас не вспомню. в любом случае, добавили компонент - потестите его на чтение/запись. простенькая прога в on-chip, которая проверяет корректность операций с внешней памятью. потом уже внешний обвяз добавляйте. где-нибудь байты не так перевернули и, если это был код программы, уже не узнать, что произошло.
|
|
|
|
|
May 16 2010, 05:42
|
Группа: Участник
Сообщений: 8
Регистрация: 2-05-10
Пользователь №: 57 019

|
Заработало!!! Не нужно было делать wire для SRAM_Data, т.к. из него нельзя тогда получить данные, одно направление (запись, без чтения), а просто inout SRAM_Data скормить обеим модулям (процессору и загрузчику), и после загрузки регистр в модуле загрузчика под данные перевести в Z состояние.
Сообщение отредактировал ZioN - May 16 2010, 05:43
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|