|
@@ -1,14 +1,14 @@
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
-// Company: TAIR
|
|
|
|
|
-// Engineer: Chigrinskiy A.
|
|
|
|
|
|
|
+// Company: TAIR
|
|
|
|
|
+// Engineer: Chigrinskiy A.
|
|
|
//
|
|
//
|
|
|
-// Create Date: 18/04/2024
|
|
|
|
|
|
|
+// Create Date: 18/04/2024
|
|
|
// Design Name:
|
|
// Design Name:
|
|
|
-// Module Name: SPIm
|
|
|
|
|
-// Project Name: SB_TMSG44V1_FPGA
|
|
|
|
|
|
|
+// Module Name: SPIm
|
|
|
|
|
+// Project Name: SB_TMSG44V1_FPGA
|
|
|
// Target Devices: Board: SB_TMSG44v1. FPGA: GW1N-LV9PG256C6/I5
|
|
// Target Devices: Board: SB_TMSG44v1. FPGA: GW1N-LV9PG256C6/I5
|
|
|
// Tool versions:
|
|
// Tool versions:
|
|
|
-// Description: This module implements SPI master interface
|
|
|
|
|
|
|
+// Description: This module implements SPI master interface
|
|
|
//
|
|
//
|
|
|
// Dependencies:
|
|
// Dependencies:
|
|
|
// Revision:
|
|
// Revision:
|
|
@@ -16,14 +16,13 @@
|
|
|
// Additional Comments:
|
|
// Additional Comments:
|
|
|
//
|
|
//
|
|
|
////////////////////////////////////////////////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
-
|
|
|
|
|
-module SPIm #(
|
|
|
|
|
- parameter ssNum = 24
|
|
|
|
|
|
|
+module SpiM #(
|
|
|
|
|
+ parameter DATA_WIDTH = 24
|
|
|
)(
|
|
)(
|
|
|
input Clk_i,
|
|
input Clk_i,
|
|
|
input Rst_i,
|
|
input Rst_i,
|
|
|
input Val_i,
|
|
input Val_i,
|
|
|
- input [ssNum-1:0] SpiData_i,
|
|
|
|
|
|
|
+ input [DATA_WIDTH-1:0] SpiData_i,
|
|
|
|
|
|
|
|
output Ss_o,
|
|
output Ss_o,
|
|
|
output Mosi_o,
|
|
output Mosi_o,
|
|
@@ -32,22 +31,36 @@ module SPIm #(
|
|
|
);
|
|
);
|
|
|
|
|
|
|
|
//================================================================================
|
|
//================================================================================
|
|
|
-// REG/WIRE
|
|
|
|
|
|
|
+//FUNCTIONS
|
|
|
//================================================================================
|
|
//================================================================================
|
|
|
-reg [6:0] ssCnt;
|
|
|
|
|
-reg [ssNum-1:0] mosiReg;
|
|
|
|
|
-reg ssReg;
|
|
|
|
|
|
|
+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 startFlag;
|
|
|
|
|
-reg ssR;
|
|
|
|
|
|
|
+//================================================================================
|
|
|
|
|
+// REG/WIRE
|
|
|
|
|
+//================================================================================
|
|
|
|
|
+reg [log2(DATA_WIDTH)-1:0] ssCnt;
|
|
|
|
|
+reg [DATA_WIDTH-1:0] mosiReg;
|
|
|
|
|
+reg ssReg;
|
|
|
|
|
|
|
|
//================================================================================
|
|
//================================================================================
|
|
|
// ASSIGNMENTS
|
|
// ASSIGNMENTS
|
|
|
//================================================================================
|
|
//================================================================================
|
|
|
assign Ss_o = ssReg;
|
|
assign Ss_o = ssReg;
|
|
|
-assign Mosi_o = (!Ss_o) ? mosiReg[ssNum-1] : 1'b0;
|
|
|
|
|
-assign Sck_o = (!Ss_o) ? Clk_i : 1'b0;
|
|
|
|
|
-assign Busy_o = !Ss_o;
|
|
|
|
|
|
|
+assign Mosi_o = (!ssReg) ? mosiReg[DATA_WIDTH-1] : 1'b0;
|
|
|
|
|
+assign Sck_o = (!ssReg) ? Clk_i : 1'b0;
|
|
|
|
|
+assign Busy_o = !ssReg;
|
|
|
|
|
|
|
|
//================================================================================
|
|
//================================================================================
|
|
|
// CODING
|
|
// CODING
|
|
@@ -56,26 +69,29 @@ always @(negedge Clk_i) begin
|
|
|
if (Rst_i) begin
|
|
if (Rst_i) begin
|
|
|
ssCnt <= 7'h0;
|
|
ssCnt <= 7'h0;
|
|
|
end
|
|
end
|
|
|
- else begin
|
|
|
|
|
- if (ssCnt < ssNum && startFlag) begin
|
|
|
|
|
- ssCnt <= ssCnt + 1;
|
|
|
|
|
|
|
+ else begin
|
|
|
|
|
+ if (ssCnt == 0) begin
|
|
|
|
|
+ if (Val_i) begin
|
|
|
|
|
+ ssCnt <= ssCnt + 1;
|
|
|
|
|
+ end
|
|
|
end
|
|
end
|
|
|
else begin
|
|
else begin
|
|
|
- ssCnt <= 7'h0;
|
|
|
|
|
|
|
+ if (ssCnt < DATA_WIDTH) begin
|
|
|
|
|
+ ssCnt <= ssCnt + 1;
|
|
|
|
|
+ end
|
|
|
|
|
+ else begin
|
|
|
|
|
+ ssCnt <= 7'h0;
|
|
|
|
|
+ end
|
|
|
end
|
|
end
|
|
|
end
|
|
end
|
|
|
end
|
|
end
|
|
|
|
|
|
|
|
-always @(posedge Clk_i) begin
|
|
|
|
|
- ssR <= ssReg;
|
|
|
|
|
-end
|
|
|
|
|
-
|
|
|
|
|
always @(negedge Clk_i) begin
|
|
always @(negedge Clk_i) begin
|
|
|
if (Rst_i) begin
|
|
if (Rst_i) begin
|
|
|
mosiReg <= 0;
|
|
mosiReg <= 0;
|
|
|
end
|
|
end
|
|
|
else begin
|
|
else begin
|
|
|
- if (!Ss_o) begin
|
|
|
|
|
|
|
+ if (!ssReg) begin
|
|
|
mosiReg <= mosiReg << 1;
|
|
mosiReg <= mosiReg << 1;
|
|
|
end
|
|
end
|
|
|
else begin
|
|
else begin
|
|
@@ -86,26 +102,12 @@ always @(negedge Clk_i) begin
|
|
|
end
|
|
end
|
|
|
end
|
|
end
|
|
|
|
|
|
|
|
-always @(*) begin
|
|
|
|
|
- if (Rst_i) begin
|
|
|
|
|
- startFlag = 1'b0;
|
|
|
|
|
- end
|
|
|
|
|
- else begin
|
|
|
|
|
- if (Val_i) begin
|
|
|
|
|
- startFlag = 1'b1;
|
|
|
|
|
- end
|
|
|
|
|
- else if (ssReg && !ssR) begin
|
|
|
|
|
- startFlag = 1'b0;
|
|
|
|
|
- end
|
|
|
|
|
- end
|
|
|
|
|
-end
|
|
|
|
|
-
|
|
|
|
|
always @(negedge Clk_i) begin
|
|
always @(negedge Clk_i) begin
|
|
|
if (Rst_i) begin
|
|
if (Rst_i) begin
|
|
|
ssReg <= 1'b1;
|
|
ssReg <= 1'b1;
|
|
|
end
|
|
end
|
|
|
else begin
|
|
else begin
|
|
|
- if (ssCnt < ssNum && startFlag) begin
|
|
|
|
|
|
|
+ if (ssCnt < DATA_WIDTH) begin
|
|
|
ssReg <= 1'b0;
|
|
ssReg <= 1'b0;
|
|
|
end
|
|
end
|
|
|
else begin
|
|
else begin
|