久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10676|回復: 13
打印 上一主題 下一主題
收起左側

W5500網口芯片SPI傳輸時序 Verilog源碼

  [復制鏈接]
跳轉到指定樓層
樓主
基于Xilinx K7平臺的W5500 SPI傳輸時序
開發語言為Verilog
在硬件平臺上打通,實測沒問題
支持1字節/2字節/4字節/多字節讀寫


包含兩個文件: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, 下載次數: 160)


評分

參與人數 1黑幣 +5 收起 理由
xiuxi2007 + 5

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:346567 發表于 2018-6-10 15:45 | 只看該作者
感謝分享
回復

使用道具 舉報

板凳
ID:345500 發表于 2018-7-3 13:31 | 只看該作者
可以參考,不錯
回復

使用道具 舉報

地板
ID:374244 發表于 2018-7-18 16:44 | 只看該作者
謝謝分享~~~
回復

使用道具 舉報

5#
ID:394469 發表于 2018-9-6 11:29 | 只看該作者
..........................................學習一下
回復

使用道具 舉報

6#
ID:365754 發表于 2018-9-7 15:23 | 只看該作者
謝謝分享,fpga+w5500最大速度能夠多大,希望能指導一下
回復

使用道具 舉報

7#
ID:413964 發表于 2018-10-27 20:47 | 只看該作者
好東西啊
回復

使用道具 舉報

8#
ID:469623 發表于 2019-1-17 13:12 | 只看該作者
支持下,目前正在搞這個開發,參考下
回復

使用道具 舉報

9#
ID:164847 發表于 2019-3-15 23:24 | 只看該作者
謝謝分享.
回復

使用道具 舉報

10#
ID:164847 發表于 2019-3-15 23:25 | 只看該作者
fpga+w5500最大速度能夠到多少?能不能達到10MB/S
回復

使用道具 舉報

11#
ID:580853 發表于 2019-7-9 13:51 | 只看該作者
不錯的資料,
回復

使用道具 舉報

12#
ID:524609 發表于 2019-7-31 08:42 | 只看該作者
thanks a lot your sharing~~~
回復

使用道具 舉報

13#
ID:128381 發表于 2019-9-30 21:37 | 只看該作者
學習了,挺有用的
回復

使用道具 舉報

14#
ID:618921 發表于 2019-10-3 08:19 | 只看該作者
感謝分享,學習一下
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲一区成人 | a级黄色网 | 国产欧美在线观看 | 国产视频一区二区 | 亚欧午夜 | 91视频免费黄 | 国产精品中文在线 | 成人免费一区二区三区视频网站 | 久久久久亚洲精品 | 国产精品成人一区二区三区吃奶 | 国产精品毛片久久久久久 | 99精品久久 | 在线观看午夜视频 | 九色.com | 欧美日韩亚洲一区二区 | 拍拍无遮挡人做人爱视频免费观看 | 欧美一级在线免费观看 | 一级片免费观看 | 丝袜美腿一区二区三区 | 国产精品九九 | 欧美xxxx色视频在线观看免费 | 日韩av中文| av在线免费观看网站 | 国产激情视频网站 | 午夜视频免费 | 亚洲欧洲视频 | 欧美日韩在线电影 | 中文字幕精品一区二区三区精品 | 国产999在线观看 | 日韩欧美在线观看 | www国产成人免费观看视频 | 国产成人精品一区二区三区 | 成人一区二区三区在线观看 | 一道本视频 | 国产区在线视频 | 天天看天天操 | 日韩欧美在线观看 | 久草免费在线视频 | 国产一区精品在线 | 欧美13videosex性极品 | 中文字幕日本一区二区 |