SPI协议,大佬们讲得很多,但总感觉没有讲到小白的痛处,比如:极性和相位
极性指的是空闲状态下时钟的电平状态,这个很好理解,verilog代码也很好实现,
比如,极性为0,表示空闲状态下时钟的电平为低,verilog代码只需要将时钟寄存器的初始值设为0即可,反之亦然;
相位为0,表示在数据在时钟的第一个跳变沿被采集,啥意思?小白在这里就懵了,更别说写代码了,
以极性为0举例,假设极性为0,相位为0,那么,数据将在spi时钟的第一个跳变沿被采集,换言之,数据将在spi时钟的上升沿被采集,代码如何实现?
假设我要写一个主机,要实现数据将在spi时钟的上升沿被采集,那么,主机就必须让需要发出的数据在spi时钟的下降沿改变,为何?
你想啊,从机需要在spi时钟的上升沿采集数据,那么,数据线上的数据在spi时钟的上升沿到来之前肯定得稳定才行吧?如何做到?很简单,知己下降发送数据,从机上升沿采集数据嘛,这样一来,不久完美解决?
参考米联客的SPI例程,写得还是挺好的,我稍加了修改。
由于SPI接收比较简单,代码就不放出来了,这里介绍一下SPI接收模块的代码

module master_spi_tx#
(parameter SYS_CLK = 50_000_000,   //我添加的,为了使用不同板子parameter SPI_CLK = 100_000,    //我添加的,为了使用不同板子parameter CPOL = 1'b0,parameter CPHA = 1'b0
)
(input clk_i,output spi_tx_o,//mosioutput spi_clk_o,//SPI 时钟输出SCKinput  spi_tx_en_i,//发送发送使能信号input [7:0] spi_tx_data_i,//待发送数据//output spi_en_o,//SPI 传输使能output spi_cs_o, //这是我添加的,为了适应操作FLASHoutput spi_busy_o//SPI正在传输,高代表忙
);//SPI时钟分频单元//parameter [9:0] SPI_DIV     = 10'd499;//分频 假设(50Mhz/100K/ - 1'b1=499
parameter SPI_DIV  = SYS_CLK/SPI_CLK - 1;
parameter SPI_DIV1 = SPI_DIV/2;
parameter PSET     = CPHA ? 1'b1 : 1'b0;reg [9:0] clk_div = 10'd0;
reg spi_en = 1'b0;    //标志spi正在传输一个字节数据always@(posedge clk_i)beginif((clk_div < SPI_DIV) && spi_en)   clk_div <= clk_div + 1'b1;else clk_div <= 10'd0;
end
//产生SPI时钟
wire clk_en1 = (clk_div == SPI_DIV1)&&(!clk_end);//n
wire clk_en2 = (clk_div == SPI_DIV);//preg spi_clk = 1'b0;
always@(posedge clk_i)beginif(spi_tx_en_i)spi_clk <= 1'b0;else if(clk_en2) spi_clk <= 1'b0;else if(clk_en1)spi_clk <= 1'b1;
endwire spi_strobe = CPHA ? clk_en1 : clk_en2 ;    //主机发送数据的时机//SPI发送数据
reg [3:0] tx_cnt = 4'd0;
reg [7:0] spi_tx_data_r=8'd0;
assign spi_tx_o = spi_tx_data_r[7];
wire clk_end = (clk_div == SPI_DIV1)&&(tx_cnt==4'd8);
reg pcnt = 1'b0;
always@(posedge clk_i)begin
//首先当发送使能有效,寄存数据if(spi_tx_en_i) beginspi_en <= 1'b1;spi_tx_data_r <= spi_tx_data_i;endelse if(!spi_en)begin//当bps_start_en为0让状态机处于停止状态spi_tx_data_r <= 8'b1111_1111;tx_cnt <= 4'd0;pcnt   <= 1'd0;end
// 通过移位发送数据if(clk_end)begintx_cnt <= 4'd0;spi_en <= 1'b0;endelse beginif(clk_en1&&spi_en)tx_cnt <= tx_cnt + 1'b1;if(spi_strobe)beginif(pcnt < PSET )pcnt <= 1'b1;else spi_tx_data_r[7:0] <= {spi_tx_data_r[6:0],spi_tx_data_r[7]};end  end
end   assign spi_busy_o = spi_en;
//assign spi_en_o = spi_en;
assign spi_cs_o = ~spi_en;
assign spi_clk_o = (CPOL == 1'b1) ? ~spi_clk : spi_clk;endmodule

看仿真

小小白对SPI的理解,基于米联客例程的FPGA实现相关推荐

  1. 基于米联客zynq7020的fpga实现的帧差法

    博主是一个年初刚刚接触FPGA的新人,说实话觉得自己还是挺水的.上年的12月份刚刚了解了什么是FPGA,然后就参加了一个叫全国大学生集成电路创新大赛的比赛,里面的robei杯(当然可以后续和我交流一下 ...

  2. FPGA运动目标检测,基于米联客FDMA设计开发,A7和zynq两个版本

    FPGA运动目标检测,基于米联客FDMA设计开发,A7和zynq两个版本 开发环境如下: 纯FPGA开发板:米联客MA703FA,A7-35T的FPGA: ZYNQ开发板:米联客MZ7100FA,zy ...

  3. 基于米联客MA703FA开发板的MicroBlaze LWIP千兆以太网例程

    Xilinx FPGA MicroBlaze使用AXI 1G/2.5G Ethernet Subsystem(= Tri Mode Ethernet MAC + AXI Ethernet Buffer ...

  4. 米联客资料笔记FPGA篇EDA先锋工作室官方DOC常用TestBench模板Vivado基本使用

    文章目录 背景 一.米联客verilog篇笔记 1.为什么要推出vivado 2.状态机,软核的理解 3.always @的含义与 @() 4.条件运算符 5.阻塞逻辑和非阻塞逻辑混用 二.xilin ...

  5. 米联客udp_stack以太网协议栈使用教程

    实验室有一块米联客出的Kintex-7的板子,被我用来做毕业设计,其中使用到了千兆以太网的外设,于是打算使用米联客自己教程中所使用的协议栈来开发千兆以太网通信,接着就接触到了米联客的教程udp_sta ...

  6. 米联客PCIE的读写

    需求:对FPGA的内存进行读写 FPGA内存类型 FPGA 类型 读写区分 DDR H2c句柄写,c2h句柄读 BMAR User句柄读写 3.PCIE的配置 Win7.win10下打开与关闭测试模式 ...

  7. 基于zynq的千兆网udp项目_米联客 ZYNQ/SOC 精品教程 S05-CH05 PS 千兆 UDP 加速

    软件版本:VIVADO2017.4 操作系统:WIN10 64bit 硬件平台:适用米联客 ZYNQ系列开发板 米联客(MSXBO)论坛:www.osrc.cn答疑解惑专栏开通,欢迎大家给我提问!! ...

  8. 米联客 ZYNQ/SOC 精品教程 S02-CH29 基于TCP的QSPI Flash bin文件网络烧写

    软件版本:VIVADO2017.4 操作系统:WIN10 64bit 硬件平台:适用米联客 ZYNQ系列开发板 米联客(MSXBO)论坛:www.osrc.cn答疑解惑专栏开通,欢迎大家给我提问!! ...

  9. w ndows相机控制协议,米联客(MSXBO)USB3.0 UVC摄像头实现基于FT602Q芯片方案

    硬件平台:适用XILINX 7系列FPGA(没有USB3.0接口的开发板需要购买FEP USB3.0子卡) 米联客(MSXBO)技术社区: www.uisrc.com 欢迎大家给我提问!! 米联客技术 ...

最新文章

  1. 大有可为的“正则表达式”(二)
  2. C#用 SendKyes 结合 Process 或 API FindWindow、SendMessage(PostMessage) 等控制外部程序
  3. [ NOIP 2008 ] TG
  4. symbol(s) not found for architexture i386 报错
  5. 机器学习-关联之FP-Growth算法原理及实战
  6. nginx 安装失败 没有/etc/nginx目录
  7. 关于C#中的get与set函数
  8. 最新51单片机GPS解码程序
  9. im即时通讯源码+软件+app附详细封装视频搭建教程
  10. 专业SMT贴片螺母生产厂家|支持贴片螺母非标定制符合产品要求
  11. 怎么在html中把3个单元格合并成2个,Excel表格怎么将一个单元格拆分成2个?将多个单元合并成一个的方法...
  12. Java for Android 基础API整理
  13. simulink仿真结果出现振荡
  14. JZYZOJ 1382 光棍组织 状压dp
  15. 人工智能Java SDK:声纹识别
  16. Win10怎么默认用Windows照片查看程序打开图片
  17. “墨子”升空 首席科学家谈中国量子通信技术
  18. 史上最牛mysql-06 (多表连接)
  19. 【转】桌面背景文件夹-win7文件夹背景,文件夹背景
  20. linux下swf播放工具

热门文章

  1. 详解:strerror函数:将错误码转化为错误信息
  2. pikachu靶场通关记录
  3. Gaea:小米基于 MySQL 协议的数据库中间件
  4. 西工大 计算机科学与工程系,西北工业大学
  5. 指定nacos配置文件格式为yml格式
  6. 重装系统后QQ聊天记录导入
  7. 获取微信公众号的所有历史文章
  8. 负折射率波导matlab,第二章-理想平板介质光波导中的光传播特性及仿真-终版.pdf...
  9. JOSN数据格式—JOSN是什么
  10. http协议建立在以下哪一个协议的基础上_太厉害了,终于有人能把HTTP 协议讲的明明白白了