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

 
 
> MAX10. Прошивка по UART.
Alik
сообщение May 16 2017, 14:41
Сообщение #1





Группа: Новичок
Сообщений: 3
Регистрация: 16-05-17
Пользователь №: 97 106



Имеется плата с 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 не пускается.

В чем может быть проблема?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Alik
сообщение May 17 2017, 16:37
Сообщение #2





Группа: Новичок
Сообщений: 3
Регистрация: 16-05-17
Пользователь №: 97 106



Все успешно прошилось!!! Оказалось - нужно было выполнить реверс битов. Теперь вручную (через внешние ножки 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

Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 31st July 2025 - 12:09
Рейтинг@Mail.ru


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