68 lines
1.6 KiB
Verilog
68 lines
1.6 KiB
Verilog
module spi_master_esp32(
|
||
input wire clk,
|
||
input wire rst_n,
|
||
input wire start,
|
||
input wire [15:0] din,
|
||
output reg done,
|
||
output wire sclk,
|
||
output wire mosi,
|
||
output reg cs
|
||
);
|
||
|
||
reg [3:0] bit_cnt;
|
||
reg [15:0] shift_reg;
|
||
reg sclk_reg;
|
||
reg [1:0] state;
|
||
|
||
localparam IDLE = 2'b00, TRANSFER = 2'b01, DONE = 2'b10;
|
||
|
||
assign sclk = sclk_reg;
|
||
assign mosi = shift_reg[15];
|
||
|
||
always @(posedge clk or negedge rst_n) begin
|
||
if (!rst_n) begin
|
||
state <= IDLE;
|
||
cs <= 1;
|
||
sclk_reg <= 0;
|
||
bit_cnt <= 0;
|
||
shift_reg <= 0;
|
||
done <= 0;
|
||
end
|
||
else begin
|
||
|
||
if (start) begin
|
||
case (state)
|
||
IDLE: begin
|
||
|
||
|
||
state <= TRANSFER;
|
||
cs <= 0; // 选择从机
|
||
shift_reg <= din;
|
||
bit_cnt <= 0;
|
||
done <= 0;
|
||
|
||
end
|
||
|
||
TRANSFER: begin
|
||
sclk_reg <= ~sclk_reg; //这样也是一个系统时钟周期新的sclk反转一次,所以sclk的频率也是115200.
|
||
if (sclk_reg) begin //看上面的assign mosi = shift_reg[15]; 所以每个sclk高电平mosi输出要输出的值。
|
||
shift_reg <= {shift_reg[14:0], 1'b0};
|
||
bit_cnt <= bit_cnt + 1;
|
||
if (bit_cnt == 15) begin
|
||
state <= DONE;
|
||
end
|
||
end
|
||
end
|
||
|
||
DONE: begin
|
||
state <= IDLE;
|
||
cs <= 1; // 取消选择从机
|
||
done <= 1;
|
||
end
|
||
|
||
endcase
|
||
end
|
||
end
|
||
end
|
||
|
||
endmodule |