FPGA构造spi时序——AD7176为例(转)
reference:https://blog.csdn.net/fzhykx/article/details/79490330
项目中用到了一种常见的低速接口(spi),于是整理了一下关于spi相关的知识,与AD采样的芯片7176通信的协议为spi
一.对spi协议的理解
spi扫盲
除了供电、接地两个模拟连接以外,SPI总线定义四组数字信号:
- 接口时钟SCLK(Serial Clock,也叫SCK、CLK),master输出至slave的通讯时钟。
- MOSI( Master Output Slave Input,也叫SIMO、MTSR、DI、DIN、SI)自master输出至slave的数据线。
- MISO (Master Input Slave Output,也叫SOMI、MRST、DO、DOUT、SO)自slave输出至master的数据线。
- SS(Slave select,也叫nSS、CS、CSB、CSN、EN、nSS、STE、SYNC)master对slave的片选信号,自master输出至slave,低有效。
SPI接口是一种典型的全双工接口,通过同步时钟SCLK的脉冲将数据一位位地传送。所以在开始通讯前,master首先要配置接口时钟(确定其通讯频率是SLAVE可以支持的,通常为数兆赫兹)。
当MASTER片选一个SLAVE时,每向SLAVE发送一个周期的SCLK信号,都会有1bit的数据从MOSI发送至slave,与此同时,slave每收到一个周期的SCLK信号,都会从MISO向master发送1bit的数据。这种全双工通讯,是由硬件保证的(MASTER与HOST中各有一个移位寄存器作为收发数据的缓存)。
二.AD7176使用简单说明
1>写入与读入方法
对于FPGA为master而言,要注意SCLK下降沿发数给AD7176,上升沿读AD7176的数。在写入的时候,先用SPI时序,写入一个8bits的CMD,CMD就是通信寄存器,负责控制写入还是读出和要通信的寄存器名称,随后写写入8bit/16bit/24bit的数据。
在读数据的时候也需要通过通信寄存器也就是CMD读取,要规定好读数据和读哪个寄存器的值。
2>AD7176配置流程
具体寄存器还需要查看手册具体配置。
三.程序源代码讲解
1>程序源码
`timescale 1ns / 1ps // // Company: // Engineer: // // Create Date: 2017/03/10 11:08:45 // Design Name: // Module Name: spi_core // Project Name: // Target Devices: // Tool Versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // //module spi_core(input clk,//50Minput rst,input [7:0] din, //要输出input s_valid, //要输出input[1:0] readnum,//指示指令读取数据的长度 2’b00:0,2'b01:8,2'b10:256,2'b11:1664480(320*257*2)output spi_ready,output [23:0] dout,output m_valid,input cfg_finsih,input spi_miso,output spi_mosi,output spi_cs,output spi_clk,output empty); /* 本模块只完成SPI协议所规定的时序,不涉及FLASH指令的编写 */ parameter IDLE = 3'd0; parameter S1 = 3'd1; parameter S2 = 3'd2; parameter S3 = 3'd3; parameter S4 = 3'd4; parameter S5 = 3'd5; parameter S6 = 3'd6; parameter Smid =3'd7; reg [2:0] sta_spi; reg spi_ready_r; reg spi_clk_r; reg spi_cs_r; reg spi_mosi_r;wire wr_en; reg rd_en; wire dout_fifo; //wire empty; wire full; wire[14:0] rd_count;assign spi_clk = spi_clk_r; assign spi_cs = spi_cs_r; assign spi_mosi = dout_fifo;//spi_mosi_r; assign spi_ready = spi_ready_r; assign wr_en = s_valid; //fifo_generator_0 fifo_generator_0 ( //.rst(~rst), // input wire rst //.wr_clk(clk), // input wire wr_clk //.rd_clk(clk), // input wire rd_clk //.din(din), // input wire [7 : 0] din //.wr_en(wr_en), // input wire wr_en //.rd_en(rd_en), // input wire rd_en //.dout(dout_fifo), // output wire [0 : 0] dout //.full(full), // output wire full //.empty(empty), // output wire empty //.rd_data_count(rd_count) //); fifo_generator_0 fifo_generator_0 (.clk(clk), // input wire clk.srst(~rst), // input wire srst.din(din), // input wire [7 : 0] din.wr_en(wr_en), // input wire wr_en.rd_en(rd_en), // input wire rd_en.dout(dout_fifo), // output wire [0 : 0] dout.full(full), // output wire full.empty(empty) // output wire empty // .rd_data_count(rd_count) // output wire [15 : 0] rd_data_count ); reg recv_reg; reg recv_ok; reg [20:0] recv_num; reg [20:0] NUM; always @(posedge clk) beginif(~rst)beginsta_spi <= IDLE;spi_clk_r <= 1'b1;spi_cs_r <= 1'b1;spi_mosi_r <=1'b0;rd_en <= 1'b0;recv_reg <= 1'b0;recv_ok <= 1'b0;spi_ready_r <= 1'b0;recv_num <= 21'd0;endelse begincase(sta_spi)IDLE:begin recv_ok <= 1'b0;recv_num <= 21'd0;spi_clk_r <= 1'b1; if(~empty)beginrd_en <= 1'b1;sta_spi <= S1;spi_ready_r <= 1'b0;endelsespi_ready_r <= 1'b1;endS1:beginrd_en <= 1'b0;spi_clk_r <= 1'b0;spi_cs_r <= 1'b0;spi_mosi_r <= dout_fifo;sta_spi <= S2;endS2:beginspi_clk_r <= 1'b1; // sta_spi <= S3;if(~empty)beginrd_en <= 1'b1;sta_spi <= S1; end // else if(empty) // spi_cs_r<=1'b1; else if(readnum!=2'b00) //就是要读数的意思sta_spi <= S4;elsesta_spi <= S3; endS3:beginsta_spi <= IDLE;spi_clk_r <= 1'b0;spi_cs_r <= 1'b1;endS4:beginspi_clk_r <= 1'b0;recv_ok <= 1'b0;sta_spi <= S5;endS5:beginspi_clk_r <= 1'b1;recv_num <= recv_num +1'b1;recv_reg <= spi_miso;recv_ok <= 1'b1; if(recv_num!=NUM)sta_spi <= S4;else beginsta_spi <= IDLE;spi_cs_r <= 1'b1;endendendcaseend endalways @(posedge clk) beginif(~rst)NUM <= 21'd0;else begincase(readnum)2'b00:NUM <= 21'd0;2'b01:NUM <= 21'd7;2'b11:NUM <= 21'd23;endcaseend end reg [23:0] dout_r; reg m_valid_r; reg [3:0] cnt_bit; always @(posedge clk) beginif(~rst)begindout_r <= 16'd0;m_valid_r <= 1'b0;cnt_bit <= 4'd0;endelse if(recv_ok)begin//m_valid_r <= 1'b0;dout_r <= {dout_r[22:0],recv_reg};cnt_bit <= cnt_bit + 1'b1;if(cnt_bit==4'd15)m_valid_r <= 1'b1;elsem_valid_r <= 1'b0;endelsem_valid_r <= 1'b0; end assign dout = dout_r; assign m_valid = m_valid_r;/*********************************/ endmodule
2>软件仿真时序
配置过程也就是FPGA用SPI输出过程,每次片选信号CS拉低,下降沿发数
3>读数阶段软件仿真
波形也和手册的时序相对应
转载于:https://www.cnblogs.com/limanjihe/p/9814697.html
FPGA构造spi时序——AD7176为例(转)相关推荐
- 【FPGA】SPI协议
1.SPI简介 SPI(Serial Perripheral Interface, 串行外围设备接口)是 Motorola 公司推出的一种同步串行接口技术.SPI 总线在物理上是通过接在外围设备微控制 ...
- 【FPGA】SPI协议详解及对flash读写操作
FPGA基于SPI实现对flash读写操作 概括 一.SPI协议.flash讲解 1.SPI协议 2.flash (1)WREN (2)RDID (3)WRSR (4)READ (5)PP (6)SE ...
- 基于FPGA的SPI FLASH控制器设计
1.SPI FLASH的基本特征 本文实现用FPGA来设计SPI FLASH,FLASH型号为W25Q128BV.支持3种通信方式,SPI.Dual SPI和Quad SPI.FLASH的存储单元无法 ...
- 如何实现复杂FPGA设计的时序收敛
"打鼹鼠"是一个古老(电子时代之前)的休闲游戏.在桌面上有许多洞,每个洞里都藏着鼹鼠.当有鼹鼠从洞里钻出来时,你就用锤子打它,让鼹鼠退回洞里,你因此而得分.当鼹鼠返回洞里时,又有一 ...
- 基于FPGA的 SPI通信 设计(1)
引言 低速通信目前搞过 UART串口通信.IIC通信.其实 SPI 也算是中低速(有时也可以用作高速通信)串行通信的范畴,但是一直还没真正实现过,所以此系列就 SPI的协议以及FPGA设计作几篇博客记 ...
- XR20M1170实现FPGA 的SPI/IIC转UART
最近基于FPGA实现UART通讯,因为项目中UART的各项参数需要可配置,使用verilog直接实现一个UART会麻烦一些,稳定性也会降低,因此使用了更为方便的方案,FPGA加上一块SPI/IIC转U ...
- spi四种工作模式时序图_SPI总线协议及SPI时序图详解
嵌入式linux QQ交流群:175159209,欢迎爱好者加入交流技术问题! SPI,是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接口.SPI,是一种 ...
- 在ARM Linux下使用GPIO模拟SPI时序详解
Author:杨正 Data:2016.1.1 Mail:yz2012ww@gmail.com 一. 概述 SPI是英文SerialPeripheral Interface的缩写,顾名 ...
- 基于FPGA实现SPI接口(配置或通信)
基于FPGA实现SPI接口(配置或通信总线) 1)总线简介 串行外设接口(SPI)是微控制器(FPGA)和外围IC(如传感器.ADC.DAC.移位寄存器.SRAM等)之间使用最广泛的接口之一.主要用于 ...
最新文章
- VS(Visual Studio)中快速找出含中文的字符串
- 详解shuffle过程(转载)
- 【转】采购订单行项目检查增强
- ffmpeg音视频基础知识
- 【转】掀起Azure AD的盖头来——深入理解Microsoft Graph应用程序和服务权限声明
- 中国光伏新增装机容量猛增
- 2.windows-and-mac在控制台创建ASP.NET-Core应用程序
- MySQL驱动包下载
- Android权限设置引导
- masm5安装教程_MASM5.0汇编器使用
- 面对局域网用户滥用网络执法官,p2p终结者等网管软件的破解方法
- Win10提示未插入扬声器或耳机
- python中怎么压缩文件_如何使用Python实现文件压缩?
- matlab标定工具安装,标定工具(matlab仿真工具)
- 数据恢复国赛经验与方法分享(电子产品芯片级检测维修与数据恢复赛项)
- 奇葩算法系列——猴子排序
- yolo+ocr集装箱字符识别(pytorch版本)
- boss直聘改回系统头像_Boss直聘VS猎聘,谁的营销广告更胜一筹
- 计算文件及字符串的VBS脚本
- 2020 年百度之星·程序设计大赛 - 初赛一题解
热门文章
- SAP Marketing cloud里的campaign管理
- SAP Marketing Cloud的技术架构
- 如何用JavaScript实现2+2=5? 1
- Tecplot 360 按教程安装完毕后,弹出“Is your Tecplot 360 EX liense valid?”【终极解决办法】
- mate 树莓派4b安装ubuntu_树莓派4B安装安装Ubuntu Mate 16.04
- 如何定义一个类对象并用next()的方法使用_深入理解-可迭代对象、迭代器(20个为什么)...
- tstringlist怎么查看是否存在该数据_财务报表审计该如何进行?
- c语言exit_C语言实现2048
- python如何安装wordcloud_不知如何利用Python中wordcloud的安装和使用?这里手把手教你...
- c++ 方向_GE医疗C型臂系列手术机设备全球装机量破万