ЛР14. Изменение точки входа конечного автомата

Ранее после сброса, программатор сразу же отравлял начальное сообщение.
Подобное поведение неудобно, поскольку требует сперва запустить скрипт
прошивки, и только после этого делать сброс.
Теперь же программатор ждет начальной команды и только после этого,
отправляет сообщение по UART.
This commit is contained in:
Andrei Solodovnikov
2024-01-30 15:55:08 +03:00
parent 2adc9f2d10
commit 12bbbbfe0f
6 changed files with 59 additions and 34 deletions

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

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 731 KiB

View File

@@ -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;
@@ -280,7 +280,7 @@ 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;

View File

@@ -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)
def flash(data: bytes, port: serial.Serial, mem_name: str):
assert(len(mem_name) == 4)
if data:
data_len = len(data)
else: else:
data_len = 0 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, start_addr: int):
addr_bytes = start_addr.to_bytes(4, "big")
port.write(addr_bytes)
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")

View File

@@ -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;