diff --git a/.pic/Labs/lab_14_programming_device/fig_03.drawio.svg b/.pic/Labs/lab_14_programming_device/fig_03.drawio.svg new file mode 100644 index 0000000..a71e2eb --- /dev/null +++ b/.pic/Labs/lab_14_programming_device/fig_03.drawio.svg @@ -0,0 +1,4 @@ + + + +
INIT MSG
FLASH
FLASH
ACK
WAIT
TX
DONE
FINISH
RCV
SIZE
SIZE
ACK
send_fin
size_fin
send_fin
flash_fin
send_fin
! tx_busy
size_fin & next_round
size_fin &
! next_round
RCV
NEXT
COMAND
rst_i
\ No newline at end of file diff --git a/.pic/Labs/lab_14_programming_device/fig_04.drawio.png b/.pic/Labs/lab_14_programming_device/fig_04.drawio.png deleted file mode 100644 index 8e5c4d7..0000000 Binary files a/.pic/Labs/lab_14_programming_device/fig_04.drawio.png and /dev/null differ diff --git a/.pic/Labs/lab_14_programming_device/fig_04.drawio.svg b/.pic/Labs/lab_14_programming_device/fig_04.drawio.svg new file mode 100644 index 0000000..97852ae --- /dev/null +++ b/.pic/Labs/lab_14_programming_device/fig_04.drawio.svg @@ -0,0 +1,4 @@ + + + +
clk_i

rst_i

входные сигналы
255
req
внутренний сигнал, оборванный для улучшения читаемости схемы
LOAD/
STORE
UNIT
Core

rst_i
mem_rd_i
clk_i
Instruction
Memory
RA
RD
instr_i
mem_size_o
instr_addr
instr
mem_we_o
mem_req_o
mem_wd_o
mem_addr_o
instr_addr_o
3
stall_i
32
32
core_req_i
core_we_i
core_size_i
core_wd_i
core_addr_i
core_stall_o
core_rd_o
mem_wd_o
32
mem_be_o
mem_we_o
mem_req_o
mem_ready_i
clk_i
mem_addr_o
mem_rd_i
32
Data
Memory
A
WE
RD
clk_i
req
WD
BE

8
/

out [0]
req
[31:24]
{8'd0,[23:0]}
Periph
Device
1
A
WE
RD
clk_i
req
WD
out [1]
req
Periph
Device
255
A
WE
RD
clk_i
req
WD
out [255]
req
OneHot Encoder
in
out

256
/

0
1
32
32
32
32
1'b1
rst_i

rst_i

rst_i

rst_i

rst_i

rst_i

Bluster
clk_i
rst_i

rst_i

instr_wdata_o
instr_addr_o
instr_we_o
data_wdata_o
data_addr_o
data_we_o
tx_o
WE
WA
WD
32
32
32
32
core_reset_o
4
32
32
req
1
0
1
0
1
0
1
0
1
0
4'hf
tx_o
rx_i

rx_i

tx_o
выходной сигнал
\ No newline at end of file diff --git a/Labs/14. Programming device/README.md b/Labs/14. Programming device/README.md index 3ba96bc..8b7abf4 100644 --- a/Labs/14. Programming device/README.md +++ b/Labs/14. Programming device/README.md @@ -258,12 +258,12 @@ module bluster ); enum logic [2:0] { + RCV_NEXT_COMMAND, INIT_MSG, RCV_SIZE, SIZE_ACK, FLASH, FLASH_ACK, - RCV_NEXT_COMMAND, WAIT_TX_DONE, FINISH} 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; -assign send_fin = (msg_counter == 0) && !tx_busy; -assign size_fin = (size_counter == 0) && !rx_busy; -assign flash_fin = (flash_counter == 0) && !rx_busy; -assign next_round = (flash_addr != 0) && !rx_busy; +assign send_fin = (msg_counter == 0) && !tx_busy; +assign size_fin = (size_counter == 0) && !rx_busy; +assign flash_fin = (flash_counter == 0) && !rx_busy; +assign next_round = (flash_addr != '1) && !rx_busy; localparam INIT_MSG_SIZE = 40; localparam FLASH_MSG_SIZE = 57; diff --git a/Labs/14. Programming device/flash.py b/Labs/14. Programming device/flash.py index 3f12b9c..40ff3bb 100644 --- a/Labs/14. Programming device/flash.py +++ b/Labs/14. Programming device/flash.py @@ -5,43 +5,56 @@ parser = argparse.ArgumentParser() 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("-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") 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'' + bytes_map = {} with open(fname, 'r') as fp: for line in fp: if line[0] == '@': - continue - for word in line.split(): - res_bytes += bytes(int(word,base).to_bytes(len(word)//word_size,"little")) - return res_bytes[::-1] + if res_bytes: + assert(start_addr is not None) + bytes_map[start_addr] = 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): - assert(len(mem_name) == 4) +def flash(data: bytes, port: serial.Serial, start_addr: int): - if data: - data_len = len(data) - else: - data_len = 0 + 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") port.write(data_len_bytes) - data_len_ack = port.read(4) - print(int.from_bytes(data_len_ack,"big")) - assert(data_len_ack == data_len_bytes) + data_len_ack_bytes = port.read(4) + data_len_ack = int.from_bytes(data_len_ack_bytes,"big") + 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") 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 data_file = args.data +color_file= args.color tiff_file = args.tiff com = args.comport -instr = parse_file(inst_file) +instr = parse_file(inst_file, start_addr=0) if data_file: data = parse_file(data_file) else: - data = b'' + data = {} + +if color_file: + color = parse_file(color_file) +else: + color = {} if tiff_file: tiff = parse_file(tiff_file, 2, 8) else: - tiff = b'' + tiff = {} ser = serial.Serial( @@ -74,10 +93,8 @@ ser = serial.Serial( timeout=None ) -init_msg = ser.read(6) -print(init_msg.decode("ascii")) -assert(init_msg == b'ready\n') +for ass_arr in [instr, data, color, tiff]: + for addr, bytes_list in ass_arr.items(): + flash(bytes_list, ser, addr) -flash(instr, ser, "inst") -flash(data, ser, "data") -flash(tiff, ser, "tiff") +ser.write(bytes([255]*4)) diff --git a/Labs/14. Programming device/tb_bluster.sv b/Labs/14. Programming device/tb_bluster.sv index e9b6696..cce5050 100644 --- a/Labs/14. Programming device/tb_bluster.sv +++ b/Labs/14. Programming device/tb_bluster.sv @@ -297,7 +297,7 @@ module tb_blaster(); /* RCV_NEXT_COMMAND -*/ flash_addr = 32'h0000_0000; +*/ flash_addr = 32'hFFFF_FFFF; for(int i = MSG_ACK_SIZE-1; i >= 0; i--) begin tx_data = flash_addr[i]; tx_valid = 1'b1;