mirror of
https://github.com/MPSU/APS.git
synced 2025-09-15 17:20:10 +00:00
ЛР15. Изменение конечного автомата программатора
This commit is contained in:
File diff suppressed because one or more lines are too long
Before Width: | Height: | Size: 133 KiB After Width: | Height: | Size: 31 KiB |
@@ -252,7 +252,7 @@ _Рисунок 3. Граф перехода между состояниями
|
|||||||
Данный автомат реализует следующий алгоритм:
|
Данный автомат реализует следующий алгоритм:
|
||||||
|
|
||||||
1. Получение команды ("запись очередного блока" / "программирование завершено"). Данная команда представляет собой адрес записи очередного блока, и в случае, если адрес равен 0xFFFFFFFF, это означает команду "программирование завершено".
|
1. Получение команды ("запись очередного блока" / "программирование завершено"). Данная команда представляет собой адрес записи очередного блока, и в случае, если адрес равен 0xFFFFFFFF, это означает команду "программирование завершено".
|
||||||
1. В случае получения команды "программирование завершено", модуль отправляет финальное сообщение и завершает свою работу.
|
1. В случае получения команды "программирование завершено", модуль завершает свою работу, снимая сигнал сброса с процессора.
|
||||||
2. В случае получения команды "запись очередного блока" происходит переход к п. 2.
|
2. В случае получения команды "запись очередного блока" происходит переход к п. 2.
|
||||||
2. Модуль отправляет сообщение о готовности принимать размер очередного блока.
|
2. Модуль отправляет сообщение о готовности принимать размер очередного блока.
|
||||||
3. Выполняется передача размера очередного блока.
|
3. Выполняется передача размера очередного блока.
|
||||||
@@ -294,30 +294,29 @@ import bluster_pkg::INIT_MSG_SIZE;
|
|||||||
import bluster_pkg::FLASH_MSG_SIZE;
|
import bluster_pkg::FLASH_MSG_SIZE;
|
||||||
import bluster_pkg::ACK_MSG_SIZE;
|
import bluster_pkg::ACK_MSG_SIZE;
|
||||||
|
|
||||||
(* mark_debug = "false" *) enum logic [2:0] {
|
enum logic [2:0] {
|
||||||
RCV_NEXT_COMMAND,
|
RCV_NEXT_COMMAND,
|
||||||
INIT_MSG,
|
INIT_MSG,
|
||||||
RCV_SIZE,
|
RCV_SIZE,
|
||||||
SIZE_ACK,
|
SIZE_ACK,
|
||||||
FLASH,
|
FLASH,
|
||||||
FLASH_ACK,
|
FLASH_ACK,
|
||||||
WAIT_TX_DONE,
|
|
||||||
FINISH}
|
FINISH}
|
||||||
state, next_state;
|
state, next_state;
|
||||||
|
|
||||||
logic rx_busy, rx_valid, tx_busy, tx_valid;
|
logic rx_busy, rx_valid, tx_busy, tx_valid;
|
||||||
(* mark_debug = "false" *) logic [7:0] rx_data, tx_data;
|
logic [7:0] rx_data, tx_data;
|
||||||
|
|
||||||
(* mark_debug = "false" *)logic [5:0] msg_counter;
|
logic [5:0] msg_counter;
|
||||||
(* mark_debug = "false" *)logic [31:0] size_counter, flash_counter;
|
logic [31:0] size_counter, flash_counter;
|
||||||
(* mark_debug = "false" *)logic [3:0] [7:0] flash_size, flash_addr;
|
logic [3:0] [7:0] flash_size, flash_addr;
|
||||||
|
|
||||||
logic send_fin, size_fin, flash_fin, next_round;
|
logic send_fin, size_fin, flash_fin, next_round;
|
||||||
|
|
||||||
(* mark_debug = "false" *)assign send_fin = (msg_counter == 0) && !tx_busy;
|
assign send_fin = (msg_counter == 0) && !tx_busy;
|
||||||
(* mark_debug = "false" *)assign size_fin = (size_counter == 0) && !rx_busy;
|
assign size_fin = (size_counter == 0) && !rx_busy;
|
||||||
(* mark_debug = "false" *)assign flash_fin = (flash_counter == 0) && !rx_busy;
|
assign flash_fin = (flash_counter == 0) && !rx_busy;
|
||||||
(* mark_debug = "false" *)assign next_round = (flash_addr != '1) && !rx_busy;
|
assign next_round = (flash_addr != '1) && !rx_busy;
|
||||||
|
|
||||||
logic [7:0] [7:0] flash_size_ascii, flash_addr_ascii;
|
logic [7:0] [7:0] flash_size_ascii, flash_addr_ascii;
|
||||||
// Блок generate позволяет создавать структуры модуля цикличным или условным
|
// Блок generate позволяет создавать структуры модуля цикличным или условным
|
||||||
@@ -599,6 +598,7 @@ _Листинг 6. Пример использования скрипта для
|
|||||||
1. Для инициализации памяти процессорной системы используется скрипт [flash.py](flash.py).
|
1. Для инициализации памяти процессорной системы используется скрипт [flash.py](flash.py).
|
||||||
2. Перед инициализацией необходимо подключить отладочный стенд к последовательному порту компьютера и узнать номер этого порта (см. [пример загрузки программы](#пример-загрузки-программы)).
|
2. Перед инициализацией необходимо подключить отладочный стенд к последовательному порту компьютера и узнать номер этого порта (см. [пример загрузки программы](#пример-загрузки-программы)).
|
||||||
3. Формат файлов для инициализации памяти с помощью скрипта аналогичен формату, использовавшемуся в [тестбенче](lab_15_tb_bluster.sv). Это значит что первой строчкой всех файлов должна быть строка, содержащая адрес ячейки памяти, с которой должна начаться инициализация (см. п. 5.1.2).
|
3. Формат файлов для инициализации памяти с помощью скрипта аналогичен формату, использовавшемуся в [тестбенче](lab_15_tb_bluster.sv). Это значит что первой строчкой всех файлов должна быть строка, содержащая адрес ячейки памяти, с которой должна начаться инициализация (см. п. 5.1.2).
|
||||||
|
10. В текущем исполнении, инициализировать память системы можно только 1 раз с момента сброса, что может оказаться не очень удобным при отладке программ. Подумайте, как можно модифицировать конечный автомат программатора таким образом, чтобы получить возможность в неограниченном количестве инициализаций памяти без повторного сброса всей системы.
|
||||||
|
|
||||||
## Список источников
|
## Список источников
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user