|
@@ -1,119 +0,0 @@
|
|
|
-////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
-// 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
|
|
|