Programmable Devices
CPLDs, FPGAs, SoC FPGAs, Configuration, and Transceivers
20777 Discussions

ALTREMOTE_UPDATE doesn't work with user logic

Altera_Forum
Honored Contributor II
1,024 Views

Hi All, 

 

Cyclone III issue. 

I've looked all over for an answer on this. I've written a boot Loader in VHDL which accepts a .rbf file via RS232 with an appended 32-bit CRC to verify a good transfer. I use a 16mBit Serial Flash where I load the file into the upper half and verify the CRC before erasing the application page (in the lower half) and then copying the new application configuration down to the application boot page sector. I access the Flash with a custom Flash driver (also VHDL) by setting the configuration pins to User I/O after configuration (i.e. not using the ASMI mega function). All works well except for the ALTREMOTE_UPDATE mega function. I can set PARAM to "100" and Data_in and start a write which then triggers the busy but when I do a Read the load page is always still Zero. I also never get a valid status read for the reconfiguration cause. I've verified that all else works by just writting the application at address "zero" (factory) and stobing the reconfig pin in the ALTREMOTE_UPDATE function. It comes up and runs regardless of the address I've set prior to re-boot. 

 

Altera's data sheets are pretty much useless. They spend too much effort with examples using NIOS that they forgot to write how anything actual works (i.e. timing, bit defintions, etc.). There is almost no information on how to access the Remote update pins directly with out the mega function. 

 

Any ideas why ALTREMOTE_UPDATE won't work under a simple VHDL state machine. see simple write/read code snip below. 

 

Thanks, 

Steve 

 

when SETUP_APPLICATION_ADDRESS => 

if (UPDATE_BUSY = '1') then 

UPDATE_HANDLER_SM <= WAIT_APPLICATION_ADDRESS; 

else 

UPDATE_HANDLER_SM <= SETUP_APPLICATION_ADDRESS; 

end if; 

PARAM <= "100"; 

DATA_IN_UPDATE <= "00" & X"20000"; 

READ_PARAM <= '0'; 

WRITE_PARAM <= '1'; 

 

when WAIT_APPLICATION_ADDRESS => 

if (UPDATE_BUSY = '0') then 

UPDATE_HANDLER_SM <= SETUP_CHECK_APPLICATION_ADDRESS; 

else 

UPDATE_HANDLER_SM <= WAIT_APPLICATION_ADDRESS; 

end if; 

READ_PARAM <= '0'; 

WRITE_PARAM <= '0'; 

 

when SETUP_CHECK_APPLICATION_ADDRESS => 

if (UPDATE_BUSY = '1') then 

UPDATE_HANDLER_SM <= WAIT_CHECK_APPLICATION_ADDRESS; 

else 

UPDATE_HANDLER_SM <= SETUP_CHECK_APPLICATION_ADDRESS; 

end if; 

READ_PARAM <= '1'; 

WRITE_PARAM <= '0'; 

 

when WAIT_CHECK_APPLICATION_ADDRESS => 

if (UPDATE_BUSY = '0') then 

UPDATE_HANDLER_SM <= LOAD_ADDRESS_DATA; 

PARAM <= "111"; 

else 

UPDATE_HANDLER_SM <= WAIT_CHECK_APPLICATION_ADDRESS; 

end if; 

READ_PARAM <= '0'; 

WRITE_PARAM <= '0';
0 Kudos
2 Replies
Altera_Forum
Honored Contributor II
351 Views

I am having the EXACT same problem. Please let me know if you figure it out.

0 Kudos
Altera_Forum
Honored Contributor II
351 Views

I wrote a state loop that sends the read params from all 4 "param" locations out the RS232 in ascii and figured it out by association.  

Note: Nothing lines up with the data sheet. 

Once you see where stuff is then write the code accordingly. 

It does work well once you get around Altera's misleading data sheets.
0 Kudos
Reply