From 50302ee051049c9f3f58a72b1766b42e44ab9781 Mon Sep 17 00:00:00 2001 From: Maxim Date: Sat, 2 Jul 2022 17:51:18 +0300 Subject: [PATCH] Update readme_eng.md --- doc/readme_eng.md | 332 +++++++++++++++++++++++----------------------- 1 file changed, 163 insertions(+), 169 deletions(-) diff --git a/doc/readme_eng.md b/doc/readme_eng.md index c3b027b..678f44d 100644 --- a/doc/readme_eng.md +++ b/doc/readme_eng.md @@ -69,247 +69,240 @@ Note : 1 sector = 64 KByte ## Support Command list CMD | Code | Desc ----|------|----- -Read | 0x0b, 0x6b, 0xEB, 0x0C, 0x6C, 0xEC | Read data from FLASH and transmit it over M_AXIS_TDATA. Limitations - - -Ограничения на команду - нельзя считать размер данных больше чем сама Flash. Ограничение контролируется извне. -Программирование | 0x3E 0x12 0x34 0x02 0x32 0x38 | Программирование флеш-памяти. Ограничения на команду - запись идет Не более 256 байт данных на одну команду. -Стирание сектора | 0xDC | Стирание сектора 64 КБайт -Стирание 4 КБайт | 0x21 | Стирание сабсектора 4 КБайт -Стирание 32 КБайт | 0x5c | Стирание сабсектора 32 КБайт -Стирание чипа | 0x4c | Стирание 512 МБит памяти +Read | 0x0b, 0x6b, 0xEB, 0x0C, 0x6C, 0xEC | Read data from FLASH and transmit it over M_AXIS_TDATA. Limitations - size of read bytes should not exceed memory size, control this limitiation externally +Program | 0x3E 0x12 0x34 0x02 0x32 0x38 | Program Flash. Limitations - writing no more than 256 bytes per command +Erase Sector | 0xDC | Erase sector 64 KByte +Erase 4 KB | 0x21 | Erase Subsector 4 KByte +Erase 32 KB | 0x5c | Erase subsector 32 KByte +Erase Chip | 0x4c | Erase 512 MBit of memory ![axis_micron_nor_ctrlr_x4_struct](https://user-images.githubusercontent.com/45385195/177000750-83cf0ce1-8766-4852-a02e-7c30b84a6694.png) -## generic-параметры -Параметр | Тип | Диапазон значений | описание ----------|-----|-------------------|--------- -MODE | string | "STARTUPE" или "DIRECT" | выбор каким образом контроллер подключается к FLASH : STARTUPE - через примитив STARTUPE (устанавливается снаружи) или напрямую к двунаправленным буферам(устанавливается снаружи) -ASYNC | boolean | true или false | Возможность работы S_AXIS_CLK и SPI_CLK в разных частотных доменах -SWAP_NIBBLE | boolean | true или false | какой полубайт передавать первым: при `SWAP_NIBBLE=true` передается сначала младший байт, при `SWAP_NIBBLE=false` сначала передается старший байт. +## generic parameters +Parameter | Type | Range | Description +----------|------|-------|------------ +MODE | string | "STARTUPE" or "DIRECT" | select mode connection from component to memory Flash : STARTUPE - Over STARTUPE primitive (0 bank FPGA, make this connection externally), or direct from component to FLASH over bidirectional buffers, which sets externally +ASYNC | boolean | true or false | Ability work with component in different clock domains for SPI_CLK and S_AXIS_CLK В +SWAP_NIBBLE | boolean | true или false | which nibble transmitted firstly : if `SWAP_NIBBLE=true` transmit lower nibble, if `SWAP_NIBBLE=false` firstly transmit high nibble. -## 1. Порты +## 1. Ports ### 1.1. AXI-Stream -Компонент содержит Slave и Master AXI-Stream порты +Component contains Slave and Master AXI-Stream ports #### 1.1.1. Slave AXI-Stream -Тактируется от S_AXIS_CLK +Clocked with S_AXIS_CLK -Название | Направление | Разрядность | Назначение +Name | Direction | Width | Description ---------|-------------|-------------|----------- -S_AXIS_TDATA | in | 8 | сигнал данных на запись во FLASH -S_AXIS_TVALID | in | 1 | сигнал валидности данных на шине -S_AXIS_TLAST | in | 1 | сигнал конца пакета -S_AXIS_TREADY | out | 1 | сигнал готовности компонента принимать данные +S_AXIS_TDATA | in | 8 | Data signal for program FLASH +S_AXIS_TVALID | in | 1 | Data Valid signal +S_AXIS_TLAST | in | 1 | End of packet signal +S_AXIS_TREADY | out | 1 | ready signal from component for ability receive of data #### 1.1.2. Master AXI-Stream -Тактируется от S_AXIS_CLK +clocked with S_AXIS_CLK -Название | Направление | Разрядность | Назначение +Name | Direction | Width | Description ---------|-------------|-------------|----------- -M_AXIS_TDATA | out | 8 | сигнал данных, читаемых с FLASH -M_AXIS_TVALID | out | 1 | сигнал валидности читаемых данных с FLASH -M_AXIS_TLAST | out | 1 | сигнал конца пакета -M_AXIS_TREADY | in | 1 | сигнал готовности к приему данных(формируется со стороны пользовательской логики) +M_AXIS_TDATA | out | 8 | Data signal readed from flash +M_AXIS_TVALID | out | 1 | Data valid signal +M_AXIS_TLAST | out | 1 | End of packet signal +M_AXIS_TREADY | in | 1 | ready signal from user logic -### 1.2. Сигналы тактирования и сброса +### 1.2. Clock and reset -При `ASYNC = true` сигналы входы сигналов S_AXIS_CLK, SPI_CLK имеют общий источник +When `ASYNC = false` S_AXIS_CLK and SPI_CLK signals connected to common clock signal -Название | Направление | Разрядность | Назначение +Name | Direction | Width | Description ---------|-------------|-------------|----------- -S_AXIS_CLK | in | 1 | Сигнал тактирования для шин S_AXIS_*, M_AXIS_*, *S_AXIS_CMD_* -S_AXIS_RESET | in | 1 | сигнал сброса компонента. Сбрасывает все очереди и пользовательскую логику -SPI_CLK | in | 1 | сигнал тактирования пользовательской логики -C | out | 1 | сигнал тактирования на SPI. Получается путем инверсии SPI_CLK - -### 1.3. Сигналы управления +S_AXIS_CLK | in | 1 | Clock signal for interfaces S_AXIS_*, M_AXIS_*, *S_AXIS_CMD_* +S_AXIS_RESET | in | 1 | Reset signal for internal logic, queues +SPI_CLK | in | 1 | Clock signal for internal logic +C | out | 1 | clock signal for NOR flash, form from SPI_CLK over primitive -Управление контроллером идет через шину `S_AXIS_CMD_*`. Протокол обмена - Slave AXI-Stream. +### 1.3. Control signals +Component perform operations, controlled from `S_AXIS_CMD_*` -Название | Направление | Разрядность | Назначение +Name | Direction | Width | Description ---------|-------------|-------------|----------- -S_AXIS_CMD | in | 8 | команда, которую надо выполнить. Поддерживаемый список команд представлен наверху данного документа. Все остальные команды игнорируются -S_AXIS_CMD_TSIZE | in | 32 | количество байт для обозначения сколько считывать/записывать данных на память. -S_AXIS_CMD_TADDR | in | 32 | начальный адрес -S_AXIS_CMD_TVALID | in | 1 | валидность команды -S_AXIS_CMD_TREADY | out | 1 | сигнал готовности компонента +S_AXIS_CMD | in | 8 | Command for execution. List of supported command described in [#Support Command List](). Other commands ignored +S_AXIS_CMD_TSIZE | in | 32 | Number of bytes for PROGRAM or READ command +S_AXIS_CMD_TADDR | in | 32 | Start Address +S_AXIS_CMD_TVALID | in | 1 | Command valid signal +S_AXIS_CMD_TREADY | out | 1 | Ready signal for command interface -### 1.4. Сигналы статуса +### 1.4. Status signals -Название | Направление | Разрядность | Назначение +Name | Direction | Width | Description ---------|-------------|-------------|----------- -FLASH_STATUS | out | 8 | текущий статус FLASH. необходим для понимания в каком статусе находится FLASH, валиден при `FLASH_STATUS_VALID=1` -FLASH_STATUS_VALID | out | 1 | сигнал валидности статуса -BUSY | out | 1 | флаг занятости конечного автомата. Когда автомат не занят выполнением операции, сигнал равен нулю +FLASH_STATUS | out | 8 | Current status of flash, valided when `FLASH_STATUS_VALID=1` +FLASH_STATUS_VALID | out | 1 | Valid signal +BUSY | out | 1 | Busy flaq. When FSM doesnt perform operation, this signal is 0, other case is 1 + -### 1.5. Сигналы группы QuadSPI +### 1.5. QuadSPI signal group -Название | Направление | Разрядность | Назначение +Name | Direction | Width | Description ---------|-------------|-------------|----------- -C | out | 1 | сигнал тактирования на FLASH память. Получается через инверсию SPI_CLK -RESET_OUT | out | 1 | сигнал сброса FLASH. -DQ_I | in | 4 | сигнал данных от FLASH -DQ_T | out | 4 | сигнал управления tri-state буфером -DQ_O | out | 4 | сигнал данных на FLASH -S | out | 1 | сигнал разрешения работы FLASH (CHIP_SELECT). при нуле - флеш работает. - - -## 2. некоторые принципы работы компонента. -- В начальный момент времени флеш должна быть без предустановки работы в режиме QuadSPI, в противном случае не гарантируется корректная работа -- У компонента есть начальная фаза инициализации, при которой устанавливается режим работы с адресом 4 байта, режим QuadSPI -- Установка конфигурации происходит посредством записи в Volatile-регистр FLASH через последовательный интерфейс (Extended SPI) -- Установка режима адреса 4 байт происходит через команду `ENABLE_FOUR_BYTE_ADDRESS_MODE` (0xB7) -- Компонент умеет читать всю FLASH за одну команду. -- Компонент умеет стирать FLASH за одну команду(вернее ее половину, в случае если размер флеш = 1 гбит) -- Компонент умеет записывать не более 256 байт за одну команду, контроль размера данных компонент не делает -- При программировании флеш сначала **подаются данные, потом команда**. В противном случае запись на флеш отработает, но данные могут быть искажены. -- Компонент при выполнении операции записи/стирания сам контролирует занятость FLASH через считывание регистра статуса. Когда FLASH освобождается, компонент переходит в состояние IDLE, опуская при этом BUSY в ноль. Пользователю, таким образом, нужно только контролировать флаг BUSY или порт FLASH_STATUS -- Компонент поддерживает два режима подключения: через примитив STARTUPE (`MODE=STARTUPE`) или напрямую к пинам (`MODE=DIRECT`). Компонент STARTUPE не представлен внутри текущего компонента, он ставится снаружи. При подключении в режиме `MODE=DIRECT` снаружи ставятся двунаправленные буферы ввода-вывода. Ниже нарисован примерный порядок подключения -- Компонент имеет возможность работы в асинхронном режиме. При `ASYNC=true` шины `S_AXIS_*`, `M_AXIS_*`, `S_AXIS_CMD` тактируются от `S_AXIS_CLK`, вся внутренняя логика при этом работает от `SPI_CLK`. Такая конфигурация позволяет достигать удобной интеграции в проект, в котором шины интерфейсов AXI-Stream могут работать на высоких частотах, а интерфейс между FLASH и компонентом при этом работают на более медленных скоростях. -- Сигнал сброса может отсутствовать в интерфейсе на FLASH -- Сигнал тактирования подается всегда, вне зависимости от того выполняется команда на компоненте или нет. -- Сигнал CS активен при нуле. При выполнении операций сигнал CS устанавливается в ноль. При простое, когда никакая команда не выполняется, сигнал CS=1. -- Если при чтении данных, пользовательская логика не может принять текущую порцию данных, то конечный автомат переходит в состояние ожидания возможности передачи данных. При этом FLASH-память, возможно, не переходит в состояние ожидания. Вероятно, данный механизм нужно модифицировать. - -### 2.1 Подключение компонента при MODE=STARTUPE +C | out | 1 | clock signal from inversion SPI_CLK +RESET_OUT | out | 1 | reset signal FLASH. +DQ_I | in | 4 | Data signal from flash FLASH +DQ_T | out | 4 | Tri-State control signal +DQ_O | out | 4 | Data signal to FLASH +S | out | 1 | Chip-select for Flash. If = 0, flash works + + +## 2. Some principles of component operation +- In beginning FLASH should be without preset of QuadSPI mode, in other case not guaranteed work +- Component have initial phase of initialization when sets up 4 byte addressation mode and QuadSPI mode +- Configuration performs by writing on Volatile Register of FLASH over Extended SPI (serial interface) +- Setting mode of 4-byte address over command `ENABLE_FOUR_BYTE_ADDRESS_MODE` (0xB7) +- Component can read all Flash over 1 command +- Component can erase FLASH by one command, or half-flash, if size of flash = 1 gbit +- Component can write not greater than 256 byte over command, size control not perform in component +- **DATA-BEFORE-COMMAND** mechanism, in other case data might be corrupted +- When execute erase/program operation, component control busy of flash. when Flash goes on IDLE, Busy flag deasserted. User may control BUSY flag +- Component supports two modes of connection - over STARTUPE, or over direct connection. STARTUPE component doesnt presented inside component, and should be installed outside of component. When DIRECT mode connection, bidirectional buffers installed outside of component. +- Support Asyncronous mode of work, when data buses and internal logic clocked by different clock signals +- Reset is optional +- Clock signal always transmit +- CS actived by zero when operation performed. when no operation, CS asserted in 1 +- If data read perform, and user logic doesnt receive current portion of data, FSM transmit in WAIT state, but FLASH not transmit this state. This mechanism should be modified + +### 2.1 Connection when MODE=STARTUPE ![axis_micron_nor_ctrlr_x4_startupe](https://user-images.githubusercontent.com/45385195/177000713-61488b3f-28f7-4526-86a1-e8251dffa0d3.png) -### 2.2 Подключение компонента при MODE=DIRECT +### 2.2 Connection when MODE=DIRECT ![axis_micron_nor_ctrlr_x4_direct](https://user-images.githubusercontent.com/45385195/177000728-752db03c-c44a-42b7-b653-2ef54ab66198.png) -## 3. Конечный автомат +## 3. Finite-State-Machine (FSM) -Ввиду большого количества состояний, и разделения функций компонента, конечный автомат будет представлен для каждой выполняемой операции отдельно. - -### 3.1 Процесс инициализации +### 3.1 Initialization process ![axis_micron_nor_ctrlr_x4_fsm_init](https://user-images.githubusercontent.com/45385195/177000767-8de47547-5e30-40ac-8e2f-489caed4ce7b.png) -#### 3.1.1 Состояния конечного автомата процесса инициализации +#### 3.1.1 Initialization states of FSM -Текущее состояние | Действия | Следующее состояние | Условие перехода -------------------|----------|---------------------|----------------- -RST_ST | Выдаем сигнал сброса наружу 1000 тактов после собственного сброса | W_CFG_REG_WE_CMD_ST | счетчик сброса досчитал до 1000 -W_CFG_REG_WE_CMD_ST | Отправляет команду разрешения записи | V_CFG_REG_WE_STUB_ST | Команда полностью передача на устройство (8 отсчетов) -V_CFG_REG_WE_STUB_ST | Ждем паузу между командами 1 такт | V_CFG_REG_CMD_ST | безусловный переход -V_CFG_REG_CMD_ST | Отправляем команду 0x61 (`WRITE ENHANCED VOLATILE CONFIGURATION REGISTER`) на устройство | V_CFG_REG_DATA_ST | Команда полностью передана на устройство (8 отсчетов) -V_CFG_REG_DATA_ST | Отправляем новое значение, которое запишется в регистр | ENABLE_FOUR_BYTE_PREPARE | Данные переданы на устройство -ENABLE_FOUR_BYTE_PREPARE | Выжидаем паузу 8 тактов | ENABLE_FOUR_BYTE_CMD_ST | Пауза 8 тактов прошла -ENABLE_FOUR_BYTE_CMD_ST | Отправляем команду 0xB7 | FINALIZE_ST | счетчик слов = 1(оба полубайта переданы) -FINALIZE_ST | Окончание команды | INIT_ST | Безусловный переход -IDLE_ST | Ничего не делаем | IDLE_ST | Не представлено здесь +Current state | Actions | Next state | Transition condition +--------------|---------|------------|--------------------- +RST_ST | reset signal transmit 1000 clock periods after deassert internal logic reset | W_CFG_REG_WE_CMD_ST | reset counter exceed 1000 clock periods +W_CFG_REG_WE_CMD_ST | send command write enable | V_CFG_REG_WE_STUB_ST | Completely transmit command +V_CFG_REG_WE_STUB_ST | Wait pause 1 clock period | V_CFG_REG_CMD_ST | unconditional +V_CFG_REG_CMD_ST | Send command 0x61 (`WRITE ENHANCED VOLATILE CONFIGURATION REGISTER`) to device | V_CFG_REG_DATA_ST | completely transmit command +V_CFG_REG_DATA_ST | Send new value to register | ENABLE_FOUR_BYTE_PREPARE | data transmit finalize +ENABLE_FOUR_BYTE_PREPARE | Await pause 8 clock period | ENABLE_FOUR_BYTE_CMD_ST | pause 8 clock period finished +ENABLE_FOUR_BYTE_CMD_ST | Send command 0xB7 | FINALIZE_ST | all nibbles transmitted +FINALIZE_ST | End of command | INIT_ST | unconditional +IDLE_ST | nothing | IDLE_ST | unpresent here -#### 3.1.2. Диаграмма процесса инициализации +#### 3.1.2. Diagram of initialization process ![axis_micron_nor_ctrlr_x4_init](https://user-images.githubusercontent.com/45385195/177000782-f352dd45-22aa-48d7-9c4d-b379ce462398.png) -### 3.2 Операция записи +### 3.2 Program operation ![axis_micron_nor_ctrlr_x4_fsm_program](https://user-images.githubusercontent.com/45385195/177000789-1e18919e-c1da-4418-9a71-b8b7524aad4c.png) -#### 3.2.1. Состояния конечного автомата операции записи +#### 3.2.1. FSM states of program operation -Текущее состояние | Действия | Следующее состояние | Условие перехода -------------------|----------|---------------------|----------------- -IDLE_ST | Ждем валидную команду на запись | PROGRAM_WE_CMD_ST | Входная очередь команд не пуста и выходные данные совпадают с командой программирования -PROGRAM_WE_CMD_ST | Отправляем разрешение на программирование | PROGRAM_WE_STUB_ST | Команда полностью передана на устройство -PROGRAM_WE_STUB_ST | Проверяем наличие данных на входе | PROGRAM_CMD_ST | Если во входной FIFO есть данные, то переходим -PROGRAM_CMD_ST | Отправляем команду PROGRAM На FLASH | PROGRAM_ADDR_ST | Команда полностью передана на устройство -PROGRAM_ADDR_ST | Отправка адреса на устройство | PROGRAM_DATA_ST | Адрес полностью передан на устройство -PROGRAM_DATA_ST | Отправка данных на устройство | PROGRAM_DATA_STUB | Весь обьем данных записан на FLASH -PROGRAM_DATA_STUB_ST | Ждем 1 такт | READ_STATUS_ST | Безусловный переход -READ_STATUS_CMD_ST | Отправка команды READ_STATUS (0x70) | READ_STATUS_DATA_ST | Команда отправлена полностью -READ_STATUS_DATA_ST | Чтение статуса с флеш | READ)STATUS_STUB_ST | Статус полностью прочитан (2 такта, 1 байт) -READ_STATUS_STUB_ST | Ждем 1 такт | READ_STATUS_CHK_ST | Безусловный переход -READ_STATUS_CHK_ST | Проверяем статус | READ_STATUS_CMD_ST | Если статус FLASH = занят(`bit7=0`), то переходим к новому запросу статуса с флеш -READ_STATUS_CHK_ST | Проверяем статус | FINALIZE_ST | Если статус FLASH = свободен(`bit7=1`), то переходим к завершению команды -FINALIZE_ST | Завершаем команду | IDLE_ST | Безусловный +Current state | Actions | Next state | Transition condition +--------------|---------|------------|--------------------- +IDLE_ST | Await valid cmd for writeing | PROGRAM_WE_CMD_ST | Input data is empty and PROGRAM command from list +PROGRAM_WE_CMD_ST | Send Write enable to FLASH | PROGRAM_WE_STUB_ST | Completely transmit command +PROGRAM_WE_STUB_ST | Check data from input | PROGRAM_CMD_ST | If data is presented in input queue +PROGRAM_CMD_ST | Send PROGRAM to FLASH | PROGRAM_ADDR_ST | Completely command transfer +PROGRAM_ADDR_ST | Send Address to FLASH | PROGRAM_DATA_ST | Address transmitted to FLASH +PROGRAM_DATA_ST | Send DATA to FLASH | PROGRAM_DATA_STUB | All volume of DATA writed to FLASH +PROGRAM_DATA_STUB_ST | WAit 1 clock period | READ_STATUS_ST | Unconditional +READ_STATUS_CMD_ST | Send command READ_STATUS (0x70) | READ_STATUS_DATA_ST | Command transmitted +READ_STATUS_DATA_ST | Read Status from flash | READ_STATUS_STUB_ST | Completely readed statys (2 clock periods, 1 byte of data) +READ_STATUS_STUB_ST | Wait 1 clock period | READ_STATUS_CHK_ST | Unconditional +READ_STATUS_CHK_ST | check status | READ_STATUS_CMD_ST | if FLASH status = busy(`bit7=0`), go to new request from flash +READ_STATUS_CHK_ST | check status | FINALIZE_ST | if FLASH status = idle(`bit7=1`), go to finalize command +FINALIZE_ST | Finalize command | IDLE_ST | unconditional -#### 3.2.2 Диаграмма процесса записи +#### 3.2.2 Diagram of program operation -Начало +Start ![axis_micron_nor_ctrlr_x4_programstart](https://user-images.githubusercontent.com/45385195/177000792-e3c68291-fa4b-4e92-a0ec-17fd75b4bd00.png) -Конец +End ![axis_micron_nor_ctrlr_x4_programend](https://user-images.githubusercontent.com/45385195/177000795-fc0d98b3-5f0b-4b43-935a-6b061eed4048.png) -### 3.3 Операция стирания +### 3.3 Erase operation ![axis_micron_nor_ctrlr_x4_fsm_erase](https://user-images.githubusercontent.com/45385195/177000800-32c6c34c-9eed-4027-8bec-8dab0da7fe13.png) -#### 3.3.1. Состояния конечного автомата операции стирания - +#### 3.3.1. FSM states of erase operation -Текущее состояние | Действия | Следующее состояние | Условие перехода -------------------|----------|---------------------|----------------- -IDLE_ST | Ждем валидную команду на стирание | ERASE_WE_CMD_ST | Входная очередь команд не пуста и выходные данные совпадают с командой стирания -ERASE_WE_CMD_ST | Отправляем разрешение стирания | ERASE_WE_STUB_ST | Команда передана полностью -ERASE_WE_STUB_ST | Ждем 1 такт | ERASE_CMD_ST | Безусловный переход -ERASE_CMD_ST | отправляем команду стирания на устройство | ERASE_ADDR_ST | Команда передана полностью -ERASE_ADDR_ST | Отправляем начальный адрес на устройство | ERASE_STUB_ST | Адрес передан полностью -ERASE_STUB_ST | Ждем 1 такт | READ_STATUS_CMD_ST | Безусловный переход -READ_STATUS_CMD_ST | Отправка команды READ_STATUS (0x70) | READ_STATUS_DATA_ST | Команда отправлена полностью -READ_STATUS_DATA_ST | Чтение статуса с флеш | READ)STATUS_STUB_ST | Статус полностью прочитан (2 такта, 1 байт) -READ_STATUS_STUB_ST | Ждем 1 такт | READ_STATUS_CHK_ST | Безусловный переход -READ_STATUS_CHK_ST | Проверяем статус | READ_STATUS_CMD_ST | Если статус FLASH = занят(`bit7=0`), то переходим к новому запросу статуса с FLASH -READ_STATUS_CHK_ST | Проверяем статус | FINALIZE_ST | Если статус FLASH = свободен(`bit7=1`), то переходим к завершению команды -FINALIZE_ST | Завершаем команду | IDLE_ST | Безусловный +Current state | Actions | Next state | Transition condition +--------------|---------|------------|--------------------- +IDLE_ST | Wait for valid command of erase | ERASE_WE_CMD_ST | Command queue is not empty and current command is ERASE from list +ERASE_WE_CMD_ST | Send erase valid | ERASE_WE_STUB_ST | Command transmitted +ERASE_WE_STUB_ST | Wait for 1 clk period | ERASE_CMD_ST | Unconditional +ERASE_CMD_ST | send ERASE command to FLASH | ERASE_ADDR_ST | Command transmittd +ERASE_ADDR_ST | Send Address | ERASE_STUB_ST | Address transmitted +ERASE_STUB_ST | wait for 1 clk period | READ_STATUS_CMD_ST | Unconditional +READ_STATUS_CMD_ST | Send READ_STATUS command (0x70) | READ_STATUS_DATA_ST | command transmitted +READ_STATUS_DATA_ST | Wait status from flash | READ)STATUS_STUB_ST | status readed (2 clock period, 1 byte) +READ_STATUS_STUB_ST | wait for 1 clk_period | READ_STATUS_CHK_ST | Unconditional +READ_STATUS_CHK_ST | check status | READ_STATUS_CMD_ST | if FLASH status = busy(`bit7=0`), go to new request from flash +READ_STATUS_CHK_ST | check status | FINALIZE_ST | if FLASH status = idle(`bit7=1`), go to finalize command +FINALIZE_ST | finalize command | IDLE_ST | Unconditional -### 3.4 Операция чтения +### 3.4 Read operation -Внимание: состояние READ_DATA_WAIT_ABILITY не будут отрабатывать корректно, необходимо внесение изменений +Warning: state READ_DATA_WAIT_ABILITY uncorrected, need to changes ![axis_micron_nor_ctrlr_x4_fsm_read](https://user-images.githubusercontent.com/45385195/177000802-607f9890-1a0c-4eaa-bf08-2131d50110e9.png) -Текущее состояние | Действия | Следующее состояние | Условие перехода -------------------|----------|---------------------|----------------- -IDLE_ST | Ждем валидную команду на чтение | READ_CMD_ST | входная очередь команд не пуста и выходные данные очереди совпадают с командой чтения -READ_CMD_ST | Передача команды чтения | READ_ADDRESS_ST | Команда передана полностью -READ_ADDRESS_ST | Передача начального адреса | READ_DUMMY_ST | Адрес передан полностью -READ_DUMMY_ST | Ждем 10 тактов согласно документу на память | READ_DATA_ST | Счетчик досчитал нужное количество тактов сколько нужно ждать -READ_DATA_ST | Читаем данные с FLASH и передаем их в выходную очередь данных | READ_DATA_WAIT_ABILITY | Выходная очередь заполнилась -READ_DATA_WAIT_ABILITY | Ждем освобождения выходной очереди | READ_DATA_ST | выходная очередь освободилась -READ_DATA_ST | Читаем данные с FLASH и передаем их в выходную очередь данных | FINALIZE_ST | Количество считанных байт достигнуто -FINALIZE_ST | Завершаем команду | IDLE_ST | Безусловный +Current state | Actions | Next state | Transition condition +--------------|---------|------------|--------------------- +IDLE_ST | wait valid cmd for reading | READ_CMD_ST | input command queue isnt empty and current command is read +READ_CMD_ST | transmit read command to FLASH | READ_ADDRESS_ST | command transmitted +READ_ADDRESS_ST | Send address | READ_DUMMY_ST | ADDRESS transmitted +READ_DUMMY_ST | wait for 10 clock period | READ_DATA_ST | internal counter exceeds limit +READ_DATA_ST | read data from flash and transmit to M_AXIS for user level | READ_DATA_WAIT_ABILITY | output queue is full +READ_DATA_WAIT_ABILITY | wait for output queue is empty | READ_DATA_ST | output queue is empty +READ_DATA_ST | Read data from flash and transmit to output over M_AXIS to user leve | FINALIZE_ST | Number of readed byte exceeded +FINALIZE_ST | Finalize command | IDLE_ST | unconditional -### 3.5 Отсутствие валидной команды +### 3.5 No valid command -Возникает когда записанные данные не содержат в своем составе команды из списка +when command not in list of supported command ![axis_micron_nor_ctrlr_x4_fsm_nocmd](https://user-images.githubusercontent.com/45385195/177000807-1048e850-b9a2-4d44-9626-73fc31a0e7eb.png) -## 4. Необходимые внешние компоненты - -Название компонент | Описание --------------------|--------- -[fifo_cmd_sync_xpm](https://github.com/MasterPlayer/micron-nor-ctrlr/blob/main/src_hw/fifo_cmd_sync_xpm.vhd) | Входная очередь команд, используется когда `ASYNC=false` -[fifo_cmd_async_xpm](https://github.com/MasterPlayer/micron-nor-ctrlr/blob/main/src_hw/fifo_cmd_async_xpm.vhd) | Входная очередь команд, используется когда `ASYNC=true` -[fifo_in_sync_xpm](https://github.com/MasterPlayer/micron-nor-ctrlr/blob/main/src_hw/fifo_in_sync_xpm.vhd) | Входная очередь данных, используется при выполнении операции записи на FLASH когда `ASYNC=false` -[fifo_in_async_xpm](https://github.com/MasterPlayer/micron-nor-ctrlr/blob/main/src_hw/fifo_in_async_xpm.vhd) | Входная очередь данных, используется при выполнении операции записи на FLASH когда `ASYNC=true` -[fifo_out_sync_xpm](https://github.com/MasterPlayer/micron-nor-ctrlr/blob/main/src_hw/fifo_out_sync_xpm.vhd) | Выходная очередь данных, используется при чтении данных с FLASH когда `ASYNC=false` -[fifo_out_async_xpm](https://github.com/MasterPlayer/micron-nor-ctrlr/blob/main/src_hw/fifo_out_async_xpm.vhd) | Выходная очередь данных, используется при чтении данных с FLASH когда `ASYNC=true` +## 4. Required external components -## 5. Тестирование +Component | Description +----------|------------ +[fifo_cmd_sync_xpm](https://github.com/MasterPlayer/micron-nor-ctrlr/blob/main/src_hw/fifo_cmd_sync_xpm.vhd) | input command queue, used when `ASYNC=false` +[fifo_cmd_async_xpm](https://github.com/MasterPlayer/micron-nor-ctrlr/blob/main/src_hw/fifo_cmd_async_xpm.vhd) | input command queue, used when `ASYNC=true` +[fifo_in_sync_xpm](https://github.com/MasterPlayer/micron-nor-ctrlr/blob/main/src_hw/fifo_in_sync_xpm.vhd) | input data queue, used for write operation FLASH when `ASYNC=false` +[fifo_in_async_xpm](https://github.com/MasterPlayer/micron-nor-ctrlr/blob/main/src_hw/fifo_in_async_xpm.vhd) | input data queue, used for write operation FLASH when `ASYNC=true` +[fifo_out_sync_xpm](https://github.com/MasterPlayer/micron-nor-ctrlr/blob/main/src_hw/fifo_out_sync_xpm.vhd) | output data queue, used for read operation when `ASYNC=false` +[fifo_out_async_xpm](https://github.com/MasterPlayer/micron-nor-ctrlr/blob/main/src_hw/fifo_out_async_xpm.vhd) | output data queue, used for read operation when `ASYNC=true` -### 5.1 Скорости +## 5. Testing -Компонент тестирован при работе с реальной FLASH-памятью `Micron NOR MT25Q`, объемом 1 Гбит. Сбоев в процессе работы не наблюдалось, при этом получились значения скорости следующие. +### 5.1 Speeds -При этом, надо понимать что время выполнения операций стирания/программирования зависит от характера самих данных. Это свойство самой флеш +Tested with real flash memory `Micron NOR MT25Q`, volume 1 Gbit. -Был написан внешний компонент который создавал запросы к текущему модулю и задавал процесс записи/стирания. Данные состояли из 32-битного счетчика. Для всех операций записи проводилась проверка путем чтения флеш и проверкой внешним компонентом. При стирании проводилась проверка на то, что все биты равны единице. В таблице будут указаны минимальные скорости. Простым языком - флеш записывалась от начала до конца, засекалось время, потом вычитывалась и проверялась, затем стиралась, и так несколько раз различными командами. +time for erase and program depends on data. Operation | Volume, Bytes | Speed, MB/s | Total Time, seconds ----------|---------------|-------------|-------------------- @@ -320,9 +313,9 @@ ERASE_SUBSECTOR_32K | 134217728 | 0.415 | 324 ERASE_SUBSECTOR_4K | 134217728 | 0.251 | 534 PROGRAM | 134217728 | 1.29 | 104 -### 5.2 Тайминги +### 5.2 Timing -Тайминги оценивались по простой схеме - засекалось количество тактов, сколько компонент находится в состоянии BUSY при выполнении каждой команды используя разные адреса и разные данные. Далее все результаты измерений заносились в таблицу, искали минимум и максимум, и вычисляли среднее значение выполнения команды. Результаты представлены ниже +Timing estimation based upon BUSY time on each operation Operation | Size, Bytes | Time AVG, sec | Time MIN, sec | Time MAX, sec ----------|-------------|---------------|---------------|-------------- @@ -332,13 +325,14 @@ ERASE | 4096 | 0.017 | 0.023 | 0.016 PROGRAM | 256 | 0.000190 | 0.0002 | 0.0001 -## 6. Лог изменений +## 6. Change log -**1. 03.05.2021 : v1.0 - первая версия** -Добавлен компонент и документация к нему с рисунками и диаграммами +**1. 03.05.2021 : v1.0 - First version** +Component with documentation and pictures -**2. 02.07.2022 : v1.1 - Обновление описания, добавлен модуль** -- Добавлен модуль восстановления работоспособности Flash, если она заблокирована (доступ к ней со стороны Vivado недоступен, так как Vivado не может получить сигнатуру устройства -- Обновление описания +**2. 02.07.2022 : v1.1 - Update description, add recovery module of FLASH** +- add recovery/rescue unit for flash if it is locked state +- update description +- add eng lang description