Перейти к содержанию

    

MAX10 - Flash Update module

Я создал Flash Update module - Tools->IP Catalog->Library->Basic Functions->On Chip Memory->Altera On-Chip Flash

entity flash_update is
port (
	clock                   : in  std_logic                     := '0';             --    clk.clk
	avmm_csr_addr           : in  std_logic                     := '0';             --    csr.address
	avmm_csr_read           : in  std_logic                     := '0';             --       .read
	avmm_csr_writedata      : in  std_logic_vector(31 downto 0) := (others => '0'); --       .writedata
	avmm_csr_write          : in  std_logic                     := '0';             --       .write
	avmm_csr_readdata       : out std_logic_vector(31 downto 0);                    --       .readdata
	avmm_data_addr          : in  std_logic_vector(18 downto 0) := (others => '0'); --   data.address
	avmm_data_read          : in  std_logic                     := '0';             --       .read
	avmm_data_writedata     : in  std_logic_vector(31 downto 0) := (others => '0'); --       .writedata
	avmm_data_write         : in  std_logic                     := '0';             --       .write
	avmm_data_readdata      : out std_logic_vector(31 downto 0);                    --       .readdata
	avmm_data_waitrequest   : out std_logic;                                        --       .waitrequest
	avmm_data_readdatavalid : out std_logic;                                        --       .readdatavalid
	avmm_data_burstcount    : in  std_logic_vector(3 downto 0)  := (others => '0'); --       .burstcount
	reset_n                 : in  std_logic                     := '0'              -- nreset.reset_n
);
end entity flash_update;

architecture rtl of flash_update is
component altera_onchip_flash is
	generic (
		INIT_FILENAME                       : string  := "";
		INIT_FILENAME_SIM                   : string  := "";
		DEVICE_FAMILY                       : string  := "Unknown";
		PART_NAME                           : string  := "Unknown";
		DEVICE_ID                           : string  := "Unknown";
		SECTOR1_START_ADDR                  : integer := 0;
		SECTOR1_END_ADDR                    : integer := 0;
		SECTOR2_START_ADDR                  : integer := 0;
		SECTOR2_END_ADDR                    : integer := 0;
		SECTOR3_START_ADDR                  : integer := 0;
		SECTOR3_END_ADDR                    : integer := 0;
		SECTOR4_START_ADDR                  : integer := 0;
		SECTOR4_END_ADDR                    : integer := 0;
		SECTOR5_START_ADDR                  : integer := 0;
		SECTOR5_END_ADDR                    : integer := 0;
		MIN_VALID_ADDR                      : integer := 0;
		MAX_VALID_ADDR                      : integer := 0;
		MIN_UFM_VALID_ADDR                  : integer := 0;
		MAX_UFM_VALID_ADDR                  : integer := 0;
		SECTOR1_MAP                         : integer := 0;
		SECTOR2_MAP                         : integer := 0;
		SECTOR3_MAP                         : integer := 0;
		SECTOR4_MAP                         : integer := 0;
		SECTOR5_MAP                         : integer := 0;
		ADDR_RANGE1_END_ADDR                : integer := 0;
		ADDR_RANGE1_OFFSET                  : integer := 0;
		ADDR_RANGE2_OFFSET                  : integer := 0;
		AVMM_DATA_ADDR_WIDTH                : integer := 19;
		AVMM_DATA_DATA_WIDTH                : integer := 32;
		AVMM_DATA_BURSTCOUNT_WIDTH          : integer := 4;
		SECTOR_READ_PROTECTION_MODE         : integer := 31;
		FLASH_SEQ_READ_DATA_COUNT           : integer := 2;
		FLASH_ADDR_ALIGNMENT_BITS           : integer := 1;
		FLASH_READ_CYCLE_MAX_INDEX          : integer := 4;
		FLASH_RESET_CYCLE_MAX_INDEX         : integer := 29;
		FLASH_BUSY_TIMEOUT_CYCLE_MAX_INDEX  : integer := 112;
		FLASH_ERASE_TIMEOUT_CYCLE_MAX_INDEX : integer := 40603248;
		FLASH_WRITE_TIMEOUT_CYCLE_MAX_INDEX : integer := 35382;
		PARALLEL_MODE                       : boolean := true;
		READ_AND_WRITE_MODE                 : boolean := true;
		WRAPPING_BURST_MODE                 : boolean := false;
		IS_DUAL_BOOT                        : string  := "False";
		IS_ERAM_SKIP                        : string  := "False";
		IS_COMPRESSED_IMAGE                 : string  := "False"
	);
	port (
		clock                   : in  std_logic                     := 'X';             -- clk
		reset_n                 : in  std_logic                     := 'X';             -- reset_n
		avmm_data_addr          : in  std_logic_vector(18 downto 0) := (others => 'X'); -- address
		avmm_data_read          : in  std_logic                     := 'X';             -- read
		avmm_data_writedata     : in  std_logic_vector(31 downto 0) := (others => 'X'); -- writedata
		avmm_data_write         : in  std_logic                     := 'X';             -- write
		avmm_data_readdata      : out std_logic_vector(31 downto 0);                    -- readdata
		avmm_data_waitrequest   : out std_logic;                                        -- waitrequest
		avmm_data_readdatavalid : out std_logic;                                        -- readdatavalid
		avmm_data_burstcount    : in  std_logic_vector(3 downto 0)  := (others => 'X'); -- burstcount
		avmm_csr_addr           : in  std_logic                     := 'X';             -- address
		avmm_csr_read           : in  std_logic                     := 'X';             -- read
		avmm_csr_writedata      : in  std_logic_vector(31 downto 0) := (others => 'X'); -- writedata
		avmm_csr_write          : in  std_logic                     := 'X';             -- write
		avmm_csr_readdata       : out std_logic_vector(31 downto 0)                     -- readdata
	);
end component altera_onchip_flash;

begin

onchip_flash_0 : component altera_onchip_flash
	generic map (
		INIT_FILENAME                       => "",
		INIT_FILENAME_SIM                   => "",
		DEVICE_FAMILY                       => "MAX 10",
		PART_NAME                           => "10M50DAF484C7G",
		DEVICE_ID                           => "50",
		SECTOR1_START_ADDR                  => 0,
		SECTOR1_END_ADDR                    => 8191,
		SECTOR2_START_ADDR                  => 8192,
		SECTOR2_END_ADDR                    => 16383,
		SECTOR3_START_ADDR                  => 16384,
		SECTOR3_END_ADDR                    => 114687,
		SECTOR4_START_ADDR                  => 114688,
		SECTOR4_END_ADDR                    => 188415,
		SECTOR5_START_ADDR                  => 188416,
		SECTOR5_END_ADDR                    => 360447,
		MIN_VALID_ADDR                      => 0,
		MAX_VALID_ADDR                      => 360447,
		MIN_UFM_VALID_ADDR                  => 0,
		MAX_UFM_VALID_ADDR                  => 16383,
		SECTOR1_MAP                         => 1,
		SECTOR2_MAP                         => 2,
		SECTOR3_MAP                         => 3,
		SECTOR4_MAP                         => 4,
		SECTOR5_MAP                         => 5,
		ADDR_RANGE1_END_ADDR                => 360447,
		ADDR_RANGE1_OFFSET                  => 2048,
		ADDR_RANGE2_OFFSET                  => 0,
		AVMM_DATA_ADDR_WIDTH                => 19,
		AVMM_DATA_DATA_WIDTH                => 32,
		AVMM_DATA_BURSTCOUNT_WIDTH          => 4,
		SECTOR_READ_PROTECTION_MODE         => 0,
		FLASH_SEQ_READ_DATA_COUNT           => 4,
		FLASH_ADDR_ALIGNMENT_BITS           => 2,
		FLASH_READ_CYCLE_MAX_INDEX          => 5,
		FLASH_RESET_CYCLE_MAX_INDEX         => 7,
		FLASH_BUSY_TIMEOUT_CYCLE_MAX_INDEX  => 36,
		FLASH_ERASE_TIMEOUT_CYCLE_MAX_INDEX => 10500000,
		FLASH_WRITE_TIMEOUT_CYCLE_MAX_INDEX => 9150,
		PARALLEL_MODE                       => true,
		READ_AND_WRITE_MODE                 => true,
		WRAPPING_BURST_MODE                 => false,
		IS_DUAL_BOOT                        => "False",
		IS_ERAM_SKIP                        => "True",
		IS_COMPRESSED_IMAGE                 => "True"
	)
	port map (
		clock                   => clock,                   --    clk.clk
		reset_n                 => reset_n,                 -- nreset.reset_n
		avmm_data_addr          => avmm_data_addr,          --   data.address
		avmm_data_read          => avmm_data_read,          --       .read
		avmm_data_writedata     => avmm_data_writedata,     --       .writedata
		avmm_data_write         => avmm_data_write,         --       .write
		avmm_data_readdata      => avmm_data_readdata,      --       .readdata
		avmm_data_waitrequest   => avmm_data_waitrequest,   --       .waitrequest
		avmm_data_readdatavalid => avmm_data_readdatavalid, --       .readdatavalid
		avmm_data_burstcount    => avmm_data_burstcount,    --       .burstcount
		avmm_csr_addr           => avmm_csr_addr,           --    csr.address
		avmm_csr_read           => avmm_csr_read,           --       .read
		avmm_csr_writedata      => avmm_csr_writedata,      --       .writedata
		avmm_csr_write          => avmm_csr_write,          --       .write
		avmm_csr_readdata       => avmm_csr_readdata        --       .readdata
	);
end architecture rtl; -- of flash_update

Мне нужно два имиджа - бутлодер (CFM0) а с него я буду прожигать основную програму(CFM1-CFM2). Поэтому мне нужен Dual Compressed Images.

Выставляю Assignments -> Device -> Devise and Pin Options -> Configuration -> Dual Compressed Images

В генериках выставляю

IS_DUAL_BOOT        => "True",
IS_ERAM_SKIP        => "True",
IS_COMPRESSED_IMAGE => "True"

При компиляции получаю ошибку.

Error (169130): Configuration mode specified as Remote but remote update block is not found in design

Если выставляю Assignments -> Device -> Devise and Pin Options -> Configuration -> Single Compressed Image

И генерики

IS_DUAL_BOOT        => "False",
IS_ERAM_SKIP        => "True",
IS_COMPRESSED_IMAGE => "True"

Компилируется без ошибок.

 

Если выставляю Assignments -> Device -> Devise and Pin Options -> Configuration -> Single Compressed Image

И генерики

IS_DUAL_BOOT        => "True",
IS_ERAM_SKIP        => "True",
IS_COMPRESSED_IMAGE => "True"

При компиляции получаю ошибку.

Error (14740): Configuration mode on atom "bootloader:U_BOOTLOADER|flash_update:U_FLASH_UPDATE|altera_onchip_flash:onc

hip_flash_0|altera_onchip_flash_block:altera_onchip_flash_block|ufm_block" does not match the project setting. Update and regenerate the Qsys system to match the project setting.

Как бороться с этой бедой?

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Configuration mode specified as Remote but remote update block is not found in design

Надо сделать так, чтобы он бы found. Вставить то есть. Ибо без него вы не сможете сделать даже программную перезагрузку, и тем более не сможете сказать чипу, что он должен загрузиться из второй партиции.

 

Блок этот правда называется не Remote Update, а Dual Configuration или Dual Boot, в этом подстава.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Надо сделать так, чтобы он бы found. Вставить то есть. Ибо без него вы не сможете сделать даже программную перезагрузку, и тем более не сможете сказать чипу, что он должен загрузиться из второй партиции.

 

Блок этот правда называется не Remote Update, а Dual Configuration или Dual Boot, в этом подстава.

спасибо. вставил.

entity altera_dual_config is
port (
	avmm_rcv_address   : in  std_logic_vector(2 downto 0)  := (others => '0'); -- avalon.address
	avmm_rcv_read      : in  std_logic                     := '0';             --       .read
	avmm_rcv_writedata : in  std_logic_vector(31 downto 0) := (others => '0'); --       .writedata
	avmm_rcv_write     : in  std_logic                     := '0';             --       .write
	avmm_rcv_readdata  : out std_logic_vector(31 downto 0);                    --       .readdata
	clk                : in  std_logic                     := '0';             --    clk.clk
	nreset             : in  std_logic                     := '0'              -- nreset.reset_n
);
end entity altera_dual_config;

architecture rtl of altera_dual_config is
component altera_dual_boot is
	generic (
		INTENDED_DEVICE_FAMILY : string  := "";
		CONFIG_CYCLE           : integer := 28;
		RESET_TIMER_CYCLE      : integer := 40
	);
	port (
		clk                : in  std_logic                     := 'X';             -- clk
		nreset             : in  std_logic                     := 'X';             -- reset_n
		avmm_rcv_address   : in  std_logic_vector(2 downto 0)  := (others => 'X'); -- address
		avmm_rcv_read      : in  std_logic                     := 'X';             -- read
		avmm_rcv_writedata : in  std_logic_vector(31 downto 0) := (others => 'X'); -- writedata
		avmm_rcv_write     : in  std_logic                     := 'X';             -- write
		avmm_rcv_readdata  : out std_logic_vector(31 downto 0)                     -- readdata
	);
end component altera_dual_boot;

begin

dual_boot_0 : component altera_dual_boot
	generic map (
		INTENDED_DEVICE_FAMILY => "MAX 10",
		CONFIG_CYCLE           => 11,
		RESET_TIMER_CYCLE      => 16
	)
	port map (
		clk                => clk,                --    clk.clk
		nreset             => nreset,             -- nreset.reset_n
		avmm_rcv_address   => avmm_rcv_address,   -- avalon.address
		avmm_rcv_read      => avmm_rcv_read,      --       .read
		avmm_rcv_writedata => avmm_rcv_writedata, --       .writedata
		avmm_rcv_write     => avmm_rcv_write,     --       .write
		avmm_rcv_readdata  => avmm_rcv_readdata   --       .readdata
	);

end architecture rtl; -- of altera_dual_config

 

теперь проект компилируется. но непонятно как Dual Configuration мапить.

 

component altera_dual_config is 
port (
        avmm_rcv_address   : in  std_logic_vector(2 downto 0)  := (others => '0'); -- avalon.address
        avmm_rcv_read      : in  std_logic                     := '0';             --       .read
        avmm_rcv_writedata : in  std_logic_vector(31 downto 0) := (others => '0'); --       .writedata
        avmm_rcv_write     : in  std_logic                     := '0';             --       .write
        avmm_rcv_readdata  : out std_logic_vector(31 downto 0);                    --       .readdata
        clk                : in  std_logic                     := '0';             --    clk.clk
        nreset             : in  std_logic                     := '0'              -- nreset.reset_n
    );
end component;

например что за адрес avmm_rcv_address и зачем все эти avmm_rcv_writedata, avmm_rcv_readdata - они есть в flash_update модуле.

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А теперь почитайте документацию на все используемые блоки.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
А теперь почитайте документацию на все используемые блоки.

 

да читал, как же без этого. Altera On-Chip Flash расписан хорошо, все понятно, а на Dual Configuration нигде внятного описания не нашел.

 

вот описание модуля. на странице 19 рисунок модуля и это самая емкая информация в документе.

ug_m10_config.pdf

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Когда я генерировал модуль Altera On-Chip Flash в Qsys получил 5 секторов с адресами (на картинке)

А в сгенерированном коде адреса совсем другие

SECTOR1_START_ADDR                  => 0,
SECTOR1_END_ADDR                    => 8191,
SECTOR2_START_ADDR                  => 8192,
SECTOR2_END_ADDR                    => 16383,
SECTOR3_START_ADDR                  => 16384,
SECTOR3_END_ADDR                    => 114687,
SECTOR4_START_ADDR                  => 114688,
SECTOR4_END_ADDR                    => 188415,
SECTOR5_START_ADDR                  => 188416,
SECTOR5_END_ADDR                    => 360447,

Кому верить?

post-71075-1524981806_thumb.png

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Такой вопрос.

Судя по картинке - ID5 - это CFM0. То есть чтоб прожечь CFM1 - надо начать с ID3 (16384) по ID4 (188415) ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти