Jelajahi Sumber

Гит не реагирует на исправление имени файла. Исправляю через 2 комита.

ChStepan 1 tahun lalu
induk
melakukan
1c151fbce7
1 mengubah file dengan 119 tambahan dan 0 penghapusan
  1. 119 0
      src/src/SPIm/SpiM.v

+ 119 - 0
src/src/SPIm/SpiM.v

@@ -0,0 +1,119 @@
+////////////////////////////////////////////////////////////////////////////////////////////
+// Company:         TAIR
+// Engineer:        Chigrinskiy A.  
+// 
+// Create Date:     18/04/2024 
+// Design Name: 
+// Module Name:     SPIm
+// Project Name:    SB_TMSG44V1_FPGA
+// Target Devices:  Board: SB_TMSG44v1. FPGA: GW1N-LV9PG256C6/I5
+// Tool versions:
+// Description:     This module implements SPI master interface
+//
+// Dependencies:  
+// Revision: 
+// Revision 1.0 - File Created
+// Additional Comments: 
+//
+////////////////////////////////////////////////////////////////////////////////////////////
+module SpiM #(
+    parameter DATA_WIDTH = 24
+)(
+    input Clk_i,
+    input Rst_i,
+    input Val_i,
+    input [DATA_WIDTH-1:0] SpiData_i,
+
+    output Ss_o,
+    output Mosi_o,
+    output Sck_o,
+    output Busy_o
+);
+
+//================================================================================
+//FUNCTIONS
+//================================================================================
+function integer log2;
+input [31:0] value;
+	begin
+		log2 = 0;
+		while (value > 1) begin
+			value   = value >> 1;
+			log2    = log2 + 1;
+		end
+		if	((2**log2)<DATA_WIDTH)	begin
+			log2	=	log2+1;
+		end	
+	end
+endfunction
+
+//================================================================================
+//	REG/WIRE
+//================================================================================
+reg [log2(DATA_WIDTH)-1:0] ssCnt;
+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;
+assign Busy_o = !ssReg;
+
+//================================================================================
+//	CODING
+//================================================================================
+always @(negedge Clk_i) begin 
+    if (Rst_i) begin 
+        ssCnt <= 7'h0;
+    end
+    else begin
+        if (ssCnt == 0) begin 
+            if (Val_i) begin 
+                ssCnt <= ssCnt + 1;
+            end
+        end
+        else begin 
+            if (ssCnt < DATA_WIDTH) begin 
+                ssCnt <= ssCnt + 1;
+            end
+            else begin 
+                ssCnt <= 7'h0;
+            end
+        end
+    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
+
+always @(negedge Clk_i) begin 
+    if (Rst_i) begin 
+        ssReg <= 1'b1;
+    end
+    else begin 
+        if (ssCnt < DATA_WIDTH) begin 
+            ssReg <= 1'b0;
+        end
+        else begin 
+            ssReg <= 1'b1;
+        end
+    end
+end
+
+endmodule