Prechádzať zdrojové kódy

Merge branch 'dev' into Anatoliy/feature_SPIm

Anatoliy Chigirinskiy 1 rok pred
rodič
commit
20b8cc0540

+ 133 - 0
src/constr/RF_FPGA.cst

@@ -0,0 +1,133 @@
+//Copyright (C)2014-2024 Gowin Semiconductor Corporation.
+//All rights reserved. 
+//File Title: Physical Constraints file
+//Tool Version: V1.9.9.01 (64-bit)
+//Part Number: GW1N-LV9PG256C6/I5
+//Device: GW1N-9
+//Created Time: Fri 04 12 11:25:42 2024
+
+IO_LOC "GPIO_o[21]" E1;
+IO_PORT "GPIO_o[21]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
+IO_LOC "GPIO_o[20]" C16;
+IO_PORT "GPIO_o[20]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
+IO_LOC "GPIO_o[19]" D15;
+IO_PORT "GPIO_o[19]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
+IO_LOC "GPIO_o[18]" P1;
+IO_PORT "GPIO_o[18]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
+IO_LOC "GPIO_o[17]" D1;
+IO_PORT "GPIO_o[17]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
+IO_LOC "GPIO_o[16]" R1;
+IO_PORT "GPIO_o[16]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
+IO_LOC "GPIO_o[15]" L1;
+IO_PORT "GPIO_o[15]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
+IO_LOC "GPIO_o[14]" K2;
+IO_PORT "GPIO_o[14]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
+IO_LOC "GPIO_o[13]" K1;
+IO_PORT "GPIO_o[13]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
+IO_LOC "GPIO_o[12]" L2;
+IO_PORT "GPIO_o[12]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
+IO_LOC "GPIO_o[11]" A2;
+IO_PORT "GPIO_o[11]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
+IO_LOC "GPIO_o[10]" A11;
+IO_PORT "GPIO_o[10]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
+IO_LOC "GPIO_o[9]" A14;
+IO_PORT "GPIO_o[9]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
+IO_LOC "GPIO_o[8]" A12;
+IO_PORT "GPIO_o[8]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
+IO_LOC "GPIO_o[7]" A10;
+IO_PORT "GPIO_o[7]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
+IO_LOC "GPIO_o[6]" A13;
+IO_PORT "GPIO_o[6]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
+IO_LOC "GPIO_o[5]" R6;
+IO_PORT "GPIO_o[5]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
+IO_LOC "GPIO_o[4]" T5;
+IO_PORT "GPIO_o[4]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
+IO_LOC "GPIO_o[3]" T6;
+IO_PORT "GPIO_o[3]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
+IO_LOC "GPIO_o[2]" J16;
+IO_PORT "GPIO_o[2]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
+IO_LOC "GPIO_o[1]" H16;
+IO_PORT "GPIO_o[1]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
+IO_LOC "GPIO_o[0]" G16;
+IO_PORT "GPIO_o[0]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
+IO_PORT "RstInit_o" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
+IO_PORT "Locked_o" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
+IO_PORT "Mosi0_o[7]" IO_TYPE=LVCMOS33;
+IO_LOC "Mosi0_o[6]" C1;
+IO_PORT "Mosi0_o[6]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
+IO_LOC "Mosi0_o[5]" F16;
+IO_PORT "Mosi0_o[5]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
+IO_LOC "Mosi0_o[4]" C7;
+IO_PORT "Mosi0_o[4]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
+IO_LOC "Mosi0_o[3]" B3;
+IO_PORT "Mosi0_o[3]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
+IO_LOC "Mosi0_o[2]" B5;
+IO_PORT "Mosi0_o[2]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
+IO_LOC "Mosi0_o[1]" R3;
+IO_PORT "Mosi0_o[1]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
+IO_LOC "Mosi0_o[0]" G1;
+IO_PORT "Mosi0_o[0]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
+IO_PORT "Sck_o[7]" IO_TYPE=LVCMOS33;
+IO_LOC "Sck_o[6]" C2;
+IO_PORT "Sck_o[6]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
+IO_LOC "Sck_o[5]" E16;
+IO_PORT "Sck_o[5]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
+IO_LOC "Sck_o[4]" B7;
+IO_PORT "Sck_o[4]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
+IO_LOC "Sck_o[3]" A3;
+IO_PORT "Sck_o[3]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
+IO_LOC "Sck_o[2]" A5;
+IO_PORT "Sck_o[2]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
+IO_LOC "Sck_o[1]" T2;
+IO_PORT "Sck_o[1]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
+IO_LOC "Sck_o[0]" G2;
+IO_PORT "Sck_o[0]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
+IO_PORT "Ss_o[7]" IO_TYPE=LVCMOS33;
+IO_LOC "Ss_o[6]" D2;
+IO_PORT "Ss_o[6]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
+IO_LOC "Ss_o[5]" F15;
+IO_PORT "Ss_o[5]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
+IO_LOC "Ss_o[4]" C8;
+IO_PORT "Ss_o[4]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
+IO_LOC "Ss_o[3]" B4;
+IO_PORT "Ss_o[3]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
+IO_LOC "Ss_o[2]" A4;
+IO_PORT "Ss_o[2]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
+IO_LOC "Ss_o[1]" R4;
+IO_PORT "Ss_o[1]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
+IO_LOC "Ss_o[0]" F1;
+IO_PORT "Ss_o[0]" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
+IO_PORT "Clk50_o" IO_TYPE=LVCMOS33;
+IO_PORT "Clk100_o" IO_TYPE=LVCMOS33;
+IO_PORT "Clk600_o" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
+IO_PORT "Clk5_o" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
+IO_PORT "Clk20_o" IO_TYPE=LVCMOS33;
+IO_PORT "Clk30_o" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
+IO_PORT "Clk40_o" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
+IO_PORT "Clk75_o" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
+IO_LOC "I2CSck_o" K16;
+IO_PORT "I2CSck_o" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
+IO_LOC "I2CSda_io" L16;
+IO_PORT "I2CSda_io" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
+IO_LOC "Mosi1_io" T12;
+IO_PORT "Mosi1_io" IO_TYPE=LVCMOS33 PULL_MODE=UP DRIVE=8 BANK_VCCIO=3.3;
+IO_LOC "MisoMax2870_i" B1;
+IO_PORT "MisoMax2870_i" IO_TYPE=LVCMOS33 PULL_MODE=UP BANK_VCCIO=3.3;
+IO_LOC "Miso2_i" T3;
+IO_PORT "Miso2_i" IO_TYPE=LVCMOS33 PULL_MODE=UP BANK_VCCIO=3.3;
+IO_LOC "Miso1_i" F2;
+IO_PORT "Miso1_i" IO_TYPE=LVCMOS33 PULL_MODE=UP BANK_VCCIO=3.3;
+IO_LOC "Ss_i" T9;
+IO_PORT "Ss_i" IO_TYPE=LVCMOS33 PULL_MODE=UP BANK_VCCIO=3.3;
+IO_LOC "Sck_i" T13;
+IO_PORT "Sck_i" IO_TYPE=LVCMOS33 PULL_MODE=UP BANK_VCCIO=3.3;
+IO_LOC "Mosi3_i" T15;
+IO_PORT "Mosi3_i" IO_TYPE=LVCMOS33 PULL_MODE=UP BANK_VCCIO=3.3;
+IO_LOC "Mosi2_i" T14;
+IO_PORT "Mosi2_i" IO_TYPE=LVCMOS33 PULL_MODE=UP BANK_VCCIO=3.3;
+IO_LOC "Mosi0_i" R12;
+IO_PORT "Mosi0_i" IO_TYPE=LVCMOS33 PULL_MODE=UP BANK_VCCIO=3.3;
+IO_LOC "Rst_i" R9;
+IO_PORT "Rst_i" IO_TYPE=LVCMOS33 PULL_MODE=UP BANK_VCCIO=3.3;
+IO_LOC "Clk_i" H11;
+IO_PORT "Clk_i" IO_TYPE=LVCMOS33 PULL_MODE=UP BANK_VCCIO=3.3;

+ 21 - 0
src/constr/RF_FPGA.sdc

@@ -0,0 +1,21 @@
+//Copyright (C)2014-2024 GOWIN Semiconductor Corporation.
+//All rights reserved.
+//File Title: Timing Constraints file
+//Tool Version: V1.9.9.01 (64-bit) 
+//Created Time: 2024-03-18 14:44:39
+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_generated_clock -name clk30 -source [get_ports {Clk_i}] -master_clock Clk_i -divide_by 24 -multiply_by 30 [get_ports {Clk30_o}]
+create_generated_clock -name clk40 -source [get_ports {Clk_i}] -master_clock Clk_i -divide_by 24 -multiply_by 40 [get_ports {Clk40_o}]
+create_generated_clock -name clk50 -source [get_ports {Clk_i}] -master_clock Clk_i -divide_by 24 -multiply_by 50 [get_ports {Clk50_o}]
+create_generated_clock -name clk5 -source [get_ports {Clk_i}] -master_clock Clk_i -divide_by 24 -multiply_by 5 [get_ports {Clk5_o}]
+create_generated_clock -name clk360 -source [get_ports {Clk_i}] -master_clock Clk_i -divide_by 24 -multiply_by 360 [get_ports {Clk600_o}]
+create_generated_clock -name clk100 -source [get_ports {Clk_i}] -master_clock Clk_i -divide_by 24 -multiply_by 100 [get_ports {Clk100_o}]
+create_generated_clock -name clk20 -source [get_ports {Clk_i}] -master_clock Clk_i -divide_by 24 -multiply_by 20 [get_ports {Clk20_o}]
+create_generated_clock -name clk75 -source [get_ports {Clk_i}] -master_clock Clk_i -divide_by 24 -multiply_by 72 [get_ports {Clk75_o}]
+set_clock_groups -asynchronous -group [get_clocks {Clk_i Sck_i}]
+report_timing -setup -from_clock [get_clocks {clk100}] -max_paths 100 -max_common_paths 1
+report_timing -setup -from_clock [get_clocks {clk360}] -max_paths 100 -max_common_paths 1
+report_timing -setup -from_clock [get_clocks {clk75}] -max_paths 100 -max_common_paths 1
+report_timing -setup -from_clock [get_clocks {clk50}] -max_paths 100 -max_common_paths 1
+report_timing -setup -from [get_ports {Rst_i}]

+ 1 - 1
src/src/InterfaceArbiter/QuadSm.v

@@ -1,6 +1,6 @@
 `timescale 1ns / 1ps
 
-module QuadSm 
+module ExtQSpiMEmul 
 (
 	input Rst_i,
 	input Clk_i,

+ 1 - 1
src/src/InterfaceArbiter/SingleSm.v

@@ -1,6 +1,6 @@
 `timescale 1ns / 1ps
 
-module SingleSm 
+module ExtSpiMEmul 
 (
 	input Rst_i,
 	input Clk_i,

BIN
src/src/InterfaceArbiter/InterfaceArbiter.docx


+ 2 - 2
src/src/InterfaceArbiter/InterfaceArbiterTb.v

@@ -195,7 +195,7 @@ always @(*) begin
 	endcase
 end
 
-SingleSm SingleSpiSm
+ExtSpiMEmul SingleSpiSm
 (
 	.Rst_i		(rst),
 	.Clk_i		(Clk10),
@@ -209,7 +209,7 @@ SingleSm SingleSpiSm
 	
 );
 
-QuadSm QuadSpiSm
+ExtQSpiMEmul QuadSpiSm
 (
 	.Rst_i		(rst),
 	.Clk_i		(Clk10),

BIN
src/src/PacketAnalyzer4Mosi/PacketAnalyzer4Mosi.docx


+ 228 - 0
src/src/PacketAnalyzer4Mosi/PacketAnalyzer4Mosi.v

@@ -0,0 +1,228 @@
+////////////////////////////////////////////////////////////////////////////////////////////
+// Company:			TAIR
+// Engineer:		Zaytsev Mikhail
+// 
+// Create Date:		18/04/2024 
+// Design Name: 
+// Module Name:		PacketAnalyzer4Mosi 
+// Project Name:	SB_TMSG44V1_FPGA
+// Target Devices:	Board: SB_TMSG44v1. FPGA: GW1N-LV9PG256C6/I5
+// Tool versions:
+// Description:		The module analyzes the input data bus DataFromSpi_i[23:0] by the 
+//					validity signal ValDataFromSpi_i. When a configuration packet is 
+//					received, it is captured into the internal register. Further, each 
+//					incoming data packet decrements the internal configuration register 
+//					until the internal configuration register is zero, which means that 
+//					the module is ready to receive the next configuration packet. Each 
+//					decrement sets the data validity bit for the specific end device. 
+//					The module also has an output signal Busy_o, which signals that 
+//					the module is in the state of processing the data received in 
+//					4MOSI mode for writing to the FIFO.
+//
+// Dependencies:	
+// Revision: 
+// Revision 1.0 - File Created
+// Additional Comments: 
+//
+////////////////////////////////////////////////////////////////////////////////////////////
+module PacketAnalyzer4Mosi (
+	input Clk_i,
+	input Rst_i,
+
+	input [23:0] DataFromSpi_i,
+	input ValDataFromSpi_i,
+
+	input BusyMosi1_i,
+
+	output reg ValLmxDataToFifo_o,
+	output reg ValDdsDataToFifo_o,
+	output reg ValPotDataToFifo_o,
+	output reg ValDacDataToFifo_o,
+	output reg ValAttDataToFifo_o,
+	output reg ValShRegDataToFifo_o,
+	output reg ValMaxDataToFifo_o,
+	output reg ValGpioDataToFifo_o,
+
+	output reg Busy_o
+);
+
+//==========================================
+// Registers
+//==========================================
+reg [22:0] DataSpiReg;
+
+//==========================================
+// Wires
+//==========================================
+wire lmxOr;
+wire ddsOr;
+wire potOr;
+wire dacOr;
+wire attOr;
+wire shRegOr;
+wire maxOr;
+wire gpioOr;
+
+wire [7:0] selector;
+
+//==========================================
+// Parameters
+//==========================================
+localparam [22:0] DECREMENT_LMX 	= 23'h80000;	//23'b000 1000 0000 0000 0000 0000
+localparam [22:0] DECREMENT_DDS 	= 23'h20000;	//23'b000 0010 0000 0000 0000 0000
+localparam [22:0] DECREMENT_POT 	= 23'h10000;	//23'b000 0001 0000 0000 0000 0000
+localparam [22:0] DECREMENT_DAC 	= 23'h8000;		//23'b000 0000 1000 0000 0000 0000
+localparam [22:0] DECREMENT_ATT 	= 23'h4000;		//23'b000 0000 0100 0000 0000 0000
+localparam [22:0] DECREMENT_SH_REG 	= 23'h1000;		//23'b000 0000 0001 0000 0000 0000
+localparam [22:0] DECREMENT_MAX 	= 23'h200;		//23'b000 0000 0000 0010 0000 0000
+localparam [22:0] DECREMENT_GPIO 	= 23'h80;		//23'b000 0000 0000 0000 1000 0000
+
+//==========================================
+// Assignments
+//==========================================
+assign lmxOr 	= 	|DataSpiReg[22:19];
+assign ddsOr 	= 	|DataSpiReg[18:17];
+assign potOr 	= 	 DataSpiReg[16];
+assign dacOr 	= 	 DataSpiReg[15];
+assign attOr 	= 	 DataSpiReg[14];
+assign shRegOr 	= 	|DataSpiReg[13:12];
+assign maxOr 	= 	|DataSpiReg[11:9];
+assign gpioOr 	= 	|DataSpiReg[8:7];
+
+assign selector = {lmxOr, ddsOr, potOr, dacOr, attOr, shRegOr, maxOr, gpioOr};
+
+//==========================================================================//
+//									CODING									//
+//==========================================================================//
+always @(posedge Clk_i) begin
+	if (Rst_i) begin
+		Busy_o <= 1'b0;
+	end
+	else if (DataSpiReg != 0) begin
+		Busy_o <= 1'b1;
+	end
+	else begin
+		Busy_o <= 1'b0;
+	end
+end
+
+always @(posedge Clk_i) begin
+	if (Rst_i || BusyMosi1_i) begin
+		DataSpiReg <= 23'b0;
+		ValLmxDataToFifo_o <= 1'b0;
+		ValDdsDataToFifo_o <= 1'b0;
+		ValPotDataToFifo_o <= 1'b0;
+		ValDacDataToFifo_o <= 1'b0;
+		ValAttDataToFifo_o <= 1'b0;
+		ValShRegDataToFifo_o <= 1'b0;
+		ValMaxDataToFifo_o <= 1'b0;
+		ValGpioDataToFifo_o <= 1'b0;
+	end
+	else if (ValDataFromSpi_i) begin
+		if ((DataSpiReg == 0) && (DataFromSpi_i[23] == 1'b1)) begin
+			DataSpiReg <= DataFromSpi_i[22:0];
+		end
+		else begin
+			casez(selector)
+			8'b1???????: begin //LMX
+				DataSpiReg <= DataSpiReg - DECREMENT_LMX;
+				ValLmxDataToFifo_o <= 1'b1;
+			end
+			8'b01??????: begin //DDS
+				DataSpiReg <= DataSpiReg - DECREMENT_DDS;
+				ValDdsDataToFifo_o <= 1'b1;
+			end
+			8'b001?????: begin //POT
+				DataSpiReg <= DataSpiReg - DECREMENT_POT;
+				ValPotDataToFifo_o <= 1'b1;
+			end
+			8'b0001????: begin //DAC
+				DataSpiReg <= DataSpiReg - DECREMENT_DAC;
+				ValDacDataToFifo_o <= 1'b1;
+			end
+			8'b00001???: begin //ATT
+				DataSpiReg <= DataSpiReg - DECREMENT_ATT;
+				ValAttDataToFifo_o <= 1'b1;
+			end
+			8'b000001??: begin //ShReg
+				DataSpiReg <= DataSpiReg - DECREMENT_SH_REG;
+				ValShRegDataToFifo_o <= 1'b1;
+			end
+			8'b0000001?: begin //MAX2870
+				DataSpiReg <= DataSpiReg - DECREMENT_MAX;
+				ValMaxDataToFifo_o <= 1'b1;
+			end
+			8'b00000001: begin //GPIO
+				DataSpiReg <= DataSpiReg - DECREMENT_GPIO;
+				ValGpioDataToFifo_o <= 1'b1;
+			end
+			default: begin
+				ValLmxDataToFifo_o <= 1'b0;
+				ValDdsDataToFifo_o <= 1'b0;
+				ValPotDataToFifo_o <= 1'b0;
+				ValDacDataToFifo_o <= 1'b0;
+				ValAttDataToFifo_o <= 1'b0;
+				ValShRegDataToFifo_o <= 1'b0;
+				ValMaxDataToFifo_o <= 1'b0;
+				ValGpioDataToFifo_o <= 1'b0;
+			end
+		endcase
+//=========================DELETE AFTER HARDWARE TEST===========================
+			/*if (lmxOr) begin //LMX
+				DataSpiReg <= DataSpiReg - DECREMENT_LMX;
+				ValLmxDataToFifo_o 		<= 1'b1;
+			end
+			else if (ddsOr) begin //DDS
+				DataSpiReg <= DataSpiReg - DECREMENT_DDS;
+				ValDdsDataToFifo_o 		<= 1'b1;
+			end
+			else if (potOr) begin //POT
+				DataSpiReg <= DataSpiReg - DECREMENT_POT;
+				ValPotDataToFifo_o 		<= 1'b1;
+			end
+			else if (dacOr) begin //DAC
+				DataSpiReg <= DataSpiReg - DECREMENT_DAC;
+				ValDacDataToFifo_o 		<= 1'b1;
+			end
+			else if (attOr) begin
+				DataSpiReg <= DataSpiReg - DECREMENT_ATT;
+				ValAttDataToFifo_o 		<= 1'b1;
+			end
+			else if (shRegOr) begin
+				DataSpiReg <= DataSpiReg - DECREMENT_SH_REG;
+				ValShRegDataToFifo_o 	<= 1'b1;
+			end
+			else if (maxOr) begin
+				DataSpiReg <= DataSpiReg - DECREMENT_MAX;
+				ValMaxDataToFifo_o 		<= 1'b1;
+			end
+			else if (gpioOr) begin
+				DataSpiReg <= DataSpiReg - DECREMENT_GPIO;
+				ValGpioDataToFifo_o 	<= 1'b1;
+			end
+			else begin
+				ValLmxDataToFifo_o 		<= 1'b0;
+				ValDdsDataToFifo_o 		<= 1'b0;
+				ValPotDataToFifo_o 		<= 1'b0;
+				ValDacDataToFifo_o 		<= 1'b0;
+				ValAttDataToFifo_o 		<= 1'b0;
+				ValShRegDataToFifo_o 	<= 1'b0;
+				ValMaxDataToFifo_o 		<= 1'b0;
+				ValGpioDataToFifo_o 	<= 1'b0;
+			end*/
+//=========================DELETE AFTER HARDWARE TEST===========================
+		end
+	end
+	else begin
+		ValLmxDataToFifo_o 		<= 1'b0;
+		ValDdsDataToFifo_o 		<= 1'b0;
+		ValPotDataToFifo_o 		<= 1'b0;
+		ValDacDataToFifo_o 		<= 1'b0;
+		ValAttDataToFifo_o 		<= 1'b0;
+		ValShRegDataToFifo_o 	<= 1'b0;
+		ValMaxDataToFifo_o 		<= 1'b0;
+		ValGpioDataToFifo_o 	<= 1'b0;
+	end
+end
+
+endmodule

+ 169 - 0
src/src/PacketAnalyzer4Mosi/PacketAnalyzer4MosiTb.v

@@ -0,0 +1,169 @@
+`timescale 1ns / 1ns
+
+module PacketAnalyzer4MosiTb (
+);
+
+//===============USER DEFINE===================
+localparam [3:0] CNT_LMX_DATA = 1;
+localparam [1:0] CNT_DDS_DATA = 1;
+localparam [0:0] CNT_POT_DATA = 1;
+localparam [0:0] CNT_DAC_DATA = 1;
+localparam [0:0] CNT_ATT_DATA = 1;
+localparam [1:0] CNT_SH_REG_DATA = 1;
+localparam [2:0] CNT_MAX_DATA = 3;
+localparam [1:0] CNT_GPIO_DATA = 1;
+//===============USER DEFINE_END===============
+
+localparam MODE_4MOSI = 1'b1;
+localparam MODE_1MOSI = 1'b0;
+
+//===============USER DEFINE===================
+localparam MODE_SELECT = MODE_4MOSI;
+//===============USER DEFINE_END===============
+
+localparam CFG_REG = 	{MODE_SELECT, CNT_LMX_DATA, CNT_DDS_DATA, 
+						CNT_POT_DATA, CNT_DAC_DATA, CNT_ATT_DATA,
+						CNT_SH_REG_DATA, CNT_MAX_DATA, CNT_GPIO_DATA, 7'b0};
+
+localparam CNT_DATA_WORDS = CNT_LMX_DATA + CNT_DDS_DATA + CNT_POT_DATA 
+							+ CNT_DAC_DATA + CNT_ATT_DATA + CNT_SH_REG_DATA 
+							+ CNT_MAX_DATA + CNT_GPIO_DATA;
+
+reg clkMain_tb;
+reg rstMain_tb;
+reg busyMosi1_tb;
+
+reg [23:0] DataFromSpi_tb;
+reg ValDataFromSpi_tb;
+
+always #10 clkMain_tb = ~clkMain_tb;
+
+initial begin
+	clkMain_tb = 0;
+	rstMain_tb = 1;
+	busyMosi1_tb = 0;
+	#100
+	rstMain_tb = 0;
+end
+
+reg	[7:0]	state; 
+reg	[63:0]	cnt;
+reg	[63:0]	countState;
+
+always @(posedge clkMain_tb) begin
+	if (rstMain_tb) begin
+		cnt <= 0;
+		state <= 0;
+		ValDataFromSpi_tb <= 0;	
+		DataFromSpi_tb <= 0;
+		countState <= 0;
+	end
+	else begin
+		case(state)
+			0: begin
+				DataFromSpi_tb <= CFG_REG;
+
+				if (cnt == 6) begin
+					cnt <= 0;
+					ValDataFromSpi_tb <= 1;
+					state <= state + 1;
+				end
+				else begin
+					cnt <= cnt + 1;
+					state <= state;
+				end
+			end
+			1: begin
+				ValDataFromSpi_tb <= 0;
+				if (cnt == 1) begin
+					cnt <= 0;
+					state <= state + 1;
+				end
+				else begin
+					cnt <= cnt + 1;
+					state <= state;
+				end
+			end
+			2: begin
+				DataFromSpi_tb <= 24'hA; //DATA0
+
+				if (cnt == 6) begin
+					cnt <= 0;
+					ValDataFromSpi_tb <= 1;
+					state <= state + 1;
+					countState <= countState + 1;
+				end
+				else begin
+					cnt <= cnt + 1;
+					state <= state;
+				end
+			end
+			3: begin
+				ValDataFromSpi_tb <= 0;
+				if (countState == CNT_DATA_WORDS) begin
+					state <= 5;
+				end
+				else if (cnt == 1) begin
+					cnt <= 0;
+					state <= state + 1;
+				end
+				else begin
+					cnt <= cnt + 1;
+					state <= state;
+				end
+			end
+			4: begin
+				DataFromSpi_tb <= 24'hF; //DATA1
+
+				if (cnt == 6) begin
+					cnt <= 0;
+					ValDataFromSpi_tb <= 1;
+					state <= state + 1;
+					countState <= countState + 1;
+				end
+				else begin
+					cnt <= cnt + 1;
+					state <= state;
+				end
+			end
+			5: begin
+				ValDataFromSpi_tb <= 0;
+				if (countState == CNT_DATA_WORDS) begin
+					state <= state;
+				end
+				else if (cnt == 1) begin
+					cnt <= 0;
+					state <= 2;
+				end
+				else begin
+					cnt <= cnt + 1;
+					state <= state;
+				end
+			end
+		endcase
+	end
+end
+
+PacketAnalyzer4Mosi DUT (
+	.Clk_i					(clkMain_tb),	
+	.Rst_i					(rstMain_tb),	
+	
+	.DataFromSpi_i 			(DataFromSpi_tb),
+	.ValDataFromSpi_i 		(ValDataFromSpi_tb),
+	
+	.BusyMosi1_i			(busyMosi1_tb),
+
+	.ValLmxDataToFifo_o		(),
+	.ValDdsDataToFifo_o		(),
+	.ValPotDataToFifo_o		(),
+	.ValDacDataToFifo_o		(),
+	.ValAttDataToFifo_o		(),
+	.ValShRegDataToFifo_o	(),
+	.ValMaxDataToFifo_o		(),
+	.ValGpioDataToFifo_o	(),
+
+	.Busy_o					()
+);
+
+
+endmodule

+ 44 - 0
src/src/PacketAnalyzer4Mosi/PacketAnalyzer4MosiWave.do

@@ -0,0 +1,44 @@
+onerror {resume}
+quietly WaveActivateNextPane {} 0
+add wave -noupdate /PacketAnalyzer4MosiTb/PacketAnalyzer4Mosi_inst/Clk_i
+add wave -noupdate /PacketAnalyzer4MosiTb/PacketAnalyzer4Mosi_inst/Rst_i
+add wave -noupdate /PacketAnalyzer4MosiTb/PacketAnalyzer4Mosi_inst/DataFromSpi_i
+add wave -noupdate /PacketAnalyzer4MosiTb/PacketAnalyzer4Mosi_inst/ValDataFromSpi_i
+add wave -noupdate /PacketAnalyzer4MosiTb/PacketAnalyzer4Mosi_inst/BusyMosi1_i
+add wave -noupdate /PacketAnalyzer4MosiTb/PacketAnalyzer4Mosi_inst/ValLmxDataToFifo_o
+add wave -noupdate /PacketAnalyzer4MosiTb/PacketAnalyzer4Mosi_inst/ValDdsDataToFifo_o
+add wave -noupdate /PacketAnalyzer4MosiTb/PacketAnalyzer4Mosi_inst/ValPotDataToFifo_o
+add wave -noupdate /PacketAnalyzer4MosiTb/PacketAnalyzer4Mosi_inst/ValDacDataToFifo_o
+add wave -noupdate /PacketAnalyzer4MosiTb/PacketAnalyzer4Mosi_inst/ValAttDataToFifo_o
+add wave -noupdate /PacketAnalyzer4MosiTb/PacketAnalyzer4Mosi_inst/ValShRegDataToFifo_o
+add wave -noupdate /PacketAnalyzer4MosiTb/PacketAnalyzer4Mosi_inst/ValMaxDataToFifo_o
+add wave -noupdate /PacketAnalyzer4MosiTb/PacketAnalyzer4Mosi_inst/ValGpioDataToFifo_o
+add wave -noupdate /PacketAnalyzer4MosiTb/PacketAnalyzer4Mosi_inst/Busy_o
+add wave -noupdate -radix binary /PacketAnalyzer4MosiTb/PacketAnalyzer4Mosi_inst/DataSpiReg
+add wave -noupdate /PacketAnalyzer4MosiTb/PacketAnalyzer4Mosi_inst/lmxOr
+add wave -noupdate /PacketAnalyzer4MosiTb/PacketAnalyzer4Mosi_inst/ddsOr
+add wave -noupdate /PacketAnalyzer4MosiTb/PacketAnalyzer4Mosi_inst/potOr
+add wave -noupdate /PacketAnalyzer4MosiTb/PacketAnalyzer4Mosi_inst/dacOr
+add wave -noupdate /PacketAnalyzer4MosiTb/PacketAnalyzer4Mosi_inst/attOr
+add wave -noupdate /PacketAnalyzer4MosiTb/PacketAnalyzer4Mosi_inst/shRegOr
+add wave -noupdate /PacketAnalyzer4MosiTb/PacketAnalyzer4Mosi_inst/maxOr
+add wave -noupdate /PacketAnalyzer4MosiTb/PacketAnalyzer4Mosi_inst/gpioOr
+add wave -noupdate /PacketAnalyzer4MosiTb/PacketAnalyzer4Mosi_inst/selector
+TreeUpdate [SetDefaultTree]
+WaveRestoreCursors {{Cursor 1} {270 ns} 0}
+quietly wave cursor active 1
+configure wave -namecolwidth 150
+configure wave -valuecolwidth 174
+configure wave -justifyvalue left
+configure wave -signalnamewidth 1
+configure wave -snapdistance 10
+configure wave -datasetprefix 0
+configure wave -rowmargin 4
+configure wave -childrowmargin 2
+configure wave -gridoffset 0
+configure wave -gridperiod 1
+configure wave -griddelta 40
+configure wave -timeline 0
+configure wave -timelineunits ns
+update
+WaveRestoreZoom {0 ns} {3962 ns}

+ 82 - 0
src/src/Top/TopSbTmsg.v

@@ -0,0 +1,82 @@
+`timescale 1ns / 1ps
+
+//////////////////////////////////////////////////////////////////////////////////
+// Company: Tair
+// Engineer: Churbanov S.
+// 
+// Create Date:     
+// Design Name: 
+// Module Name:    TopSbtmsg
+// Project Name: 
+// Target Devices: 
+// Tool versions: 
+// Description: 
+//
+// Dependencies: 
+//
+// Revision: 
+// Revision 0.01 - File Created
+// Additional Comments: 
+//		Clk_i - is 24MHz.
+//
+//////////////////////////////////////////////////////////////////////////////////
+
+module TopSbTmsg 
+#(
+    parameter DevNum = 8,
+    parameter WordWidth = 24
+) 
+(
+	input Clk_i,
+	input Rst_i,
+	
+	input Sck_i,
+	input Ss_i,
+	
+	input Mosi0_i,
+	inout Mosi1_io,
+	input Mosi2_i,
+	input Mosi3_i,
+	
+	input Miso1_i,
+	input Miso2_i,
+	input MisoMax2870_i,
+	
+	output I2CSck_o,
+	inout I2CSda_io,
+	
+	output [DevNum-1:0] Ss_o,
+	output [DevNum-1:0] Sck_o,
+	output [DevNum-1:0] Mosi_o,
+	
+	output [21:0] Gpio_o
+);
+
+//================================================================================
+//  LOCALPARAM
+
+
+//================================================================================
+
+wire clk360;
+wire clk100;
+wire clk75;
+wire clk50;
+wire clk40;
+wire clk20;
+wire clk30;
+wire clk5;
+
+//================================================================================
+//  ASSIGNMENTS
+
+
+
+
+
+//================================================================================
+//  CODING
+
+
+
+endmodule