Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: MAX10. Прошивка по UART.
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
Alik
Имеется плата с Altera MAX10 на борту.
Написал две прошивки: Одна моргает светодиодами (загрузил в CFM0), а другая связывается по UART с компьютером (загрузил в CFM1). Все работает, прошивка переключается (через внешние ножки CONFIG_SEL и nCONFIG).
Теперь я хочу перепрошить по UART одну из прошивок (а именно CFM0). Для этого в код включил On-Chip Flash IP, выставил Read and Write на всех секторах (UFM0, UFM1, CFM0, CFM1).
Чтение, стирание и запись в UFM0 и UFM1 работает нормально.

По тому же принципу сначала стираю, а затем загружаю в CFM0 (адресное пространство: 0x19000 - 0x2FFFF) .rpd файл, сгенерированный автоматически при сборке .pof файла.
Все успешно пишется (проверил повторным считыванием из памяти и подсчетом CRC кода), но прошивка не запускается (переключиться на эту прошивку пытаюсь внешними ножками CONFIG_SEL и nCONFIG). То есть я "тупо" копирую .rpd файл в адресное пространство CFM0 и перезагружаю MAX10 - но прошивка из CFM0 не пускается.

В чем может быть проблема?
gosu-art
А случаем биты в пределах байта там не нужно перевернуть при записи?
iosifk
Цитата(Alik @ May 16 2017, 17:41) *
Теперь я хочу перепрошить по UART одну из прошивок (а именно CFM0).

И вот что интересно. Обычный микроконтроллер в мелком корпусе будет стоить 0,5 долл или даже дешевле. При этом связь с хостом он никогда не потеряет и всегда будет перепрограммировать ПЛИС. А если постараться то и сканирование выводов можно сделать.
А любое "самоперепрограммирование" будет работать только до первого сбоя и потом навсегда заглохнет. Причем с хоста к железке уже никак не доберетесь.
И вот вопрос: "А на кой Вам такие сложности"?
Golikov A.
Надо считать данные сначала, то есть залить их через бластер, потом считать и сравнить.
Альтера любит биты по порядку местами поменять.

Цитата
А любое "самоперепрограммирование" будет работать только до первого сбоя и потом навсегда заглохнет

С максом 10 есть маленькая проблемка, у него флешка внутренняя, никаким контроллером до нее не долезть так что без самопрограммирования никак.
Для страховки там 2 региона, в один кладем бутлоадер не изменяемый, в другой прошивку рабочую. Бутлоадер можно защитить, в том числе и железными битами защиты. И никакой кирпич не грозит. Также там встроенный механизм поочередной загрузки в случае повреждения.
Jenya7
Цитата(Alik @ May 16 2017, 19:41) *
Имеется плата с Altera MAX10 на борту.
Написал две прошивки: Одна моргает светодиодами (загрузил в CFM0), а другая связывается по UART с компьютером (загрузил в CFM1). Все работает, прошивка переключается (через внешние ножки CONFIG_SEL и nCONFIG).
Теперь я хочу перепрошить по UART одну из прошивок (а именно CFM0). Для этого в код включил On-Chip Flash IP, выставил Read and Write на всех секторах (UFM0, UFM1, CFM0, CFM1).
Чтение, стирание и запись в UFM0 и UFM1 работает нормально.

По тому же принципу сначала стираю, а затем загружаю в CFM0 (адресное пространство: 0x19000 - 0x2FFFF) .rpd файл, сгенерированный автоматически при сборке .pof файла.
Все успешно пишется (проверил повторным считыванием из памяти и подсчетом CRC кода), но прошивка не запускается (переключиться на эту прошивку пытаюсь внешними ножками CONFIG_SEL и nCONFIG). То есть я "тупо" копирую .rpd файл в адресное пространство CFM0 и перезагружаю MAX10 - но прошивка из CFM0 не пускается.

В чем может быть проблема?

У меня та же задача - програмировать rpd файл в MAX10. Не могли бы вы показать как работать с On-Chip Flash IP?
Alik
Цитата
Надо считать данные сначала, то есть залить их через бластер, потом считать и сравнить.
Альтера любит биты по порядку местами поменять.


Через "Examine" прочел прошивку, и действительно, прошивка на CFM0 не совпадает с тем, что я пытаюсь прошить. Буду "копать" дальше.

Цитата
У меня та же задача - програмировать rpd файл в MAX10. Не могли бы вы показать как работать с On-Chip Flash IP?


Я использовал документ UFM. Там все описано: как стирать область памяти, как записывать, как читать. Более подробно пока не могу описать - только вечером.
Golikov A.
еще бы ее хорошо также считать через ваш интерфейс, для сравнения. То есть записать жетагом, и считать через интерфейс и сравнить с файлом
Alik
Все успешно прошилось!!! Оказалось - нужно было выполнить реверс битов. Теперь вручную (через внешние ножки CONFIG_SEL и nCONFIG) могу переключиться на новую прошивку.
Осталось только так же по команде от хоста запустить новую прошивку.

Для "Jenya7":

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

Настройки On-Chip Flash IP:
Нажмите для просмотра прикрепленного файла

CODE


module Test_CFM ( input wire Clock,
input wire Reset,
output reg CSR_Address,
output reg CSR_REn,
output reg [31:0] CSR_WData,
output reg CSR_WEn,
input wire [31:0] CSR_RData,
output reg [17:0] DATA_Address,
output reg DATA_Read,
output reg [31:0] DATA_WData,
output reg DATA_WEn,
output reg [3:0] DATA_BCount,
input wire [31:0] DATA_RData,
input wire DATA_Wait,
input wire DATA_Valid,
output wire Led_1,
output wire Led_2,
output wire Led_3,
output wire Led_4,
output wire Led_5,
input wire [31:0] CFM_Data,
input wire CFM_WEn,
input wire CFM_Erase,
output wire CFM_Ready,
output wire [4:0] CFM_State
);

reg [4:0] State;
reg [17:0] Address;
reg [31:0] Register;

localparam STATE_Idle = 0,
STATE_Erase = 1,
STATE_Erase___Start_WaitIDLEState = 3,
STATE_Erase___Stop_WaitIDLEState = 4,
STATE_Erase___Start_DisableEraseProtection = 5,
STATE_Erase___Stop_DisableEraseProtection = 6,
STATE_Erase___Start_EraseSector = 7,
STATE_Erase___Stop_EraseSector = 8,
STATE_Erase___Start_WaitEraseSector = 9,
STATE_Erase___Stop_WaitEraseSector = 10,
STATE_Erase___Start_EnableEraseProtection = 11,
STATE_Erase___Stop_EnableEraseProtection = 12,
STATE_Write = 13,
STATE_Write___Start_WaitIDLEState = 14,
STATE_Write___Stop_WaitIDLEState = 15,
STATE_Write___Start_DisableEraseProtection = 16,
STATE_Write___Stop_DisableEraseProtection = 17,
STATE_Write___Start_Write = 18,
STATE_Write___Stop_Write = 19,
STATE_Write___Start_EnableEraseProtection = 20,
STATE_Write___Stop_EnableEraseProtection = 21;

always @( posedge Clock )
begin
if ( ~Reset )
begin
State <= STATE_Idle;
end
else
begin
if ( CFM_Erase )
begin
Address <= 18'h18FFF;
State <= STATE_Erase;
end
else
begin
if ( CFM_WEn )
begin
State <= STATE_Write;
Address <= Address + 18'h00001;
Register <= CFM_Data;
end
else
begin
case ( State )
STATE_Erase:
begin
State <= STATE_Erase___Start_WaitIDLEState;
end
STATE_Erase___Start_WaitIDLEState:
begin
CSR_Address <= 0;
CSR_REn <= 1;
State <= STATE_Erase___Stop_WaitIDLEState;
end
STATE_Erase___Stop_WaitIDLEState:
begin
CSR_REn <= 0;
State <= (CSR_RData[0] == 0 && CSR_RData[1] == 0)?(STATE_Erase___Start_DisableEraseProtection):(STATE_Erase___Start_WaitIDLEState)
;
end
STATE_Erase___Start_DisableEraseProtection:
begin
CSR_Address <= 1;
CSR_WEn <= 1;
CSR_WData <= 32'hF7FFFFFF;
State <= STATE_Erase___Stop_DisableEraseProtection;
end
STATE_Erase___Stop_DisableEraseProtection:
begin
CSR_WEn <= 0;
State <= STATE_Erase___Start_EraseSector;
end
STATE_Erase___Start_EraseSector:
begin
CSR_Address <= 1;
CSR_WEn <= 1;
CSR_WData <= 32'hF7DFFFFF;
State <= STATE_Erase___Stop_EraseSector;
end
STATE_Erase___Stop_EraseSector:
begin
CSR_WEn <= 0;
State <= STATE_Erase___Start_WaitEraseSector;
end
STATE_Erase___Start_WaitEraseSector:
begin
CSR_Address <= 0;
CSR_REn <= 1;
State <= STATE_Erase___Stop_WaitEraseSector;
end
STATE_Erase___Stop_WaitEraseSector:
begin
CSR_REn <= 0;
State <= ( CSR_RData[4] == 1 )?(STATE_Erase___Start_EnableEraseProtection):(STATE_Erase___Start_WaitEraseSector
);
end
STATE_Erase___Start_EnableEraseProtection:
begin
CSR_Address <= 1;
CSR_WData <= 32'hFFFFFFFF;
CSR_WEn <= 1;
State <= STATE_Erase___Stop_EnableEraseProtection;
end
STATE_Erase___Stop_EnableEraseProtection:
begin
CSR_WEn <= 0;
State <= STATE_Idle;
end
STATE_Write:
begin
State <= STATE_Write___Start_WaitIDLEState;
end
STATE_Write___Start_WaitIDLEState:
begin
CSR_Address <= 0;
CSR_REn <= 1;
State <= STATE_Write___Stop_WaitIDLEState;
end
STATE_Write___Stop_WaitIDLEState:
begin
CSR_REn <= 0;
State <= (CSR_RData[0] == 0 && CSR_RData[1] == 0)?(STATE_Write___Start_DisableEraseProtection):(STATE_Write___Start_WaitIDLEState)
;
end
STATE_Write___Start_DisableEraseProtection:
begin
CSR_Address <= 1;
CSR_WEn <= 1;
CSR_WData <= 32'hF7FFFFFF;
State <= STATE_Write___Stop_DisableEraseProtection;
end
STATE_Write___Stop_DisableEraseProtection:
begin
CSR_WEn <= 0;
State <= STATE_Write___Start_Write;
end
STATE_Write___Start_Write:
begin
if ( ~DATA_Wait )
begin
DATA_WEn <= 1;
DATA_Address <= Address;
DATA_BCount <= 1;
DATA_WData <= Register;
State <= STATE_Write___Stop_Write;
end
end
STATE_Write___Stop_Write:
begin
if ( ~DATA_Wait )
begin
DATA_WEn <= 0;
State <= STATE_Write___Start_EnableEraseProtection;
end
end
STATE_Write___Start_EnableEraseProtection:
begin
CSR_Address <= 1;
CSR_WData <= 32'hFFFFFFFF;
CSR_WEn <= 1;
State <= STATE_Write___Stop_EnableEraseProtection;
end
STATE_Write___Stop_EnableEraseProtection:
begin
CSR_WEn <= 0;
State <= STATE_Idle;
end
endcase
end
end
end
end

assign CFM_Ready = ( State == STATE_Idle );
assign CFM_State = State;

assign Led_1 = Address[0];
assign Led_2 = Address[1];
assign Led_3 = Address[2];
assign Led_4 = Address[3];
assign Led_5 = Address[4];
endmodule

Jenya7
Цитата(Alik @ May 17 2017, 21:37) *
Для "Jenya7":


Спасибо большое.

Кстати я нашел сайт, там парень хорошо объясняет.
https://embeddedfpgadesign.wordpress.com/20...-max10_flash-v/
Для того кто знает верилог вообще праздник какой то ))
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.