Сложные системы не без граблей
Продолжаю осваивать Quartus.
Для работы с внутренней флешкой MAX10 напрямую, решил собрать SoC с процессором Nios2.
Собирая Hello World с Nios2 вылазили, по-мелочи, всякие странные ошибки типа таких:

Хотя я и не просил:

Заглядываем в мастер систем:

Глобальные настройки тоже все в порядке, везде галочки выключены.
Смотрим в отчет:

Сохраняем проект. В дизайнере платформы ставим снимаем галочки на преинициализации памяти, сохраняем и перегенерируем скрипты. Закрываем квартус. Открываем собираем проект - вуаля всё в порядке :)
Но дальше следующие грабли. Мастер генерирования HAL на базе Eclipse падает где угодно при показе File open dialog. Пришлось запускаться снова на Windows.
Генерируем файл описания платформы и проверяем что адреса областей памяти в Linker script верные и совпдают с теми что были в Platform Designer:

Все что нужно попадает в dram, а не flash.
Собираем Hello world и смотрим на него через nios2-terminal.exe (который цепляется сам к JTAG UART)

Запускаем на Nios2 такой код:
Всё работает, ура!!!

Для работы с внутренней флешкой MAX10 напрямую, решил собрать SoC с процессором Nios2.
Собирая Hello World с Nios2 вылазили, по-мелочи, всякие странные ошибки типа таких:

Хотя я и не просил:

Заглядываем в мастер систем:

Глобальные настройки тоже все в порядке, везде галочки выключены.
Смотрим в отчет:

Сохраняем проект. В дизайнере платформы ставим снимаем галочки на преинициализации памяти, сохраняем и перегенерируем скрипты. Закрываем квартус. Открываем собираем проект - вуаля всё в порядке :)
Но дальше следующие грабли. Мастер генерирования HAL на базе Eclipse падает где угодно при показе File open dialog. Пришлось запускаться снова на Windows.
Генерируем файл описания платформы и проверяем что адреса областей памяти в Linker script верные и совпдают с теми что были в Platform Designer:

Все что нужно попадает в dram, а не flash.
Собираем Hello world и смотрим на него через nios2-terminal.exe (который цепляется сам к JTAG UART)

Запускаем на Nios2 такой код:
#include <stdio.h>
#include <stdint.h>
#define _MMIO_DWORD(mem_addr) (*(volatile uint32_t *)(mem_addr))
#define BIT0 0x1
#define BIT1 (0x1 << 1)
#define BIT2 (0x1 << 2)
#define BIT3 (0x1 << 3)
#define BIT4 (0x1 << 4)
#define BIT5 (0x1 << 5)
#define BIT6 (0x1 << 6)
#define BIT7 (0x1 << 7)
#define BIT8 (0x1 << 8)
#define BIT9 (0x1 << 9)
#define BIT23 (0x1 << 23)
#define F_CSR _MMIO_DWORD(0x89000)
#define F_CCR _MMIO_DWORD(0x89004)
#define F_SECTOR1(addr) _MMIO_DWORD(0x0+addr)
void print_status() {
uint32_t t = F_CSR;
printf("Flash is ");
switch(t & 0x3) {
case 0: printf("IDLE "); break;
case 1: printf("BUSY_ERASE "); break;
case 2: printf("BUSY_WRITE "); break;
case 3: printf("BUSY_READ "); break;
}
printf("\nWrite protect status:\n");
printf(" Sector ID 1 is ");
if (t & BIT5) printf("protected"); else printf("open");
printf("\n Sector ID 2 is ");
if (t & BIT6) printf("protected"); else printf("open");
printf("\n Sector ID 3 is ");
if (t & BIT7) printf("protected"); else printf("open");
printf("\n Sector ID 4 is ");
if (t & BIT8) printf("protected"); else printf("open");
printf("\n Sector ID 5 is ");
if (t & BIT9) printf("protected"); else printf("open");
printf("\nLast operation status (if any, default - failed)\n");
printf("Read is ");
if (t & BIT2) printf("successful"); else printf("failed");
printf("\nWrite is ");
if (t & BIT3) printf("successful"); else printf("failed");
printf("\nErase is ");
if (t & BIT4) printf("successful"); else printf("failed");
printf("\n");
}
void print_control() {
uint32_t t = F_CCR;
printf("Sector ID 1 is ");
if (t & BIT23) printf("write protected\n"); else printf("open\n");
}
int main()
{
print_status();
F_CCR = 0xffffffff;
print_control();
F_CCR = 0xffffffff ^ BIT23;
print_control();
printf("Data from address 0x0 is %08X\n", F_SECTOR1(0));
printf("Writing data to address 0x0...\n");
F_SECTOR1(0) = 0xcafebabe;
printf("Waiting for IDLE...\n");
while(F_CSR & 0x3);
print_status();
printf("Data from address 0x0 is %08X\n", F_SECTOR1(0));
}
Всё работает, ура!!!

no subject
http://www.vak.ru/doku.php/proj/mips/mp32-howto
А можно тепер вычленить оттуда Verilog-исходник блока UFM и приспособить его для мэсм6?
no subject
С первой попытки не получилось, вылезла ошибка совершенно не информативная. Типа "измените настройки и попробуйте еще раз", а какие именно ни слова. И в подробном текстовом репорте тоже самое.
Но я попробую еще раз, конечно, путем перебора параметров сделать эскпорт флэш-модуля из qsys. C памятью то все красиво было так как там только ссылка была на модуль памяти. А тут помимо верилог модуля ссылка на зашифрованный IP-block и там не понятно что внутри.
Как вариант еще можно ядро МЭСМ адаптировать на шину avalon и добавить в сборку через Platform Designer (QSYS). Я думаю так тоже должно сработать, только сборка будет через IDE.
no subject
Вообще-то в открытом проекте нам не пристало использовать проприетарные IP-блоки. Может ну его нафиг, взять типовую реализацию Flash-памяти на внешнем чипе типа QSPI. К примеру: https://opencores.org/projects/qspiflash
no subject
The UFM architecture of MAX 10 devices is a combination of soft and hard IPs. You can only access the
UFM using the Altera On-Chip Flash IP core in the Quartus II software.
Если делать что-то внешнее, то мне (в теории) нравится продукция Cypress HyperRAM (HyperFLASH), и есть комбинированные продукты - память с флешкой. Даже есть память типа MRAM и FRAM для аутентичности с феритовыми кольцами.
Но вот про лицензии я не знаю. Можем ли мы если используем MIT использовать альтеровские зашифрованные компоненты.
no subject
no subject
Через IDE и через Makefile проект собрался!!! Скажем так задача "вычленить" получилась.
Но там требуется написать бридж в шину Avalon. Я набросок сделал, но пока не тестировал.
Попробую завтра. Начну с JTAG UART.