[X]关闭

[米联客-XILINX-H3_CZ08_7100] FPGA基础篇连载-16 SPI LOOP环路实验

文档创建者:FPGA课程
浏览次数:270
最后更新:2024-08-27
文档课程分类-AMD-ZYNQ
AMD-ZYNQ: ZYNQ-FPGA部分 » 2_FPGA实验篇(仅旗舰) » 1-FPGA基础入门实验
本帖最后由 FPGA课程 于 2024-8-27 17:15 编辑

​软件版本:VIVADO2021.1
操作系统:WIN10 64bit
硬件平台:适用 XILINX A7/K7/Z7/ZU/KU 系列 FPGA
实验平台:米联客-MLK-H3-CZ08-7100开发板
板卡获取平台:https://milianke.tmall.com/
登录“米联客”FPGA社区 http://www.uisrc.com 视频课程、答疑解惑!

1概述
在前面完成了SPI发送驱动程序、SPI接收驱动程序设计,本文对前面的SPI收发驱动做一个环路测试,通过仿真,以及在线仿真的方式验证SPI的收发应用。
本文将在前面课程的基础上完成,包括采用前面课程编写SPI发送驱动和接收驱动。
2SPI环路程序设计2.1系统框图
以下给出系统框图,关于各个模块的详细描述请看前面的实验。本实验中短接SPI发送模块和接收模块的SCLK和MOSI和MISO,并且在芯片内部通过在线逻辑分析仪在线观察结果
90fa4b6933d5450bb849a623297ba03d.jpg
2.2SPI数据发送状态机
在本实验中,TX发送状态机中增加spi_ss控制,该信号用于spi接收模块的数据的启动接收和停止接收控制

  1. /*********************SPI环路测试*********************
  2. 1. I_spi_miso接收驱动,用于接收串口数据,当spi_rvalid代表接收驱动接收到了总线的有效数据
  3. 2. O_spi_mosi发送驱动,用于发送数据,当spi_tx_req为高电平,请求发送数据环路测试中*********************************************************************/

  4. `timescale 1ns / 1ps//仿真时钟刻度和精度

  5. module spi_master#
  6. (
  7. parameter CLK_DIV = 10        
  8. )
  9. (
  10. input  I_sysclk_p,
  11. input  I_sysclk_n,                                                     //系统时钟
  12. input  I_rstn,                                                       //全局复位      
  13. output O_spi_sclk,                                                   //SPI MASTER输出时钟
  14. input  I_spi_sclk,                                                   //SPI Slave 输入时钟
  15. output O_spi_mosi,                                                   //SPI MASTER输出数据
  16. input  I_spi_miso,
  17. output O_card_power_en                                                  //SPI Slave 输入数据
  18. );

  19. assign O_card_power_en = 1'b1; //子卡上电

  20. wire I_clk;
  21. IBUFGDS CLK_U(
  22. .I(I_sysclk_p),
  23. .IB(I_sysclk_n),
  24. .O(I_clk)
  25. );

  26. wire        spi_busy;
  27. reg         spi_tx_req;
  28. reg [7:0]   spi_tx_data;
  29. reg [1:0]   M_S;

  30. reg         I_spi_ss;/*synthesis keep*/
  31. wire        spi_rvalid;/*synthesis keep*/
  32. wire[7:0]   spi_rdata;/*synthesis keep*/

  33. reg [10:0]  delay_cnt;
  34. wire        delay_done;


  35. assign delay_done = delay_cnt[10];                         //复位延时计数


  36. always @(posedge I_clk or negedge I_rstn) begin       //异步复位
  37.     if(!I_rstn)
  38.         delay_cnt <=0;                                       //复位来的是,时钟清零
  39.     else if(delay_cnt[10] == 1'b0)                //当delay_cnt[10]等于1时,计数清零,不满足就自+1
  40.         delay_cnt <= delay_cnt + 1'b1;
  41.     else
  42.         delay_cnt <= 0;                                 //达到预期值,计数清零
  43. end


  44. always @(posedge I_clk or negedge I_rstn) begin         //spi发送状态机
  45.     if(!I_rstn) begin
  46.         I_spi_ss    <= 1'b1;
  47.         spi_tx_req  <= 1'b0;
  48.         spi_tx_data <= 8'd0;
  49.         M_S         <= 2'd0;
  50.     end
  51.     else begin
  52.         case(M_S)
  53.         0:if(delay_done&&(!spi_busy))begin          //延时完成且SPI传输非忙
  54.             I_spi_ss <= 1'b1;                        //拉高I_spi_ss信号,启动spi接收模块的数据的接收
  55.             M_S <= 2'd1;                              //从初始状态转入状态1
  56.         end
  57.         1:if(delay_done&&(!spi_busy))begin         
  58.             I_spi_ss <= 1'b0;                        //启动后,将  I_spi_ss信号复原
  59.             M_S <= 2'd2;
  60.         end
  61.         2:if(delay_done&&(!spi_busy))begin          //总线不忙启动传输
  62.            spi_tx_req  <= 1'b1;                       //req信号拉高,准备发送
  63.            spi_tx_data <= spi_tx_data + 1'b1;        //测试数据
  64.            M_S <= 2'd3;
  65.         end
  66.         3:if(spi_busy)begin                           //如果spi总线忙,清除spi_tx_req
  67.            spi_tx_req  <= 1'b0;
  68.            M_S <= 2'd0;
  69.         end
  70.         default:M_S <= 2'd0;
  71.         endcase
  72.     end  

  73. end   


  74. //spi master tx控制器例化
  75. uimspi_tx#
  76. (
  77. .CLK_DIV(CLK_DIV),
  78. .CPOL(1'b0),
  79. .CPHA(1'b0)
  80. )
  81. uimspi_tx_inst(
  82. .I_clk(I_clk),
  83. .I_rstn(I_rstn),
  84. .O_spi_mosi(O_spi_mosi),
  85. .O_spi_sclk(O_spi_sclk),
  86. .I_spi_tx_req(spi_tx_req),
  87. .I_spi_tx_data(spi_tx_data),
  88. .O_spi_busy(spi_busy)
  89. );


  90. //spi rx控制器例化
  91. uispi_rx#
  92. (
  93. .BITS_LEN(8),
  94. .CPOL(1'b0),
  95. .CPHA(1'b0)
  96. )
  97. uispi_rx_inst(
  98. .I_clk(I_clk),
  99. .I_rstn(I_rstn),
  100. .I_spi_clk(I_spi_sclk),
  101. .I_spi_rx(I_spi_miso),
  102. .I_spi_ss(I_spi_ss),
  103. .O_spi_rvalid(spi_rvalid),
  104. .O_spi_rdata(spi_rdata)
  105. );


  106. ila_0 ila_0(
  107. .clk(I_clk),
  108. .probe0(spi_rvalid),
  109. .probe1(spi_rdata)
  110. );



  111. endmodule
复制代码


3
FPGA工程
fpga工程的创建过程不再重复,如有不清楚的请
bf8248b2e31948fdb362b1a84210ef89.jpg
米联客的代码管理规范,在对应的FPGA工程路径下创建uisrc路径,并且创建以下文件夹
01_rtl:放用户编写的rtl代码
02_sim:仿真文件或者工程
03_ip:放使用到的ip文件
04_pin:放fpga的pin脚约束文件或者时序约束文件
05_boot:放编译好的bit或者bin文件(一般为空)
06_doc:放本一些相关文档(一般为空)
9c6f08b6a56f4f10b573b87dcbebaea2.jpg
4RTL仿真4.1仿真激励文件
仿真测试文件源码如下:
  1. `timescale 1ns / 1ps//定义仿真时间刻度/精度
  2. module master_spi_tb;
  3. localparam      CLK_TIME   =  'd10;//时钟周期,以ns为单位
  4. reg I_sysclk_p;
  5. reg I_sysclk_n;
  6. reg I_rstn;  
  7. wire O_spi_sclk;
  8. wire I_spi_sclk;
  9. wire O_spi_mosi;
  10. wire I_spi_miso;

  11. assign I_spi_miso = O_spi_mosi;//模拟数据回环
  12. assign I_spi_sclk = O_spi_sclk;//模拟时钟回环
  13. //例化顶层模块
  14. spi_master#
  15. (
  16. .CLK_DIV(100)   
  17. )
  18. spi_master_inst(
  19. .I_sysclk_p(I_sysclk_p),
  20. .I_sysclk_n(I_sysclk_n),
  21. .I_rstn(I_rstn),
  22. .O_spi_sclk(O_spi_sclk),
  23. .O_spi_mosi(O_spi_mosi),
  24. .I_spi_sclk(I_spi_sclk),
  25. .I_spi_miso(I_spi_miso)
  26. );
  27. initial begin
  28. //初始化REG寄存器
  29.     I_sysclk_p= 1'b0;
  30.     I_sysclk_n= 1'b1;///系统时钟
  31.     I_rstn = 1'b0;//复位
  32.     #100;
  33.     I_rstn = 1'b1;
  34. end

  35. always #(CLK_TIME/2) I_sysclk_p = ~I_sysclk_p;
  36. always #(CLK_TIME/2) I_sysclk_n = ~I_sysclk_n;     //产生主时钟

  37. endmodule
复制代码

4.2 RTL功能仿真
可以放大箭头所指位置,查看接收数据和发送数据是否一致,本实验只测试CHPA=0 CPOL=0的情况。
63dd6ff380f04a35b2f42354811f2723.jpg
5上板验证5.1 在线逻辑分析仪设置
添加在线逻辑分析仪,设置为Capture Control模式
2d045943563a4fc99176aaa201ecb3a1.jpg
5.2硬件连接
(该教程为通用型教程,教程中仅展示一款示例开发板的连接方式,具体连接方式以所购买的开发板型号以及结合配套代码管脚约束为准。)
本实验需要用到1.8V的FEP-BASE-CARD。请确保下载器和开发板已经正确连接,另外需要把核心板上的2P模式开关设置到JTAG模式,即ON ON,并且开发板已经上电。(注意JTAG端子不支持热插拔,而USB接口支持,所以在不通电的情况下接通好JTAG后,再插入USB到电脑,之后再上电,以免造成JTAG IO损坏)
外部环路需要实用跳线帽,CEP-GPIO接口中的IO可以用于完成本实验
9af9a4ffd7dd4bdd8ebd9dfe52d75966.jpg
b1064b4279794dc488fcddd59970e840.jpg
5.3在线调试结果
在线逻辑分析仪设置成BASIC模式,设置spi_rvalid为高电平的时候触发采集:
bc9efa873bb043f69caeb44f6adc5d32.jpg
调整数据格式为十进制,显示为SPI传输的连续的数字,符合我们工程
9e36a200f9a242dda5b57b0ddb7fa537.jpg

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

本版积分规则