用verilog编写spi通信模块

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值