在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 3241|回复: 6

[求助] 麻烦大侠们帮我看下这个用verilog写得spi接口的程序。

[复制链接]
发表于 2011-7-28 10:31:13 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
又要麻烦大家,最近在用fpga写一个spi的接口程序,虽然spi的协议不复杂,但是对于我这种菜鸟,要写出来还是有点麻烦。
我再书上找了一个例程看,但是有些地方还是不太明白。
我把看不太懂的地方用红色注视写出来,还码放各位帮我看下。
先谢谢啦


module spi_master(addr,in_data,out_data,rd,wr,cs,clk,miso,mosi,sclk);
  input wire [1:0] addr;
  input wire [7:0] in_data;
  output reg [7:0] out_data;
  input wire rd;
  input wire wr;
  input wire cs;
  input wire clk;
  inout miso;
  inout mosi;
  inout sclk;
  
  reg sclk_buffer=0;
  reg mosi_buffer=0;
  reg busy=0;
  
  reg [7:0] in_buffer=0;
  reg [7:0] out_buffer=0;
  reg [7:0] clkcount=0;
  reg [7:0] clkdiv=0;
  reg [4:0] count=0;
  
  always @ ( cs or rd or addr or out_buffer or busy or clkdiv )  
  begin
    out_data=8'bx;
    if(cs && rd)                                   // 读操作
      begin  
        case ( addr )                     //不太明白这个addr的意思,是通过addr区分输入输出不同的寄存器吗?
          2'b00 : out_data=out_buffer;
          2'b01 : out_data={7'b0,busy};  //看不明白
          2'b10 : out_data=clkdiv;       //看不明白
          default : ;   
        endcase
      end
    else
      ;
  end
  
  always @ ( posedge clk )
  begin
    if( !busy )        //当busy=0, 可以把数据打入输入寄存器;当busy==1, 忙。
      begin
        if( cs && wr )                 // 写操作
          begin
            case ( addr )  //不明白
              2'b00 : begin in_buffer=in_data; busy=1'b1;  end
              2'b10 : begin clkdiv=in_data;  end        //看不明白这是什么意思
              default : ;
            endcase
          end
      end
    else
      begin
        clkcount=clkcount+1;
        if ( clkcount>=clkdiv )    //不明白clkcount和clkdiv的关系
          begin
            clkcount=0;                 
            
            if ( ( count%2 )==0 )
              begin
                mosi_buffer=in_buffer[7]; //最高位优先(不过既然是master输出为什么不用输出寄存器而是用输入寄存器呢?
                in_buffer=in_buffer<<1;
              end
              
            if ( count>0 && count<17 )
              begin
                sclk_sclk_bufferbuffer=~sclk_buffer;  //产生sclk信号
              end
              
            count=count+1;  
            
            if ( count>17 )  // 8个周期16次跳变
              begin
                count=0;
                busy=1'b0;
              end
              
          end
      end
  end
  
  always @ ( posedge sclk_buffer )
  begin
    out_buffer=out_buffer<<1;
    out_buffer[0]=miso;
  end
  
  assign sclk=sclk_buffer;
  
  assign mosi=mosi_buffer;
  
endmodule
 楼主| 发表于 2011-7-28 13:24:25 | 显示全部楼层
奇怪了,外面看有两个回复的,怎么一进来就没有了?
发表于 2011-7-29 00:43:36 | 显示全部楼层
这些都是最基本的语法问题。自己看书吧。
 楼主| 发表于 2011-7-29 13:21:07 | 显示全部楼层
能看懂就不来问了
希望各位指点一二
发表于 2011-7-30 08:28:21 | 显示全部楼层
这个代码写的不好
 楼主| 发表于 2011-7-30 09:53:58 | 显示全部楼层
发表于 2011-8-1 08:30:43 | 显示全部楼层
书上的东西很多都是纸上谈兵的,并且上面的编码风格很差,LZ还是自己写吧,先画时序关系,然后就可以自己写出来了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-22 16:26 , Processed in 0.030321 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表