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