mirror of
https://github.com/MPSU/APS.git
synced 2025-09-16 09:40:10 +00:00
ЛР14. Изменение точки входа конечного автомата
Ранее после сброса, программатор сразу же отравлял начальное сообщение. Подобное поведение неудобно, поскольку требует сперва запустить скрипт прошивки, и только после этого делать сброс. Теперь же программатор ждет начальной команды и только после этого, отправляет сообщение по UART.
This commit is contained in:
4
.pic/Labs/lab_14_programming_device/fig_03.drawio.svg
Normal file
4
.pic/Labs/lab_14_programming_device/fig_03.drawio.svg
Normal file
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 133 KiB |
Binary file not shown.
Before Width: | Height: | Size: 299 KiB |
4
.pic/Labs/lab_14_programming_device/fig_04.drawio.svg
Normal file
4
.pic/Labs/lab_14_programming_device/fig_04.drawio.svg
Normal file
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 731 KiB |
@@ -258,12 +258,12 @@ module bluster
|
|||||||
);
|
);
|
||||||
|
|
||||||
enum logic [2:0] {
|
enum logic [2:0] {
|
||||||
|
RCV_NEXT_COMMAND,
|
||||||
INIT_MSG,
|
INIT_MSG,
|
||||||
RCV_SIZE,
|
RCV_SIZE,
|
||||||
SIZE_ACK,
|
SIZE_ACK,
|
||||||
FLASH,
|
FLASH,
|
||||||
FLASH_ACK,
|
FLASH_ACK,
|
||||||
RCV_NEXT_COMMAND,
|
|
||||||
WAIT_TX_DONE,
|
WAIT_TX_DONE,
|
||||||
FINISH}
|
FINISH}
|
||||||
state, next_state;
|
state, next_state;
|
||||||
@@ -277,10 +277,10 @@ 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;
|
||||||
|
|
||||||
assign send_fin = (msg_counter == 0) && !tx_busy;
|
assign send_fin = (msg_counter == 0) && !tx_busy;
|
||||||
assign size_fin = (size_counter == 0) && !rx_busy;
|
assign size_fin = (size_counter == 0) && !rx_busy;
|
||||||
assign flash_fin = (flash_counter == 0) && !rx_busy;
|
assign flash_fin = (flash_counter == 0) && !rx_busy;
|
||||||
assign next_round = (flash_addr != 0) && !rx_busy;
|
assign next_round = (flash_addr != '1) && !rx_busy;
|
||||||
|
|
||||||
localparam INIT_MSG_SIZE = 40;
|
localparam INIT_MSG_SIZE = 40;
|
||||||
localparam FLASH_MSG_SIZE = 57;
|
localparam FLASH_MSG_SIZE = 57;
|
||||||
|
@@ -5,43 +5,56 @@ parser = argparse.ArgumentParser()
|
|||||||
parser.add_argument("instr", type=str, help="File for instr mem initialization")
|
parser.add_argument("instr", type=str, help="File for instr mem initialization")
|
||||||
parser.add_argument("comport", type=str, help="COM-port name")
|
parser.add_argument("comport", type=str, help="COM-port name")
|
||||||
parser.add_argument("-d", "--data", type=str, help="File for data mem initialization")
|
parser.add_argument("-d", "--data", type=str, help="File for data mem initialization")
|
||||||
|
parser.add_argument("-c", "--color", type=str, help="File for color mem initialization")
|
||||||
parser.add_argument("-t", "--tiff", type=str, help="File for tiff mem initialization")
|
parser.add_argument("-t", "--tiff", type=str, help="File for tiff mem initialization")
|
||||||
|
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
def parse_file(fname: str, base: int = 16, word_size: int = 2) -> bytes:
|
def parse_file(fname: str, base: int = 16, chars_in_byte: int = 2, start_addr: int = None) -> dict:
|
||||||
res_bytes=b''
|
res_bytes=b''
|
||||||
|
bytes_map = {}
|
||||||
with open(fname, 'r') as fp:
|
with open(fname, 'r') as fp:
|
||||||
for line in fp:
|
for line in fp:
|
||||||
if line[0] == '@':
|
if line[0] == '@':
|
||||||
continue
|
if res_bytes:
|
||||||
for word in line.split():
|
assert(start_addr is not None)
|
||||||
res_bytes += bytes(int(word,base).to_bytes(len(word)//word_size,"little"))
|
bytes_map[start_addr] = res_bytes[::-1]
|
||||||
return res_bytes[::-1]
|
res_bytes = b''
|
||||||
|
start_addr = int(line[1:], 16)
|
||||||
|
else:
|
||||||
|
for word in line.split():
|
||||||
|
res_bytes += bytes(int(word,base).to_bytes(len(word)//chars_in_byte,"little"))
|
||||||
|
assert(start_addr is not None)
|
||||||
|
bytes_map[start_addr] = res_bytes[::-1]
|
||||||
|
return bytes_map
|
||||||
|
|
||||||
def flash(data: bytes, port: serial.Serial, mem_name: str):
|
def flash(data: bytes, port: serial.Serial, start_addr: int):
|
||||||
assert(len(mem_name) == 4)
|
|
||||||
|
|
||||||
if data:
|
addr_bytes = start_addr.to_bytes(4, "big")
|
||||||
data_len = len(data)
|
port.write(addr_bytes)
|
||||||
else:
|
|
||||||
data_len = 0
|
ready_msg = port.read(40)
|
||||||
|
ready_msg_str = ready_msg.decode("ascii")
|
||||||
|
print(ready_msg_str)
|
||||||
|
assert(ready_msg_str == "ready for flash staring from 0x{:08x}\n".format(start_addr))
|
||||||
|
|
||||||
|
data_len = len(data)
|
||||||
data_len_bytes = data_len.to_bytes(4, "big")
|
data_len_bytes = data_len.to_bytes(4, "big")
|
||||||
port.write(data_len_bytes)
|
port.write(data_len_bytes)
|
||||||
|
|
||||||
data_len_ack = port.read(4)
|
data_len_ack_bytes = port.read(4)
|
||||||
print(int.from_bytes(data_len_ack,"big"))
|
data_len_ack = int.from_bytes(data_len_ack_bytes,"big")
|
||||||
assert(data_len_ack == data_len_bytes)
|
print("0x{:08x}".format(data_len_ack))
|
||||||
|
assert(data_len_ack == data_len)
|
||||||
|
|
||||||
if(data):
|
port.write(data)
|
||||||
port.write(data)
|
|
||||||
|
|
||||||
print("finished write {} mem".format(mem_name))
|
print("Sent {:08x} bytes".format(data_len))
|
||||||
|
|
||||||
data_flash_ack = port.read(10)
|
data_flash_ack = port.read(57)
|
||||||
data_flash_ack_str = data_flash_ack.decode("ascii")
|
data_flash_ack_str = data_flash_ack.decode("ascii")
|
||||||
print(data_flash_ack_str)
|
print(data_flash_ack_str)
|
||||||
assert(data_flash_ack_str == "{} done\n".format(mem_name))
|
assert(data_flash_ack_str == "finished write 0x{:08x} bytes starting from 0x{:08x}\n".format(data_len, start_addr))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -49,20 +62,26 @@ def flash(data: bytes, port: serial.Serial, mem_name: str):
|
|||||||
|
|
||||||
inst_file = args.instr
|
inst_file = args.instr
|
||||||
data_file = args.data
|
data_file = args.data
|
||||||
|
color_file= args.color
|
||||||
tiff_file = args.tiff
|
tiff_file = args.tiff
|
||||||
com = args.comport
|
com = args.comport
|
||||||
|
|
||||||
instr = parse_file(inst_file)
|
instr = parse_file(inst_file, start_addr=0)
|
||||||
|
|
||||||
if data_file:
|
if data_file:
|
||||||
data = parse_file(data_file)
|
data = parse_file(data_file)
|
||||||
else:
|
else:
|
||||||
data = b''
|
data = {}
|
||||||
|
|
||||||
|
if color_file:
|
||||||
|
color = parse_file(color_file)
|
||||||
|
else:
|
||||||
|
color = {}
|
||||||
|
|
||||||
if tiff_file:
|
if tiff_file:
|
||||||
tiff = parse_file(tiff_file, 2, 8)
|
tiff = parse_file(tiff_file, 2, 8)
|
||||||
else:
|
else:
|
||||||
tiff = b''
|
tiff = {}
|
||||||
|
|
||||||
|
|
||||||
ser = serial.Serial(
|
ser = serial.Serial(
|
||||||
@@ -74,10 +93,8 @@ ser = serial.Serial(
|
|||||||
timeout=None
|
timeout=None
|
||||||
)
|
)
|
||||||
|
|
||||||
init_msg = ser.read(6)
|
for ass_arr in [instr, data, color, tiff]:
|
||||||
print(init_msg.decode("ascii"))
|
for addr, bytes_list in ass_arr.items():
|
||||||
assert(init_msg == b'ready\n')
|
flash(bytes_list, ser, addr)
|
||||||
|
|
||||||
flash(instr, ser, "inst")
|
ser.write(bytes([255]*4))
|
||||||
flash(data, ser, "data")
|
|
||||||
flash(tiff, ser, "tiff")
|
|
||||||
|
@@ -297,7 +297,7 @@ module tb_blaster();
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
RCV_NEXT_COMMAND
|
RCV_NEXT_COMMAND
|
||||||
*/ flash_addr = 32'h0000_0000;
|
*/ flash_addr = 32'hFFFF_FFFF;
|
||||||
for(int i = MSG_ACK_SIZE-1; i >= 0; i--) begin
|
for(int i = MSG_ACK_SIZE-1; i >= 0; i--) begin
|
||||||
tx_data = flash_addr[i];
|
tx_data = flash_addr[i];
|
||||||
tx_valid = 1'b1;
|
tx_valid = 1'b1;
|
||||||
|
Reference in New Issue
Block a user