spi模块测试(没有按照状态机方式生成时钟,感觉如果传输的不是8位而是16或32位代码将过长),发送端连接到了接收端,不一定实用属自娱自乐,供大家参考
`timescale 1 ns / 1ns
module exx(en,clk,sclk,cs,sdi,sdo); //exx我想表达举例,大家可以改为spi名称
input en,clk,sdi; //en允许发送数据
output cs,sclk,sdo;
reg sdo;
reg[7:0] data=8'b10111111;//待发送数据寄存器
reg[7:0] buff=8'b00000000;//接收数据缓冲寄存器
reg[2:0] cnt=7; //计数器初值为7
reg cs; //片选信号高有效
assign sclk=clk; //串行时钟直接引用晶振时钟
always @(posedge sclk)
if(en) cs<=1; //en启动cs
else if(cnt==0) cs<=0;
always @(posedge sclk)
if(cs) cnt<=cnt-1;
else cnt<=7; //发送完毕自动恢复为7
always @(negedge sclk) //下降沿发送数据
if(cs) sdo<=data[cnt];
always @(posedge sclk) //上升沿接收数据
if(cs) buff[cnt]<=sdi;
endmodule
module exx_tst( );
reg en,clk,sdi;
wire cs,sclk,sdo;
exx myexx(en,clk,sclk,cs,sdi,sdo);
always @(*) sdi=sdo; //收发端互连,自发自收
always #5 clk=~clk; //时钟周期10ns
initial
begin
en=0;
clk=0;
#23; en=1;
#12; en=0; //en延时超过1个时钟周期不然可能错过时钟上升沿
end
endmodule