2 커밋 f2c2fabdaa ... 751eb989ee

작성자 SHA1 메시지 날짜
  Anatoliy Chigirinskiy 751eb989ee Добавил скрипт для объединения прошивок 6 달 전
  Anatoliy Chigirinskiy adad9e2c79 Добавил возможность прошивки FLASH CP2444v1 6 달 전
6개의 변경된 파일289개의 추가작업 그리고 41개의 파일을 삭제
  1. 34 0
      .gitignore
  2. 166 0
      MergingScript/BinsMerge.py
  3. 10 10
      src/constr/BochV3.cst
  4. 4 3
      src/constr/BochV3.sdc
  5. 12 2
      src/src/PacketAnalyzer1Mosi/PacketAnalyzer1Mosi.v
  6. 63 26
      src/src/Top/TopBochV3.v

+ 34 - 0
.gitignore

@@ -0,0 +1,34 @@
+
+#Ignore thumbnails created by Windows
+Thumbs.db
+#Ignore files built by Visual Studio
+*.obj
+*.exe
+*.pdb
+*.user
+*.aps
+*.pch
+*.vspscc
+*_i.c
+*_p.c
+*.ncb
+*.suo
+*.tlb
+*.tlh
+*.bak
+*.cache
+*.ilk
+*.log
+[Bb]in
+[Dd]ebug*/
+*.lib
+*.sbr
+obj/
+[Rr]elease*/
+_ReSharper*/
+[Tt]est[Rr]esult*
+.vs/
+.idea/
+#Nuget packages folder
+packages/
+*.bin

+ 166 - 0
MergingScript/BinsMerge.py

@@ -0,0 +1,166 @@
+import os
+import argparse
+import shutil
+
+GIT_HASH = "e3e4e86fdf3bb66747436c485453fd07"
+GIT_HASH_BIN = bytes.fromhex(GIT_HASH)
+INITIAL_DIR = os.path.dirname(os.path.abspath(__file__))
+
+APP_VER_ADDRESS = 0x6D000
+GOLDEN_APP_VER_ADDRESS = 0xDE000
+GOLDEN_ADDRESS = 0x0071000
+
+
+def get_git_hash():
+    # Проверяем текущую директорию. Если не initial_dir, то переходим в нее
+    print(f"Текущая директория: {os.getcwd()}")
+    print(f"Исходная директория: {INITIAL_DIR}")
+    if os.getcwd() != INITIAL_DIR:
+        os.chdir(INITIAL_DIR)
+    # Переходим в директорию с git репозиторием
+    git_dir = find_git_repository()
+    if git_dir is None:
+        print("Не удалось найти git репозиторий.")
+        return None
+    os.chdir(git_dir)
+    # Получаем git hash --short
+    try:
+        git_hash = os.popen('git rev-parse --short HEAD').read().strip()
+    except Exception as e:
+        print(f"Ошибка при получении git hash: {e}")
+        git_hash = None
+    # Возвращаемся в исходную директорию
+    os.chdir(os.path.dirname(INITIAL_DIR))
+    return git_hash
+
+def get_git_tag():
+      # Проверяем текущую директорию. Если не initial_dir, то переходим в нее
+    if os.getcwd() != INITIAL_DIR:
+        os.chdir(INITIAL_DIR)
+    # Переходим в директорию с git репозиторием
+    git_dir = find_git_repository()
+    if git_dir is None:
+        print("Не удалось найти git репозиторий.")
+        return None
+    os.chdir(git_dir)
+    # Получаем git tag
+    try:
+        git_tag = os.popen('git describe --tags').read().strip()
+    except Exception as e:
+        print(f"Ошибка при получении git tag: {e}")
+        git_tag = None
+    # Возвращаемся в исходную директорию
+    os.chdir(os.path.dirname(INITIAL_DIR))
+    return git_tag
+
+def find_git_repository():
+    current_dir = INITIAL_DIR
+    
+    try:
+        # Выходим выше по дереву каталогов, пока не найдем .git
+        while True:
+            if os.path.isdir(os.path.join(current_dir, '.git')):
+                git_dir = os.path.abspath(os.path.join(current_dir, '.git'))
+                print(f"Найден git репозиторий: {git_dir}")
+                return git_dir
+                
+            parent_dir = os.path.dirname(current_dir)
+            if parent_dir == current_dir:  # Достигли корня файловой системы
+                print("Не удалось найти git репозиторий.")
+                return None
+                
+            current_dir = parent_dir
+            print(f"Проверяем директорию: {current_dir}")
+            
+    except Exception as e:
+        print(f"Ошибка при поиске git репозитория: {e}")
+        return None
+    finally:
+        # Возвращаемся в исходную директорию
+        os.chdir(INITIAL_DIR)
+
+def find_tag(tag_pattern):
+    # Проверяем текущую директорию. Если не initial_dir, то переходим в нее
+    if os.getcwd() != INITIAL_DIR:
+        os.chdir(INITIAL_DIR)
+    # Переходим в директорию с git репозиторием
+    git_dir = find_git_repository()
+    if git_dir is None:
+        print("Не удалось найти git репозиторий.")
+        return None
+    os.chdir(git_dir)
+    # Получаем все теги в git репозитории
+    all_tags = os.popen('git tag').read().strip().split('\n')
+    if not all_tags:
+        print("Не найдено ни одного тега в git репозитории.")
+        return None
+    # Фильтруем теги по заданному шаблону
+    matching_tags = [tag for tag in all_tags if tag_pattern in tag]
+    if not matching_tags:
+        print(f"Не найдено тегов, соответствующих шаблону: {tag_pattern}")
+        return None
+    # Получаем последний тег из списка совпадений
+    latest_tag = matching_tags[-1]
+    print(f"Найден тег: {latest_tag}")
+    # Возвращаемся в исходную директорию
+    os.chdir(os.path.dirname(INITIAL_DIR))
+    return latest_tag
+
+def merge_bins ():
+    #  Пути к файлам
+    os.chdir(INITIAL_DIR)
+    pwd = os.getcwd()
+    file_path_working = os.path.join(INITIAL_DIR, "SB_TMSG44V1_WORKING_FPGA.bin")
+    file_path_golden = os.path.join(INITIAL_DIR, "SB_TMSG44V1_GOLD_FPGA.bin")
+    file_path_output = os.path.join(INITIAL_DIR, "SB_TMSG44V1_TEST_MERGE_FPGA.bin")
+    #  Размеры файлов
+    file_size_working   = os.path.getsize(file_path_working)
+    file_size_golden    = os.path.getsize(file_path_golden)
+    #  Размер выходного файла - 8 Мбит
+    file_size_output    = 0x1000000  
+    # Записываем первый файл
+    with open(file_path_output,'wb') as outfile:
+        with open(file_path_working, 'rb') as f1:
+            shutil.copyfileobj(f1, outfile)
+        # Перемещаемся к адресу для второго файла
+        outfile.seek(GOLDEN_ADDRESS)
+        with open(file_path_golden, 'rb') as f2:
+            shutil.copyfileobj(f2, outfile)
+        # Перемещаемся к адресу для пользовательских данных
+        outfile.seek(APP_VER_ADDRESS)
+        current_git_tag=find_tag("_WORKING")
+        print(f"Текущий git tag: {current_git_tag}")
+        # Если полученный тег меньше 32 байт, то дополняем его до 32 байт
+        encoded_git_tag = current_git_tag.encode('utf-8')
+        if len(encoded_git_tag) < 32:
+            encoded_git_tag = encoded_git_tag.ljust(32, b'\x00')
+
+        # Записываем тег в файл
+        outfile.write(encoded_git_tag)
+        # Перемещаемся к адресу для GOLDEN данных
+        outfile.seek(GOLDEN_APP_VER_ADDRESS)
+        golden_tag = find_tag("_GOLDEN")
+        print(f"Текущий golden git tag: {golden_tag}")
+        # Если полученный тег меньше 32 байт, то дополняем его до 32 байт
+        encoded_golden_tag = golden_tag.encode('utf-8')
+        if len(encoded_golden_tag) < 32:
+            encoded_golden_tag = encoded_golden_tag.ljust(32, b'\x00')
+        outfile.write(encoded_golden_tag)
+    final_size = os.path.getsize(file_path_output)
+    # Проверка итогового размера
+    if final_size > file_size_output:
+        os.remove(file_path_output)  # Удаляем некорректный файл
+        raise ValueError(f"Итоговый размер файла ({final_size} байт) превысил максимально допустимый ({file_size_output} байт)")
+    print(f"Размер файла 1: {file_size_working} байт")
+    print(f"Размер файла 2: {file_size_golden} байт")
+    print(f"Итоговый размер: {final_size} байт")
+    return final_size
+
+def main():
+        
+    merge_bins()
+
+
+
+if __name__ == '__main__':
+    main()

+ 10 - 10
src/constr/BochV3.cst

@@ -1,11 +1,11 @@
 //Copyright (C)2014-2024 Gowin Semiconductor Corporation.
 //All rights reserved. 
 //File Title: Physical Constraints file
-//Tool Version: V1.9.9.03 (64-bit)
+//Tool Version: V1.9.11 (64-bit)
 //Part Number: GW1N-UV9QN88C6/I5
 //Device: GW1N-9
 //Device Version: C
-//Created Time: Mon 12 02 11:08:54 2024
+//Created Time: Mon 05 19 14:27:08 2025
 
 IO_LOC "Led_o" 18;
 IO_PORT "Led_o" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
@@ -27,8 +27,6 @@ IO_LOC "CtrlCp2444v1Mosi3_o" 29;
 IO_PORT "CtrlCp2444v1Mosi3_o" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
 IO_LOC "CtrlCp2444v1Mosi2_o" 30;
 IO_PORT "CtrlCp2444v1Mosi2_o" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
-IO_LOC "CtrlCp2444v1Mosi1_o" 31;
-IO_PORT "CtrlCp2444v1Mosi1_o" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
 IO_LOC "CtrlCp2444v1Mosi0_o" 32;
 IO_PORT "CtrlCp2444v1Mosi0_o" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
 IO_LOC "LmkBSck_o" 76;
@@ -43,12 +41,14 @@ IO_LOC "LmkACs_o" 49;
 IO_PORT "LmkACs_o" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
 IO_LOC "LmkAMosi_o" 51;
 IO_PORT "LmkAMosi_o" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
+IO_LOC "CtrlCp2444v1Mosi1_io" 31;
+IO_PORT "CtrlCp2444v1Mosi1_io" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
+IO_LOC "Mosi1_io" 81;
+IO_PORT "Mosi1_io" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
 IO_LOC "Mosi3_i" 83;
 IO_PORT "Mosi3_i" IO_TYPE=LVCMOS33 PULL_MODE=UP BANK_VCCIO=3.3;
 IO_LOC "Mosi2_i" 82;
 IO_PORT "Mosi2_i" IO_TYPE=LVCMOS33 PULL_MODE=UP BANK_VCCIO=3.3;
-IO_LOC "Mosi1_io" 81;
-IO_PORT "Mosi1_io" IO_TYPE=LVCMOS33 PULL_MODE=UP BANK_VCCIO=3.3;
 IO_LOC "Mosi0_i" 80;
 IO_PORT "Mosi0_i" IO_TYPE=LVCMOS33 PULL_MODE=UP BANK_VCCIO=3.3;
 IO_LOC "SsFlash_i" 15;
@@ -59,11 +59,11 @@ IO_LOC "Sck_i" 13;
 IO_PORT "Sck_i" IO_TYPE=LVCMOS33 PULL_MODE=UP BANK_VCCIO=3.3;
 IO_LOC "Rst_i" 16;
 IO_PORT "Rst_i" IO_TYPE=LVCMOS33 PULL_MODE=UP BANK_VCCIO=3.3;
-IO_LOC "LmkBMiso_i" 74;
-IO_PORT "LmkBMiso_i" IO_TYPE=LVCMOS33 PULL_MODE=UP BANK_VCCIO=3.3;
-IO_LOC "TfeMiso_i" 40;
-IO_PORT "TfeMiso_i" IO_TYPE=LVCMOS33 PULL_MODE=UP BANK_VCCIO=3.3;
 IO_LOC "CtrlCp2444v1Ld_i" 33;
 IO_PORT "CtrlCp2444v1Ld_i" IO_TYPE=LVCMOS33 PULL_MODE=UP BANK_VCCIO=3.3;
+IO_LOC "TfeMiso_i" 40;
+IO_PORT "TfeMiso_i" IO_TYPE=LVCMOS33 PULL_MODE=UP BANK_VCCIO=3.3;
+IO_LOC "LmkBMiso_i" 74;
+IO_PORT "LmkBMiso_i" IO_TYPE=LVCMOS33 PULL_MODE=UP BANK_VCCIO=3.3;
 IO_LOC "LmkAMiso_i" 48;
 IO_PORT "LmkAMiso_i" IO_TYPE=LVCMOS33 PULL_MODE=UP BANK_VCCIO=3.3;

+ 4 - 3
src/constr/BochV3.sdc

@@ -1,11 +1,12 @@
-//Copyright (C)2014-2024 GOWIN Semiconductor Corporation.
+//Copyright (C)2014-2025 GOWIN Semiconductor Corporation.
 //All rights reserved.
 //File Title: Timing Constraints file
-//Tool Version: V1.9.9.03 (64-bit) 
-//Created Time: 2024-12-27 15:01:39
+//Tool Version: V1.9.11 (64-bit) 
+//Created Time: 2025-05-19 11:54:13
 create_clock -name clk25 -period 40 -waveform {0 20} [get_nets {clk25}]
 create_clock -name Sck_i -period 10 -waveform {0 8.334} [get_ports {Sck_i}]
 create_clock -name clk60 -period 16.667 -waveform {0 8.334} [get_nets {clk60}]
 create_clock -name clk40 -period 25 -waveform {0 12.5} [get_nets {clk40}]
 set_clock_groups -asynchronous -group [get_clocks {Sck_i}] -group [get_clocks {clk60 clk40 clk25}]
 report_timing -setup -to_clock [get_clocks {clk60}] -max_paths 25 -max_common_paths 1
+report_timing -setup -from_clock [get_clocks {clk60}] -to_clock [get_clocks {clk60}] -max_paths 25 -max_common_paths 1

+ 12 - 2
src/src/PacketAnalyzer1Mosi/PacketAnalyzer1Mosi.v

@@ -36,8 +36,10 @@ module PacketAnalyzer1Mosi (
 	output reg FlagDirectLmkA_o,
 	output reg FlagDirectLmkB_o,
 	output reg FlagDirectCtrlColdPart_o,
+	output reg FlagDirectCtrlColdPartMirrored_o,
 	output reg FlagDirectHubTfe_o,
 	output reg FlagDirectFlash_o,
+	output reg FlagDirectFlashMirrored_o,
 
 	output reg Busy_o
 );
@@ -61,6 +63,9 @@ localparam DEV_ID_CTRL_COLD_PART 			= 5'd2;
 localparam DEV_ID_HUB_TFE 					= 5'd3;
 localparam DEV_ID_FLASH 					= 5'd4;
 
+localparam DEV_ID_CTRL_COLD_PART_MIRRORED 	= 5'd30;
+localparam DEV_ID_FLASH_MIRRORED 			= 5'd31;
+
 //==========================================
 // Assignments
 //==========================================
@@ -117,8 +122,11 @@ always @(posedge Clk_i) begin
 			DEV_ID_FLASH : begin
 				FlagDirectFlash_o <= 1'b1;
 			end
-			default : begin
-
+			DEV_ID_CTRL_COLD_PART_MIRRORED : begin
+				FlagDirectCtrlColdPartMirrored_o <= 1'b1;
+			end
+			DEV_ID_FLASH_MIRRORED : begin
+				FlagDirectFlashMirrored_o <= 1'b1;
 			end
 		endcase
 	end
@@ -126,8 +134,10 @@ always @(posedge Clk_i) begin
 		FlagDirectLmkA_o 	<= 1'b0;
 		FlagDirectLmkB_o 	<= 1'b0;
 		FlagDirectCtrlColdPart_o <= 1'b0;
+		FlagDirectCtrlColdPartMirrored_o <= 1'b0;
 		FlagDirectHubTfe_o <= 1'b0;
 		FlagDirectFlash_o 	<= 1'b0;
+		FlagDirectFlashMirrored_o <= 1'b0;
 	end
 end
 

+ 63 - 26
src/src/Top/TopBochV3.v

@@ -10,35 +10,35 @@ input Ss_i,
 input SsFlash_i,
 
 input Mosi0_i,
-input Mosi1_io,
+inout Mosi1_io,
 input Mosi2_i,
 input Mosi3_i,
 
 /* LMK_A */
-output reg  LmkAMosi_o,
-output reg  LmkACs_o,
-output reg  LmkASck_o,
-input       LmkAMiso_i,
+output reg  	LmkAMosi_o,
+output reg  	LmkACs_o,
+output reg  	LmkASck_o,
+input       	LmkAMiso_i,
 /* LMK_B */
-output  reg LmkBMosi_o,
-output  reg LmkBCs_o,
-output  reg LmkBSck_o,
-input       LmkBMiso_i,
+output  reg 	LmkBMosi_o,
+output  reg 	LmkBCs_o,
+output  reg 	LmkBSck_o,
+input       	LmkBMiso_i,
 /*  CtrlCp2444v1  */
-output  reg    CtrlCp2444v1Mosi0_o,
-output      CtrlCp2444v1Mosi1_o,
-output      CtrlCp2444v1Mosi2_o,
-output      CtrlCp2444v1Mosi3_o,
-output  reg    CtrlCp2444v1Cs_o,
-output  reg    CtrlCp2444v1CsFlash_o,
-output  reg    CtrlCp2444v1Sck_o,
-output      CtrlCp2444v1Rst_o,
-input       CtrlCp2444v1Ld_i,
+output  reg     CtrlCp2444v1Mosi0_o,
+inout           CtrlCp2444v1Mosi1_io,
+output          CtrlCp2444v1Mosi2_o,
+output          CtrlCp2444v1Mosi3_o,
+output  reg     CtrlCp2444v1Cs_o,
+output  reg     CtrlCp2444v1CsFlash_o,
+output  reg     CtrlCp2444v1Sck_o,
+output          CtrlCp2444v1Rst_o,
+input           CtrlCp2444v1Ld_i,
 /*  HUB-1854  */
-output reg TfeClk_o,
-output reg TfeMosi_o,
-output reg TfeCs_o,
-input      TfeMiso_i,
+output reg      TfeClk_o,
+output reg 		TfeMosi_o,
+output reg 		TfeCs_o,
+input      		TfeMiso_i,
 
 /* Led */
 output Led_o
@@ -59,8 +59,12 @@ wire spiDataVal;
 wire flagDirectLmkA;
 wire flagDirectLmkB;
 wire flagDirectCtrlColdPart;
+wire flagDirectCtrlColdPartMirrored;
+wire flagDirectColdPartMuxed;
 wire flagDirectHubTfe;
 wire flagDirectFlash;
+wire flagDirectFlashMirrored;
+wire flagDirectFlashMuxed;
 /* PacketAnalyzer4Mosi Flags */
 wire valCtrlColdPartDataToFifo;
 wire valTfe2BytesDataToFifo;
@@ -75,6 +79,9 @@ wire clk210;
 /* InitRst */
 wire initRst;
 
+/* misoReg */
+reg misoReg;
+
 /* Busy wires */
 wire busyMosi1;
 wire busyMosi4;
@@ -120,6 +127,7 @@ reg ledReg;
 wire ctrlCp2444v1Cs;
 wire ctrlCp2444v1Sck;
 wire ctrlCp2444v1Mosi;
+wire ctrlCp2444v1Mosi1;
 //***********************************************
 //	                ASSIGNMENTS
 //***********************************************
@@ -130,6 +138,15 @@ assign busyForTfe4Bytes = tfe2BytesSpiBusy | tfe6BytesSpiBusy | tfe7BytesSpiBusy
 assign busyForTfe6Bytes = tfe2BytesSpiBusy | tfe4BytesSpiBusy | tfe7BytesSpiBusy; 
 assign busyForTfe7Bytes = tfe2BytesSpiBusy | tfe4BytesSpiBusy | tfe6BytesSpiBusy | (!tfe6BytesFifoEmpty) | (!tfe4BytesFifoEmpty);
 assign Led_o = ledReg;
+// assign Led_o = 1'b1; //Golden Image
+
+assign flagDirectColdPartMuxed = flagDirectCtrlColdPart | flagDirectCtrlColdPartMirrored;
+assign flagDirectFlashMuxed = flagDirectFlash | flagDirectFlashMirrored;
+
+/* CtrlCp2444Mosi1_io */
+assign CtrlCp2444v1Mosi1_io = (flagDirectFlashMuxed) ? 1'bz : ctrlCp2444v1Mosi1;
+/* Mosi1_io */
+assign Mosi1_io = misoReg;
 
 //***********************************************
 //	                CODING
@@ -151,6 +168,21 @@ always @(posedge clk25) begin
     end
 end
 
+/* misoReg */
+always @(*) begin
+    if (Rst_i) begin 
+        misoReg = 1'b0;
+    end
+    else begin 
+        if (flagDirectFlashMuxed) begin 
+            misoReg = CtrlCp2444v1Mosi1_io; 
+		end
+		else begin 
+			misoReg = 1'bz;
+		end
+	end
+end
+
 /* MUX SpiM devices */
 always @(*) begin 
     if (flagDirectLmkA) begin   // LMK_A
@@ -173,7 +205,7 @@ always @(*) begin
         LmkBCs_o = 1'b1;
         LmkBSck_o = 1'b0;
     end
-    if (flagDirectCtrlColdPart) begin
+    if (flagDirectColdPartMuxed) begin
         CtrlCp2444v1Cs_o = Ss_i;
         CtrlCp2444v1Sck_o = Sck_i;
         CtrlCp2444v1Mosi0_o = Mosi0_i;
@@ -215,8 +247,11 @@ always @(*) begin
             TfeCs_o = 1'b1;
         end
     end
-    if (flagDirectFlash) begin // Flash
-        CtrlCp2444v1CsFlash_o = SsFlash_i;
+    if (flagDirectFlashMuxed) begin // Flash
+		CtrlCp2444v1Sck_o = Sck_i;
+		CtrlCp2444v1Mosi0_o = Mosi0_i;
+		CtrlCp2444v1Cs_o = 1'b1;
+        CtrlCp2444v1CsFlash_o = Ss_i;
     end
     else begin 
         CtrlCp2444v1CsFlash_o = 1'b1;
@@ -278,8 +313,10 @@ PacketAnalyzer1Mosi	PacketAnalyzer1Mosi
 	.FlagDirectLmkA_o		        (flagDirectLmkA),
     .FlagDirectLmkB_o		        (flagDirectLmkB),
     .FlagDirectCtrlColdPart_o	    (flagDirectCtrlColdPart),
+    .FlagDirectCtrlColdPartMirrored_o (flagDirectCtrlColdPartMirrored),
     .FlagDirectHubTfe_o		        (flagDirectHubTfe),
     .FlagDirectFlash_o		        (flagDirectFlash),
+    .FlagDirectFlashMirrored_o	    (flagDirectFlashMirrored),
 	
 	.Busy_o					        (busyMosi1)
 );
@@ -317,7 +354,7 @@ CtrlCp2444Wrapper #(
     .Ss_o                           (ctrlCp2444v1Cs),
     .Sck_o                          (ctrlCp2444v1Sck),
     .Mosi0_o                        (ctrlCp2444v1Mosi),
-    .Mosi1_o                        (CtrlCp2444v1Mosi1_o),
+    .Mosi1_o                        (ctrlCp2444v1Mosi1),
     .Mosi2_o                        (CtrlCp2444v1Mosi2_o),
     .Mosi3_o                        (CtrlCp2444v1Mosi3_o)