集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 2886|回复: 6

一个SPI模块,I2C,不知道对大家有没有用,呵呵

[复制链接]
wangchunsheng 发表于 2011-7-21 08:54:05 | 显示全部楼层 |阅读模式
module     spi(
                   in_rst_n       ,      
                   in_we_n        ,
                   in_wdata       ,  
                   in_clk   ,
                   in_spi_en      ,
                   out_spi_csn    ,               
                   out_spi_dat    ,
                   out_sck        ,  
                   out_mode       ,
                  // out_int               
              );       

//G4
input              in_rst_n       ;      
input              in_we_n        ;  
input    [15:0]    in_wdata       ;   
//output             out_int        ;

//codec
input              in_clk   ;  
input              in_spi_en;
output             out_spi_csn    ;               
output             out_spi_dat    ;
output             out_sck        ;  
output             out_mode       ;


reg                out_rdata      ;
reg     [4:0]      count          ;
reg     [15:0]     spi_dat        ;
//reg                out_int        ;
reg                spi_csn        ;
reg                en_en          ;
reg                div2_clk       ;
reg                div4_clk       ;
reg                div8_clk       ;
wire               spi_en_en      ;
reg                in_spi_en1     ;

wire               in_spi_en      ;
wire    [15:0]     in_wdata       ;
wire               in_clk   ;
wire               in_rst_n       ;               
wire               in_we_n        ;                 
wire               read           ;
wire               write          ;
wire               out_mode       ;
wire               spi_en         ;

always @(negedge in_clk)
        in_spi_en1 <= in_spi_en;

assign spi_en_en = in_spi_en & (~in_spi_en1);       

always @(negedge in_clk or negedge in_rst_n)
   begin
     if(!in_rst_n)
       div2_clk <= 0;
     else
       div2_clk <= ~div2_clk;
   end  

always @(negedge div2_clk or negedge in_rst_n)
   begin
     if(!in_rst_n)
       div4_clk <= 0;
     else
       div4_clk <= ~div4_clk;
   end

always @(negedge div4_clk or negedge in_rst_n)
   begin
     if(!in_rst_n)
       div8_clk <= 0;
     else
       div8_clk <= ~div8_clk;
   end

   
assign spi_en = in_spi_en &  en_en ;

//always @(negedge in_clk or negedge  in_rst_n)
always @(negedge in_clk or posedge spi_en_en)
   begin
    if(spi_en_en)
      count <= 0;
    else
      if(count > 18)
        count <= 0;
      else
        if(spi_en)
               
          count <= count + 1 ;
        else
          count <= count;
   end  
      
//always @(negedge in_clk or negedge in_rst_n)
always @(negedge in_clk or posedge spi_en_en)
  begin
    if(spi_en_en)
       spi_csn <= 1 ;
    else if((count>0) && (count<17))
       spi_csn <= 0 ;
    else spi_csn <= 1;
   end

wire  out_spi_csn = spi_csn ;
   
//always @(negedge in_clk or negedge in_rst_n)
always @(negedge in_clk or posedge spi_en_en)
    begin
     //if(spi_en_en)
     //  spi_dat <= 16'b0 ;
     //else
       if(!in_we_n)
         spi_dat <= in_wdata ;
       else if(!spi_csn)
                spi_dat[15:1] <= spi_dat[14:0] ;
    end  

   
assign  out_spi_dat = spi_dat[15];
   
//always @(negedge in_clk or negedge in_rst_n)
always @(negedge in_clk or posedge spi_en_en)
    begin
     if(spi_en_en)  
    begin             
       en_en <= 1'b1;
     end
     else
       if(count==18)
        begin
         en_en  <= 1'b0 ;
        end
    end  

wire   out_sck = div8_clk;

assign out_mode = 1'b1;
   
endmodule


还有个I2C模块,太长了,在我博客http://blog.sina.com.cn/s/blog_4b19994d0100sxe7.html
ccs 发表于 2011-7-21 09:48:08 | 显示全部楼层
肯定有用 thx
天边 发表于 2011-7-24 03:51:05 | 显示全部楼层
最怕看没有标注的程序,能看到NC的
天边 发表于 2011-7-24 03:51:20 | 显示全部楼层
不过谢谢楼主分享的
Abiuuu 发表于 2011-7-26 11:36:25 | 显示全部楼层
简单的分频和移位输出哈
liujilei311 发表于 2011-8-1 15:28:34 | 显示全部楼层
好帖,顶一个啊!!!!!!!!!!!!!!!!!!!!
liujilei311 发表于 2011-8-3 08:09:19 | 显示全部楼层
最好能注释一下,方便大家进行学习啊!!!!!!!!!!!!!!!!!
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

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

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2025-6-24 05:05 , Processed in 0.105892 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表