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 MSGFLASHFLASHACKWAITTXDONEFINISHRCVSIZESIZEACKsend_finsize_finsend_finflash_finsend_fin! tx_busysize_fin & next_roundsize_fin &! next_roundRCVNEXTCOMANDrst_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_irst_iвходные сигналы255reqвнутренний сигнал, оборванный для улучшения читаемости схемы—LOAD/STOREUNITCorerst_imem_rd_iclk_iInstructionMemoryRARDinstr_imem_size_oinstr_addrinstrmem_we_omem_req_omem_wd_omem_addr_oinstr_addr_o3stall_i3232core_req_icore_we_icore_size_icore_wd_icore_addr_icore_stall_ocore_rd_omem_wd_o32mem_be_omem_we_omem_req_omem_ready_iclk_imem_addr_omem_rd_i32DataMemoryAWERDclk_ireqWDBE8/out [0]req[31:24]{8'd0,[23:0]}PeriphDevice1AWERDclk_ireqWDout [1]reqPeriphDevice255AWERDclk_ireqWDout [255]reqOneHot Encoderinout256/0132323232—1'b1rst_irst_irst_irst_irst_irst_iBlusterclk_irst_irst_iinstr_wdata_oinstr_addr_oinstr_we_odata_wdata_odata_addr_odata_we_otx_oWEWAWD32323232core_reset_o43232req10101010104'hftx_orx_irx_itx_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;
rst_i
8/
256/
rx_i