单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2462|回复: 9
收起左侧

W5500网口芯片SPI传输时序 Verilog源码

[复制链接]
mwtlrf 发表于 2018-4-12 15:59 | 显示全部楼层 |阅读模式
基于Xilinx K7平台的W5500 SPI传输时序
开发语言为Verilog
在硬件平台上打通,实测没问题
支持1字节/2字节/4字节/多字节读写
微信截图_20180412152850.png

包含两个文件:rw_w5500_intf.v
                         mspi.v

单片机源程序如下:
  1. `timescale 1ns / 1ps
  2. //////////////////////////////////////////////////////////////////////////////////
  3. // Company:
  4. // Engineer:
  5. //
  6. // Create Date:    12:00:49 04/12/2017
  7. // Design Name:
  8. // Module Name:    rw_w5500_intf
  9. // Project Name:
  10. // Target Devices:
  11. // Tool versions:
  12. // Description:
  13. //
  14. // Dependencies:
  15. //
  16. // Revision:
  17. // Revision 0.01 - File Created
  18. // Additional Comments:

  19. //
  20. //                                  w5500读写控制及状态机实现FPGA源代码,可联系wuh2017@163.com
  21. //


  22. //////////////////////////////////////////////////////////////////////////////////
  23. module rw_w5500_intf(
  24.                                         input           I_clk,                                    // global clock
  25.                                         input           I_reset,                                // global async low reset
  26.                                         input           I_rw,                                        // w5500 write/read     -------------
  27.                                         input           I_sdi,                            // spi master data in (MISO)
  28.                                         input        [1:0]   I_w5500_data_len,                // w5500 data byte number:0:1BYTE 1:2BYTE 2:4BYTE 3:NBYTE --------
  29.                                         input        [15:0]  I_w5500_addr,                        // w5500 addr phase 16bit
  30.                                         input        [7:0]   I_w5500_ctl,                        // w5500 controlphase 8bit
  31.                                         input        [31:0]  I_w5500_wr_data,                // w5500 data        32bit   --------------------
  32.                                        
  33.                                         output  wire    O_rw_done,                            // write done /read done
  34.                                         output        [31:0]  O_w5500_rd_data,                // w5500 data        32bit
  35.                                         output          O_sck,                            // spi master clock out
  36.                                         output          O_sdo,                            // spi master data out (MOSI)
  37.                                         output  wire    O_scs,                                // spi cs
  38.                                         output  wire    O_ready,                        // spi master O_ready (idle)
  39.                                         output  wire    O_fifo_rd_en,
  40.                                         output  wire    O_data_rd_valid,
  41.                                        
  42.                                         input     [15:0]I_tx_length
  43.                                         );
  44. // =========================================================
  45. //
  46. parameter         BYTE_NUM_1        = 0;
  47. parameter        BYTE_NUM_2        = 1;
  48. parameter        BYTE_NUM_4        = 2;

  49. parameter        IDLE                = 0;
  50. parameter        STEP1                = 1;
  51. parameter        STEP2                = 2;
  52. parameter        STEP3                = 3;
  53. parameter        STEP4                = 4;
  54. // =========================================================
  55. //
  56. reg                                        spi_wr;
  57. reg                [31:0]                spi_tx_data;
  58. reg                [31:0]                w5500_rd_data_reg;
  59. reg                [2:0]                state;
  60. reg                [1:0]                spi_wr_len;
  61. reg                [1:0]                rw_reg;



  62. // =========================================================
  63. //
  64. wire                        spi_wr_done;
  65. wire        [31:0]        spi_rddata;
  66. wire            W_scs;
  67. wire    [14:0]  W_mspi_state;
  68. wire            sdo_tick;

  69. (*KEEP="TRUE"*) wire W_Nbyte_rd_done = (W_scs == 0 && W_mspi_state[4:0]==0 && sdo_tick == 1);


  70. assign                        O_scs        = (state==IDLE);
  71. (*KEEP = "TRUE" *)wire        rw_pos = (rw_reg[1:0] == 2'b01);//本时刻1上时刻0
  72. assign                        O_ready = (state==IDLE);
  73. assign                        O_rw_done = (state==STEP4);
  74. assign                        O_w5500_rd_data = w5500_rd_data_reg;
  75. assign                  O_fifo_rd_en = ((W_mspi_state[4:0]==30) && sdo_tick == 1);

  76. assign                  O_data_rd_valid = W_Nbyte_rd_done;

  77. // =========================================================
  78. //

  79. mspi mspi_inst (
  80.                         .I_clk                (        I_clk                        ),
  81.                         .I_reset        (        I_reset                        ),
  82.                         .I_clk_div        (        4                               ),
  83.                         .I_wr                (        spi_wr                    ),
  84.                         .I_wr_len        (        spi_wr_len            ),
  85.                         .O_wr_done        (        spi_wr_done            ),
  86.                         .I_wrdata        (        spi_tx_data            ),
  87.                         .O_rddata        (        spi_rddata            ),
  88.                         .O_sck                (        O_sck                        ),
  89.                         .I_sdi                (        I_sdi                        ),
  90.                         .O_sdo                (        O_sdo                        ),
  91.                         .O_scs                (        W_scs                         ),
  92.                         .O_ready        (                                    ),
  93.                         .O_state    (   W_mspi_state    ),
  94.                         .O_sdo_tick (   sdo_tick        ),
  95.                         .I_tx_length(   I_tx_length     )
  96.     );

  97. // ---------------------------------------------------------
  98. //
  99. always @(posedge I_clk or posedge I_reset)
  100. if(I_reset)
  101.   rw_reg  <= 0;
  102. else
  103.   rw_reg  <= {rw_reg[0],I_rw};
  104. // ---------------------------------------------------------
  105. //
  106. always @(posedge I_clk or posedge I_reset)
  107. if(I_reset)
  108.         begin
  109.                 state <= IDLE;
  110.                 spi_wr <= 0;
  111.                 spi_tx_data <= 0;
  112.                 spi_wr_len <= 0;
  113.                 w5500_rd_data_reg <= 0;
  114.         end
  115. else case(state)
  116.         IDLE:    //0state
  117.                 if(rw_pos)
  118.                         begin
  119.                                 state <= STEP1;
  120.                                 spi_wr <= 0;
  121.                                 spi_tx_data <= 0;
  122.                                 spi_wr_len <= 0;
  123.                         end
  124.         STEP1: //写入数据
  125.                 begin
  126.                         spi_wr <= 1'b1;
  127.                         spi_tx_data[31:16] <= I_w5500_addr[15:0];
  128.                         spi_tx_data[15:0] <= 0;
  129.                         spi_wr_len <= BYTE_NUM_2;                        // 地址段 16bit
  130.                         if(spi_wr_done)
  131.                                 begin
  132.                                         state <= STEP2;
  133.                                         spi_wr <= 0;
  134.                                 end
  135.                 end
  136.         STEP2:
  137.                 begin
  138.                         spi_wr <= 1'b1;
  139.                         spi_tx_data[31:24] <= I_w5500_ctl[7:0];
  140.                         spi_tx_data[23:0] <= 0;
  141.                         spi_wr_len <= BYTE_NUM_1;                        // 控制段 8bit
  142.                         if(spi_wr_done)
  143.                                 begin
  144.                                         state <= STEP3;
  145.                                         spi_wr <= 0;
  146.                                 end
  147.                 end
  148.         STEP3:
  149.                 begin//-------------------------------状态机做出改变
  150.                         spi_wr <= 1'b1;
  151.                         spi_tx_data[31:0] <= I_w5500_wr_data[31:0];
  152.                         spi_wr_len <= I_w5500_data_len;                // 数据段  0:1BYTE 1:2BYTE 2:4BYTE 3:NBYTE提供数据前要注意将有效位放至MSB
  153.                         if(spi_wr_done)
  154.                           begin
  155.                             state <= STEP4;
  156.                             spi_wr <= 0;
  157.                           end
  158.                        
  159.                         if(spi_wr_done || W_Nbyte_rd_done)
  160.                                 begin
  161.                                         if(I_w5500_data_len==0)
  162.                                                 begin
  163.                                                         w5500_rd_data_reg[31:24] <= spi_rddata[7:0];
  164.                                                         w5500_rd_data_reg[23:0]        <= 0;
  165.                                                 end
  166.                                         else if(I_w5500_data_len==1)
  167.                                                 begin
  168.                                                         w5500_rd_data_reg[31:16] <= spi_rddata[15:0];
  169.                                                         w5500_rd_data_reg[15:0]        <= 0;
  170.                                                 end
  171.                                         else
  172.                                                 begin
  173.                                                         w5500_rd_data_reg[31:0] <= spi_rddata[31:0];
  174.                                                 end
  175.                                 end
  176.                 end
  177.         STEP4:
  178.                 begin
  179.                         state <= IDLE;
  180.                         spi_wr <= 0;
  181.                         spi_tx_data <= 0;
  182.                         spi_wr_len <= 0;
  183.                 end
  184.         default:
  185.                 begin
  186.                         state <= IDLE;
  187.                         spi_wr <= 0;
  188.                         spi_tx_data <= 0;
  189.                         spi_wr_len <= 0;
  190.                         w5500_rd_data_reg <= 0;
  191.                 end
  192.         endcase

  193.        

  194. endmodule
复制代码

所有资料51hei提供下载:
rtl.zip (3.78 KB, 下载次数: 39)

评分

参与人数 1黑币 +5 收起 理由
xiuxi2007 + 5

查看全部评分

回复

使用道具 举报

无效楼层,该帖已经被删除
TABURISD 发表于 2018-6-10 15:45 | 显示全部楼层
感谢分享
回复

使用道具 举报

liucheng1973 发表于 2018-7-3 13:31 | 显示全部楼层
可以参考,不错
回复

使用道具 举报

xiuxi2007 发表于 2018-7-18 16:44 | 显示全部楼层
谢谢分享~~~
回复

使用道具 举报

a20061475 发表于 2018-9-6 11:29 | 显示全部楼层
..........................................学习一下
回复

使用道具 举报

填海wsp 发表于 2018-9-7 15:23 | 显示全部楼层
谢谢分享,fpga+w5500最大速度能够多大,希望能指导一下
回复

使用道具 举报

iamlangzi 发表于 2018-10-27 20:47 | 显示全部楼层
好东西啊
回复

使用道具 举报

yige569 发表于 2019-1-17 13:12 | 显示全部楼层
支持下,目前正在搞这个开发,参考下
回复

使用道具 举报

5102067070 发表于 2019-3-15 23:24 | 显示全部楼层
谢谢分享.
回复

使用道具 举报

5102067070 发表于 2019-3-15 23:25 | 显示全部楼层
fpga+w5500最大速度能够到多少?能不能达到10MB/S
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51黑电子论坛5群 联系QQ:125739409;技术交流QQ群174280738

Powered by 单片机教程网

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