Selaa lähdekoodia

Добавил ParityCheck

Anatoliy Chigirinskiy 6 kuukautta sitten
vanhempi
commit
84de0b00cf

+ 42 - 2
MergingScript/BinsMerge.py

@@ -191,6 +191,40 @@ def merge_working_only():
     print(f"Итоговый размер: {final_size} байт")
     return final_size
 
+def merge_test_only():
+    #  Пути к файлам
+    os.chdir(INITIAL_DIR)
+    pwd = os.getcwd()
+    file_path_test = os.path.join(INITIAL_DIR, "SB_TMSG44V1_FPGA_TEST.bin")
+    file_path_output = os.path.join(INITIAL_DIR, "SB_TMSG44V1_TEST_FPGA.bin")
+    #  Размеры файлов
+    file_size_test   = os.path.getsize(file_path_test)
+    #  Размер выходного файла - 8 Мбит
+    file_size_output    = 0x1000000  
+    # Записываем первый файл
+    with open(file_path_output,'wb') as outfile:
+        with open(file_path_test, 'rb') as f1:
+            shutil.copyfileobj(f1, outfile)
+        # Перемещаемся к адресу для пользовательских данных
+        outfile.seek(APP_VER_ADDRESS)
+        test_tag = find_tag("_TEST")
+        print(f"Текущий test git tag: {test_tag}")
+        # Если полученный тег меньше 32 байт, то дополняем его до 32 байт
+        encoded_test_tag = test_tag.encode('utf-8')
+        if len(encoded_test_tag) < 32:
+            encoded_test_tag = encoded_test_tag.ljust(32, b'\x00')
+        # Записываем тег в файл
+        outfile.write(encoded_test_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"Размер файла: {file_size_test} байт")
+    print(f"Итоговый размер: {final_size} байт")
+    return final_size
+
+
 def merge_golden_only():
     #  Пути к файлам
     os.chdir(INITIAL_DIR)
@@ -239,16 +273,19 @@ def main():
         print("1. merge   - объединить Working и Golden прошивки")
         print("2. working - объединить только Working прошивку с её версией")
         print("3. golden  - объединить только Golden прошивку с её версией")
+        print("4. test    - объединить только Test прошивку с её версией")
         
         choice = ""
-        while choice not in ["1", "2", "3", "merge", "working", "golden"]:
-            choice = input("Введите номер (1-3) или название режима: ").strip().lower()
+        while choice not in ["1", "2", "3","4", "merge", "working", "golden","test"]:
+            choice = input("Введите номер (1-4) или название режима: ").strip().lower()
             if choice == "1":
                 choice = "merge"
             elif choice == "2":
                 choice = "working"
             elif choice == "3":
                 choice = "golden"
+            elif choice == "4":
+                choice = "test"
         
         mode = choice
     else:
@@ -263,6 +300,9 @@ def main():
     elif mode == 'golden':
         print("Объединение только Golden прошивки с её версией...")
         merge_golden_only()
+    elif mode == 'test':
+        print("Объединение только Test прошивки с её версией...")
+        merge_test_only()
 
 
 

+ 7 - 4
src/constr/SbTmsg.sdc

@@ -1,15 +1,18 @@
-//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-05-31 16:04:42
+//Tool Version: V1.9.11 (64-bit) 
+//Created Time: 2025-06-04 14:02:12
 create_clock -name clk5 -period 200 -waveform {0 100} [get_nets {clk5}]
 create_clock -name clk60 -period 16.667 -waveform {0 8.334} [get_nets {clk60}]
 create_clock -name Clk_i -period 41.667 -waveform {0 20.834} [get_ports {Clk_i}]
 create_clock -name Sck_i -period 10 -waveform {0 5} [get_ports {Sck_i}]
-//create_clock -name clk100 -period 10 -waveform {0 5} [get_nets {gclk100}]
+create_clock -name clk50 -period 20 -waveform {0 10} [get_nets {clk50}]
 set_clock_groups -asynchronous -group [get_clocks {Clk_i}] -group [get_clocks {Sck_i}]
 set_false_path -from [get_clocks {Sck_i}] -to [get_clocks {Clk_i}] 
 set_false_path -from [get_clocks {Sck_i}] -to [get_clocks {Sck_i}] 
 set_false_path -from [get_clocks {Sck_i}] -to [get_clocks {clk60}] 
 set_false_path -from [get_clocks {clk60}] -to [get_clocks {Sck_i}] 
+set_false_path -from [get_regs {InitRst/signal_o_s1}] 
+report_timing -setup -from_clock [get_clocks {clk50}] -to_clock [get_clocks {clk50}]
+report_timing -setup -from_clock [get_clocks {clk60}] -to_clock [get_clocks {clk60}]

+ 34 - 1
src/src/FifoCtrl/FifoCtrl.v

@@ -17,6 +17,7 @@
 //
 ////////////////////////////////////////////////////////////////////////////////////////////
 module FifoCtrl #(
+    parameter PARITY_CHECK = 0, // 1 - parity check enabled, 0 - disabled
     parameter IN_WIDTH = 24,
     parameter WR_NUM = 1,
     parameter OUT_WIDTH = 24
@@ -46,7 +47,9 @@ localparam DATA_WIDTH = WR_NUM*IN_WIDTH;
 //================================================================================
 reg [DATA_WIDTH-1:0] dataReg;
 reg [1:0]  wrCnt;
-
+reg [9:0] parityErrors;      // Ошибки чётности для каждого байта
+wire [9:0] byteParityBits;   // Вычисленные биты чётности
+reg [9:0] storedParityBits;  // Сохранённые биты чётности
 //================================================================================
 //  ASSIGNMENTS
 //================================================================================
@@ -55,6 +58,36 @@ assign Data_o = dataReg[OUT_WIDTH-1:0];
 //================================================================================
 //	CODING
 //================================================================================
+generate
+    if (PARITY_CHECK) begin
+    /* Parity check for each byte */
+        assign byteParityBits[0] = ^dataReg[7:0];
+        assign byteParityBits[1] = ^dataReg[15:8];
+        assign byteParityBits[2] = ^dataReg[23:16];
+        assign byteParityBits[3] = ^dataReg[31:24];
+        assign byteParityBits[4] = ^dataReg[39:32];
+        assign byteParityBits[5] = ^dataReg[47:40];
+        assign byteParityBits[6] = ^dataReg[55:48];
+        assign byteParityBits[7] = ^dataReg[63:56];
+        assign byteParityBits[8] = ^dataReg[71:64];
+        assign byteParityBits[9] = ^dataReg[79:72];
+
+        always @(posedge WrClk_i) begin 
+               if (Rst_i) begin 
+                   parityErrors <= 0;
+                    storedParityBits <= 0;
+               end
+               else begin 
+                   if (WriteEn_o) begin
+                       parityErrors <= (dataReg[95:86] ^ byteParityBits);
+                       storedParityBits <= dataReg[95:86];
+                   end
+               end
+        end
+    end
+endgenerate
+        
+
 always @(posedge WrClk_i) begin 
     if (Rst_i) begin 
         wrCnt <= 0;

+ 1 - 0
src/src/WrapFifoChain/DDSWrapper.v

@@ -180,6 +180,7 @@ end
 
 
 FifoCtrl #(
+	.PARITY_CHECK	(1),
 	.IN_WIDTH		(IN_WIDTH),
 	.WR_NUM			(WR_NUM),
 	.OUT_WIDTH		(OUT_WIDTH)