2 Ревизии f2c2fabdaa ... 751eb989ee

Автор SHA1 Съобщение Дата
  Anatoliy Chigirinskiy 751eb989ee Добавил скрипт для объединения прошивок преди 11 месеца
  Anatoliy Chigirinskiy adad9e2c79 Добавил возможность прошивки FLASH CP2444v1 преди 11 месеца
променени са 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)