📄 spi_interface.v
字号:
module SPI_INTERFACE (do, iostrb_l, rw_l, io_wr, spi_rd, clkout, reset_l, dclk, cs_en, dio) ;
input reset_l;
inout do ;
input iostrb_l ;
input rw_l ;
output io_wr,spi_rd;
input clkout ;
output dclk ;
output cs_en ;
inout dio ;
// add your declarations here
reg do_out;
wire do;
reg dio_out;
wire dio;
reg dclk;
wire io_rd,io_wr;
wire cs_en;
reg [9:0] j;
reg spi_wr,spi_rd;
reg [7:0] buffer;
reg buffer_full;
reg [2:0] i;
reg [5:0] main_state;
parameter idle = 6'b000001, ready = 6'b000010, write_buffer = 6'b000100, read_buffer = 6'b001000,
spi_write = 6'b010000, spi_read = 6'b100000;
// add your code here
assign io_rd = (!iostrb_l && rw_l)?1:0;
assign io_wr = (!iostrb_l && !rw_l)?1:0;
assign cs_en = (spi_wr || spi_rd)?1:0;
assign do = ( io_rd )?do_out :1'bz;
assign dio = ( spi_wr )?dio_out :1'bz;
always @(posedge clkout or negedge reset_l)
begin
if (!reset_l)
begin
buffer = 'b0;
buffer_full = 0;
spi_rd = 0;
spi_wr = 0;
main_state = idle;
end
else
begin
casex(main_state)
idle:
begin
buffer = 'b0;
buffer_full = 0;
spi_rd = 0;
spi_wr = 0;
if (iostrb_l == 1'b0)
begin
main_state = ready;
end
else
begin
main_state = idle;
end
end
ready:
begin
if (!rw_l)
begin
main_state = write_buffer;
spi_wr = 1;
end
else
begin
main_state = spi_read;
spi_rd = 1;
end
end
write_buffer:
begin
if (!buffer_full)
begin
for (i = 0; i <= 3'b111; i = i+1)
begin
buffer[ i ] = do;
end
buffer_full = 1;
main_state = spi_write;
spi_wr = 1;
end
else
begin
main_state = idle;
end
end
read_buffer:
begin
if (buffer_full)
begin
spi_rd = 0;
for (i = 0; i <= 3'b111; i = i+1)
begin
do_out = buffer[ 7-i ];
end
buffer_full = 0;
main_state = idle;
end
else
begin
main_state = spi_read;
end
end
spi_write:
begin
if (buffer_full)
begin
for (i = 0; i <= 3'b111; i = i+1)
begin
dclk=0;
for (j=0;j<='h3f7;j=j+1);
dclk=1;
if (dclk)
begin
dio_out = buffer[ 7-i ];
end
for (j=0;j<='h3f7;j=j+1);
end
buffer_full = 0;
main_state = idle;
end
else
begin
main_state = idle;
end
end
spi_read:
begin
if (!buffer_full)
begin
for (i = 0; i <= 3'b111; i = i+1)
begin
dclk=1;
for (j=0;j<='h3f7;j=j+1);
dclk=0;
if (!dclk)
begin
buffer[ i ] = dio;
end
for (j=0;j<='h3f7;j=j+1);
end
buffer_full = 1;
main_state = read_buffer;
end
else
begin
main_state = idle;
end
end
default:
begin
main_state = idle;
end
endcase
end
end
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -