Bläddra i källkod

Добавил задержку для SpiM Lmx.

Anatoliy Chigirinskiy 6 månader sedan
förälder
incheckning
fabe6180da

+ 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

+ 127 - 16
MergingScript/BinsMerge.py

@@ -6,8 +6,10 @@ GIT_HASH = "e3e4e86fdf3bb66747436c485453fd07"
 GIT_HASH_BIN = bytes.fromhex(GIT_HASH)
 INITIAL_DIR = os.path.dirname(os.path.abspath(__file__))
 
-APP_VER_ADDRESS = 0xFE000
-GOLDEN_ADDRESS = 0x006E000
+APP_VER_ADDRESS = 0x6D000
+GOLDEN_APP_VER_ADDRESS = 0xDE000
+GOLDEN_ADDRESS = 0x0071000
+GOLDEN_APP_VERSION_SHIFTED = GOLDEN_APP_VER_ADDRESS-GOLDEN_ADDRESS
 
 
 def get_git_hash():
@@ -78,7 +80,7 @@ def find_git_repository():
         # Возвращаемся в исходную директорию
         os.chdir(INITIAL_DIR)
 
-def find_golden_tag(tag_pattern):
+def find_tag(tag_pattern):
     # Проверяем текущую директорию. Если не initial_dir, то переходим в нее
     if os.getcwd() != INITIAL_DIR:
         os.chdir(INITIAL_DIR)
@@ -101,17 +103,9 @@ def find_golden_tag(tag_pattern):
     # Получаем последний тег из списка совпадений
     latest_tag = matching_tags[-1]
     print(f"Найден тег: {latest_tag}")
-    # Получаем git tag --short
-    try:
-        git_tag = os.popen(f'git rev-parse --short {latest_tag}').read().strip()
-    except Exception as e:
-        print(f"Ошибка при получении git tag: {e}")
-        git_tag = None
     # Возвращаемся в исходную директорию
     os.chdir(os.path.dirname(INITIAL_DIR))
-    return git_tag
-
-
+    return latest_tag
 
 def merge_bins ():
     #  Пути к файлам
@@ -135,10 +129,24 @@ def merge_bins ():
             shutil.copyfileobj(f2, outfile)
         # Перемещаемся к адресу для пользовательских данных
         outfile.seek(APP_VER_ADDRESS)
-        current_git_tag=get_git_tag()
+        current_git_tag=find_tag("_WORKING")
         print(f"Текущий git tag: {current_git_tag}")
-    
-        outfile.write(current_git_tag.encode('utf-8')+b'\0')
+        # Если полученный тег меньше 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:
@@ -149,9 +157,112 @@ def merge_bins ():
     print(f"Итоговый размер: {final_size} байт")
     return final_size
 
+def merge_working_only():
+    #  Пути к файлам
+    os.chdir(INITIAL_DIR)
+    pwd = os.getcwd()
+    file_path_working = os.path.join(INITIAL_DIR, "SB_TMSG44V1_WORKING_FPGA.bin")
+    file_path_output = os.path.join(INITIAL_DIR, "SB_TMSG44V1_TEST_WORKING_FPGA.bin")
+    #  Размеры файлов
+    file_size_working   = os.path.getsize(file_path_working)
+    #  Размер выходного файла - 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(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)
+    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_working} байт")
+    print(f"Итоговый размер: {final_size} байт")
+    return final_size
+
+def merge_golden_only():
+    #  Пути к файлам
+    os.chdir(INITIAL_DIR)
+    pwd = os.getcwd()
+    file_path_golden = os.path.join(INITIAL_DIR, "SB_TMSG44V1_GOLD_FPGA.bin")
+    file_path_output = os.path.join(INITIAL_DIR, "SB_TMSG44V1_TEST_GOLDEN_FPGA.bin")
+    #  Размеры файлов
+    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_golden, 'rb') as f2:
+            shutil.copyfileobj(f2, outfile)
+        # Перемещаемся к адресу для пользовательских данных
+        outfile.seek(GOLDEN_APP_VERSION_SHIFTED)
+        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"Размер файла: {file_size_golden} байт")
+    print(f"Итоговый размер: {final_size} байт")
+    return final_size
+
+
 def main():
+
+    parser = argparse.ArgumentParser(description='Скрипт для объединения бинарных файлов прошивок')
+    parser.add_argument('--mode', choices=['merge', 'working', 'golden'], 
+                        help='Режим работы: merge - объединить Working и Golden, working - только Working и  Working версию, golden - только Golden и Golden версию',
+                        required=False)
+    
+    args = parser.parse_args()
+    
+    # Если режим не задан через аргумент, запрашиваем у пользователя
+    if args.mode is None:
+        print("Выберите режим работы:")
+        print("1. merge   - объединить Working и Golden прошивки")
+        print("2. working - объединить только Working прошивку с её версией")
+        print("3. golden  - объединить только Golden прошивку с её версией")
+        
+        choice = ""
+        while choice not in ["1", "2", "3", "merge", "working", "golden"]:
+            choice = input("Введите номер (1-3) или название режима: ").strip().lower()
+            if choice == "1":
+                choice = "merge"
+            elif choice == "2":
+                choice = "working"
+            elif choice == "3":
+                choice = "golden"
+        
+        mode = choice
+    else:
+        mode = args.mode
     
-    merge_bins()
+    if mode == 'merge':
+        print("Объединение Working и Golden прошивок...")
+        merge_bins()
+    elif mode == 'working':
+        print("Объединение только Working прошивки с её версией...")
+        merge_working_only()
+    elif mode == 'golden':
+        print("Объединение только Golden прошивки с её версией...")
+        merge_golden_only()
 
 
 

BIN
MergingScript/SB_TMSG44V1_GOLD_FPGA.bin


BIN
MergingScript/SB_TMSG44V1_TEST_MERGE_FPGA.bin


BIN
MergingScript/SB_TMSG44V1_WORKING_FPGA.bin


+ 127 - 36
src/src/SPIm/SpiM.v

@@ -17,7 +17,9 @@
 //
 ////////////////////////////////////////////////////////////////////////////////////////////
 module SpiM #(
-    parameter DATA_WIDTH = 24
+    parameter DATA_WIDTH = 24,
+    parameter CS_DELAY = 3'h0,
+    parameter IS_LMX_DELAY = 0
 )(
     input Clk_i,
     input Rst_i,
@@ -51,61 +53,150 @@ endfunction
 //	REG/WIRE
 //================================================================================
 reg [log2(DATA_WIDTH)-1:0] ssCnt;
+reg [2:0] ssCntDelay;
 reg [DATA_WIDTH-1:0] mosiReg;
 reg	ssReg;
-
 //================================================================================
 //  ASSIGNMENTS
 //================================================================================
 assign Ss_o = ssReg;
-assign Mosi_o = (!ssReg) ? mosiReg[DATA_WIDTH-1] : 1'b0;
-assign Sck_o = (!ssReg) ? Clk_i : 1'b0;
+generate 
+    if (IS_LMX_DELAY) begin 
+        assign Sck_o = (!ssReg && ssCnt < DATA_WIDTH && (ssCntDelay == 0)) ? Clk_i : 1'b0;
+        assign Mosi_o = (!ssReg && ssCnt < DATA_WIDTH && (ssCntDelay == 0)) ? mosiReg[DATA_WIDTH-1] : 1'b0;
+    end
+    else begin 
+        assign Sck_o = (!ssReg) ? Clk_i : 1'b0;
+        assign Mosi_o = (!ssReg) ? mosiReg[DATA_WIDTH-1] : 1'b0;
+    end
+endgenerate
+
 assign Busy_o = !ssReg;
 
 //================================================================================
 //	CODING
 //================================================================================
-always @(negedge Clk_i) begin 
-    if (Rst_i) begin 
-        ssCnt <= 7'h0;
-    end
-    else begin
-        if (!ssReg) begin
-			ssCnt <= ssCnt+1;
-		end else begin
-			ssCnt <= 0;
-		end
-    end
-end
+generate
+    if (IS_LMX_DELAY) begin
+        always @(negedge Clk_i) begin 
+            if (Rst_i) begin 
+                ssCnt <= 7'h0;
+            end
+            else begin 
+                if (!ssReg ) begin 
+                    if (ssCntDelay == 3'h0) begin
+                        ssCnt <= ssCnt + 1;
+                    end
+                end
+                else begin
+                    ssCnt <= 0;
+                end
+            end
+        end
+		
+        always @(negedge Clk_i) begin 
+         	if (Rst_i) begin 
+            	ssCntDelay <= 3'h0;
+         	end
+         	else begin
+            	if (ssReg) begin
+					ssCntDelay <= CS_DELAY;
+				end
+				else begin
+					if (ssCntDelay != 3'h0) begin
+						ssCntDelay <= ssCntDelay - 1;
+					end
+				end
+         	end
+        end
 
-always @(negedge Clk_i) begin 
-    if (Rst_i) begin 
-        mosiReg <= 0;
+        always @(negedge Clk_i) begin 
+            if (Rst_i) begin 
+                mosiReg <= 0;
+            end
+            else begin 
+                if ((!ssReg) && (ssCntDelay == 3'h0)) begin 
+                    mosiReg <= mosiReg << 1;
+                end
+                else begin
+                    if (Val_i) begin
+                        mosiReg <= SpiData_i;
+                    end
+                end
+            end
+        end
     end
-    else begin 
-        if (!ssReg) begin 
-            mosiReg <= mosiReg << 1;
+    else begin
+        always @(negedge Clk_i) begin 
+            if (Rst_i) begin 
+                ssCnt <= 7'h0;
+            end
+            else begin 
+                if (!ssReg ) begin 
+                    ssCnt <= ssCnt + 1;
+                end
+                else begin
+                    ssCnt <= 0;
+                end
+            end
         end
-        else begin
-            if (Val_i) begin
-                mosiReg <= SpiData_i;
+		always @(negedge Clk_i) begin 
+			if (Rst_i) begin 
+				ssCntDelay <= 3'h0;
+			end
+			else begin
+				ssCntDelay <= 3'h0;
+			end
+		end
+        always @(negedge Clk_i) begin 
+            if (Rst_i) begin 
+                mosiReg <= 0;
+            end
+            else begin 
+                if (!ssReg) begin 
+                    mosiReg <= mosiReg << 1;
+                end
+                else begin
+                    if (Val_i) begin
+                        mosiReg <= SpiData_i;
+                    end
+                end
             end
         end
     end
-end
+endgenerate
 
-always @(negedge Clk_i) begin 
-    if (Rst_i) begin 
-        ssReg <= 1'b1;
+generate 
+    if (IS_LMX_DELAY) begin 
+        always @(negedge Clk_i) begin 
+            if (Rst_i) begin 
+                ssReg <= 1'b1;
+            end
+            else begin 
+                if (Val_i) begin
+                    ssReg <= 0;
+                end
+                if (ssCnt == DATA_WIDTH) begin
+                    ssReg <= 1;
+                end
+            end
+        end
     end
     else begin 
-        if (Val_i) begin
-			ssReg <= 0;
-		end
-		if (ssCnt == DATA_WIDTH-1) begin
-			ssReg <= 1;
-		end
+        always @(negedge Clk_i) begin 
+            if (Rst_i) begin 
+                ssReg <= 1'b1;
+            end
+            else begin 
+                if (Val_i) begin
+                    ssReg <= 0;
+                end
+                if (ssCnt == DATA_WIDTH - 1 ) begin
+                    ssReg <= 1;
+                end
+            end
+        end
     end
-end
+endgenerate
 
 endmodule

+ 2 - 2
src/src/Top/TopSbTmsg.v

@@ -245,8 +245,8 @@ assign AnyFlag_o = anyFlag;//Debug-only
 
 assign servInfo	= {BOARD_VER, FIRMWARE_VER};
 
-// assign FpgaLed_o = ledReg;
-assign FpgaLed_o = 1'b1; //Golden-Image
+assign FpgaLed_o = ledReg;
+// assign FpgaLed_o = 1'b1; //Golden-Image
 
 //================================================================================
 //  CODING

+ 44 - 2
src/src/WrapFifoChain/DDSWrapper.v

@@ -60,10 +60,20 @@ reg ssReg;
 reg ddsDirectFlagR;
 reg [2:0] ddsWordNumReg;
 reg [2:0] ddsWordNumRegSync;
+reg [2:0] ddsSyncCnt;
+
+reg plsToggle;
+reg plsToggleSyncA;
+reg plsToggleSyncB;
+reg ssPosEdge;
+wire ssPosEdgeSync;
+wire [63:0] dataFromDdsFifoCut;
 //================================================================================
 //	                                ASSIGNMENTS
 //================================================================================ 
 assign DdsWordNumReg_o = ddsWordNumReg;
+assign ssPosEdgeSync = plsToggleSyncB^plsToggleSyncA;
+assign dataFromDdsFifoCut = dataFromDdsFifo[63:0];
 //==========================================================================//
 //									CODING									//
 //==========================================================================//
@@ -89,6 +99,38 @@ always @(posedge RdClk_i) begin
 	ssReg <= Ss_o;
 end
 
+always @(posedge RdClk_i) begin 
+	if (Rst_i) begin 
+		ssPosEdge <= 1'b0;
+	end
+	else begin 
+		ssPosEdge <= (Ss_o && !ssReg);
+	end
+end
+
+always @(posedge RdClk_i) begin 
+	if (Rst_i) begin 
+		plsToggle <= 1'b0;
+	end
+	else if (ssPosEdge) begin 
+		plsToggle <= ~plsToggle;
+	end
+	else begin 
+		plsToggle <= plsToggle;
+	end
+end
+
+always @(posedge WrClk_i) begin 
+	if (Rst_i) begin 
+		plsToggleSyncA <= 1'b0;
+		plsToggleSyncB <= 1'b0;
+	end
+	else begin 
+		plsToggleSyncA <= plsToggle;
+		plsToggleSyncB <= plsToggleSyncA;
+	end
+end
+
 always @(posedge WrClk_i) begin
 	if (Rst_i) begin 
 		ddsWordNumReg <= 3'h0;
@@ -98,7 +140,7 @@ always @(posedge WrClk_i) begin
 			ddsWordNumReg <= DdsWordNum_i>>2;
 		end
 		else begin 
-			if (Ss_o && !ssR) begin 
+			if (ssPosEdgeSync && (ddsWordNumReg > 0)) begin 
 				ddsWordNumReg <= ddsWordNumReg-1;
 			end
 		end
@@ -134,7 +176,7 @@ always @(posedge RdClk_i) begin
 			end
 		end
 	end
-end 
+end
 
 
 FifoCtrl #(

+ 4 - 2
src/src/WrapFifoChain/LmxWrapper.v

@@ -141,7 +141,7 @@ always @(posedge RdClk_i) begin
 	end
 	else begin
 		if (!LmxDirectFlag_i) begin  
-			if (lmxWordNumReg == 0 ) begin
+			if ((lmxWordNumReg == 0) && (DdsWordNumReg_i == 0)) begin
 				PllVtuneCtrl_o <= 1'b1;
 			end
 			else if ((!DdsCs_i && ssRegDds) && (DdsWordNumReg_i != 0)) begin 
@@ -190,7 +190,9 @@ FifoLMX FifoLMX_inst (
 );
 
 SpiM #(
-	.DATA_WIDTH	(DATA_WIDTH)
+	.DATA_WIDTH	(DATA_WIDTH),
+	.CS_DELAY	(3'h1), 
+	.IS_LMX_DELAY(1'b1)
 )SpiMLmx(
 	.Clk_i		(RdClk_i),
 	.Rst_i		(Rst_i),