文章原地址:

http://www.cnblogs.com/fhyfhy/p/4429302.html

SPI通信实验---verilog(FPGA作为从机,使用可读可写)

本实验讲究实用性,故设计思想为:主机先向从机发送地址,若是向从机写入数据,则向从机发送数据,若是读取从机数据,则向从机发送时钟,然后在时钟下降沿读取数据即可。cs信号上升沿作为SPI通信的结束信号。rom程序只是做测试使用。

每次发送16个时钟信号,前八个是地址和命令,后八个是数据。其中:前8个时钟接受的数据的最高位决定着这次通信是读取数据还是写入数据,最高位为1,则是读取数据,为0则是写入数据。

程序:

/********************************Copyright**************************************
**----------------------------File information--------------------------
** File name  :spi_slave_2.v
** CreateDate :2015.004
** Funtions   :spi通信试验。FPGA作为从机,与主机进行通信。先接收主机发来的地址,再根据地址最高位来判断是读数据还是些数据,然后从机是接收数据还是送出数据。地址最高位为高则是读取数据,否则为写数据.上升沿接收数据,下降沿发送数据
** Operate on :M5C06N3L114C7
** Copyright  :All rights reserved.
** Version    :V1.0
**---------------------------Modify the file information----------------
** Modified by   :
** Modified data :
** Modify Content:
*******************************************************************************/module  spi_slave_2  (clk,rst_n,spi_cs,spi_sck,spi_miso,spi_mosi,spi_over);input          clk;input          rst_n;input          spi_cs;input          spi_sck;input          spi_mosi;output   reg      spi_miso;output         spi_over;//-----------------------------//reg        spi_cs_2,spi_cs_1;reg        spi_sck_2,spi_sck_1;reg        spi_mosi_2,spi_mosi_1;wire       spi_cs_pos;wire       spi_cs_flag;wire       spi_sck_neg;wire       spi_sck_pos;wire       spi_mosi_flag;always @(posedge clk or negedge rst_n)beginif(!rst_n)begin{spi_cs_2,spi_cs_1} <= 2'b11;{spi_sck_2,spi_sck_1} <= 2'b00;{spi_mosi_2,spi_mosi_1} <= 2'b00;endelse begin{spi_cs_2,spi_cs_1} <= {spi_cs_1,spi_cs};{spi_sck_2,spi_sck_1} <= {spi_sck_1,spi_sck};{spi_mosi_2,spi_mosi_1} <= {spi_mosi_1,spi_mosi}; endendassign spi_cs_pos = ~spi_cs_2 &spi_cs_1;assign spi_cs_flag = spi_cs_2;assign spi_sck_neg = ~spi_sck_1&spi_sck_2;assign spi_sck_pos = ~spi_sck_2&spi_sck_1; assign spi_mosi_flag = spi_mosi_2;assign spi_over = spi_cs_pos;//----------------------------------------//localparam idel       = 4'd0;localparam rxd_addr   = 4'd1;localparam jude_wr_rd = 4'd2;localparam rxd_data   = 4'd3;localparam rxd_over   = 4'd4;localparam txd_data   = 4'd5;localparam txd_over   = 4'd6;localparam end_sta    = 4'd7;reg    [3:0]     state;reg    [3:0]     cnt;reg    [7:0]     raddr;reg    [7:0]     rdata;reg    [7:0]     tdata;reg              rover_flag;reg              wover_flag;reg              rd_flag;wire  [7:0]      data_out;always @(posedge clk or negedge rst_n)beginif(!rst_n)beginstate <= 4'd0;cnt <= 0;raddr <= 8'd0;rdata <= 8'd0;tdata <= 8'd0;rover_flag <= 0;wover_flag <= 0;rd_flag <= 0;spi_miso <= 1;endelse if(!spi_cs_flag)begincase(state)idel:beginstate <= rxd_addr;cnt <= 0;raddr <= 8'd0;rdata <= 8'd0;tdata <= 8'd0; rover_flag <= 0;wover_flag <= 0;rd_flag <= 0;spi_miso <= 1;endrxd_addr:beginif(cnt == 8)begincnt <= 0;state <= jude_wr_rd;endelse if(spi_sck_pos)begincnt <= cnt + 1;raddr[7 - cnt[2:0]] <= spi_mosi_flag;endendjude_wr_rd:beginif(raddr[7] == 1)state <= rxd_data;elsebeginstate <= txd_data;rd_flag <= 1;endendrxd_data:beginif(cnt == 8)begincnt <= 0;state <= rxd_over;endelse if(spi_sck_pos)begincnt <= cnt + 1;rdata[7 - cnt[2:0]] <= spi_mosi_flag;end                                endrxd_over:beginrover_flag <= 1;    state <= end_sta;endtxd_data:begintdata <= data_out;if(cnt == 8)begincnt <= 0;state <= txd_over;endelse if(spi_sck_pos)begincnt <= cnt + 1;spi_miso <= tdata[7 - cnt[2:0]];end                        endtxd_over:beginwover_flag <= 1;    state <= end_sta;    endend_sta:beginrover_flag <= 0;    wover_flag <= 0;    state <= end_sta;                              enddefault:state <= 4'd0;endcase      endelse beginstate <= 4'd0;cnt <= 0;raddr <= 8'd0;rdata <= 8'd0;tdata <= 8'd0;rover_flag <= 0;wover_flag <= 0;rd_flag <= 0;spi_miso <= 1;    endenddata_rom  data_rom_1 (.clk(clk),.rst_n(rst_n),.wr(rover_flag),.rd(rd_flag),.addr(raddr[6:0]),.data_in(rdata),.data_out(data_out));endmodule

ROM:

/********************************Copyright**************************************
**----------------------------File information--------------------------
** File name  :data_rom.v
** CreateDate :2015.04
** Funtions   : 简单的数据读写存储程序,配合测试
** Operate on :M5C06N3L114C7
** Copyright  :All rights reserved.
** Version    :V1.0
**---------------------------Modify the file information----------------
** Modified by   :
** Modified data :
** Modify Content:
*******************************************************************************/module  data_rom  (clk,rst_n,wr,rd,addr,data_in,data_out);input          clk;input          rst_n;input          wr;input          rd;input  [6:0]   addr;input  [7:0]   data_in;output reg [7:0]   data_out;reg  [7:0]  table_1   [7:0];wire [7:0]  table_2   [7:0];always @(posedge clk or negedge rst_n)beginif(!rst_n)begintable_1[7] <= 0;table_1[6] <= 0;table_1[5] <= 0;table_1[4] <= 0;table_1[3] <= 0;table_1[2] <= 0;table_1[1] <= 0;table_1[0] <= 0;data_out <= 0;endelse if(wr)begintable_1[addr] <= data_in;endelse if(rd)data_out <= table_1[addr];else begintable_1[7] <= table_1[7];table_1[6] <= table_1[6];table_1[5] <= table_1[5];table_1[4] <= table_1[4];table_1[3] <= table_1[3];table_1[2] <= table_1[2];table_1[1] <= table_1[1];table_1[0] <= table_1[0];data_out <= data_out;end endassign table_2[7] = table_1[7];    assign table_2[6] = table_1[6];    assign table_2[5] = table_1[5];    assign table_2[4] = table_1[4];    assign table_2[3] = table_1[3];    assign table_2[2] = table_1[2];    assign table_2[1] = table_1[1];    assign table_2[0] = table_1[0];    endmodule

测试程序:

 /********************************Copyright**************************************                           **----------------------------File information--------------------------** File name  :spi_slave_tb.v  ** CreateDate :2015.04** Funtions   :测试文件** Operate on :M5C06N3L114C7** Copyright  :All rights reserved. ** Version    :V1.0**---------------------------Modify the file information----------------** Modified by   :** Modified data :        ** Modify Content:*******************************************************************************/`timescale 1 ns/1 nsmodule  spi_slave_tb ;reg          clk;reg          rst_n;reg           spi_cs;reg           spi_sck;wire          spi_miso;reg           spi_mosi;wire          spi_over;spi_slave_2  spi_slave_2_1(.clk,.rst_n,.spi_cs,.spi_sck,.spi_miso,.spi_mosi,.spi_over);parameter tck = 24;parameter t = 1000/tck;always #(t/2) clk = ~clk;//-------------------------------/* 模仿spi主机的发送程序,这个task很好,仿顺序操作,可以直观的显示过程 */task  spi_sd;input [7:0]  data_in;begin#(5*t);spi_sck = 0; spi_mosi= data_in[7]; #(5*t);    spi_sck = 1; #(5*t);    //send bit[7]spi_sck = 0; spi_mosi= data_in[6]; #(5*t);    spi_sck = 1; #(5*t);    //send bit[6]spi_sck = 0; spi_mosi= data_in[5]; #(5*t);    spi_sck = 1; #(5*t);    //send bit[5]spi_sck = 0; spi_mosi= data_in[4]; #(5*t);    spi_sck = 1; #(5*t);    //send bit[4]spi_sck = 0; spi_mosi= data_in[3]; #(5*t);    spi_sck = 1; #(5*t);    //send bit[3]spi_sck = 0; spi_mosi= data_in[2]; #(5*t);    spi_sck = 1; #(5*t);    //send bit[2]spi_sck = 0; spi_mosi= data_in[1]; #(5*t);    spi_sck = 1; #(5*t);    //send bit[1]spi_sck = 0; spi_mosi= data_in[0]; #(5*t);    spi_sck = 1; #(5*t);    //send bit[0]spi_sck = 0;endendtaskinitial beginclk = 0;rst_n = 0;spi_cs = 1;spi_sck = 0;spi_mosi = 1;#(20*t) rst_n = 1; #(10*t);spi_cs = 0;spi_sd(8'h81);#(50*t);spi_sd(8'h04);#(50*t);#(50*t);spi_cs = 1;#(20*t);spi_cs = 0;                spi_sd(8'h01);#(50*t);spi_sd(8'h00);#(50*t);spi_cs = 1;endendmodule

仿真图:

图中可以看出,第一次输入8‘h81,意味着向01的地址写入数据。第二个数8’h04,则是要写入的数据。然后写入数据8‘h01,则意味着要读取01地址的数据,然后发送8个时钟则是再读取数据。

SPI通信实验---verilog(FPGA作为从机,使用可读可写)相关推荐

  1. STM32——SPI通信实验

    程序配置过程: 1.使能SPIx和IO口时钟: RCC_AHBxPeriphClockCmd()/RCC_APBxPeriphClockCmd(); 2.初始化IO口为复用功能: void GPIO_ ...

  2. spi通讯不需要地线吗_SPI通信时是不是主机和从机的MISO、MOSI两根线应该交叉接呀?...

    [吐槽]河北-河中草 朋友们,SPI通信时是不是主机和从机的MISO.MOSI两根线应该交叉接呀? [吐槽]辽宁-林中水滴 不交叉啊 mosi和mosi [吐槽]河北-河中草 直接接? [吐槽]辽宁- ...

  3. 【正点原子FPGA连载】第十四章 串口通信实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1

    1)实验平台:正点原子新起点V2开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609758951113 2)全套实验源码+手册+视频下载地址:ht ...

  4. 基于FPGA Uart串口通信实验

    基于FPGA Uart串口通信实验 首先需要了解uart串口通信协议,根据个人专业需求不同,了解的层面可以不同. UART简介 通用异步收发传输器(Universal Asynchronous Rec ...

  5. android spi串口调试,PIC入门3,SPI通信和串口调试实验

    原标题:PIC入门3,SPI通信和串口调试实验 MSSP模块工作于SPI主控方式,这个可以直接在实验板上执行. 程序: //适合3EPIC实验板,配置PIC的MSSP模块工作于SPI主控方式下, // ...

  6. 基于FPGA的UART串口通信实验(VHDL语言实现)

    一.前言: 最近在做UART串口通信的相关实验时,在网上查了很多资料,发现网上的大部分文章只注重理论,不注重代码,很多代码有错误不说,而且难以理解.故在完成此实验后,起了写一篇博客的心思,以供有想做相 ...

  7. 【正点原子FPGA连载】 第十七章 RS485串口通信实验 -摘自【正点原子】领航者ZYNQ之FPGA开发指南_V2.0

    1)实验平台:正点原子领航者ZYNQ开发板 2)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761 3)全套实验源码+手册+视频下 ...

  8. 优秀的 Verilog/FPGA开源项目介绍(七)- CAN通信

    优秀的 Verilog/FPGA开源项目介绍(七)- CAN 0.CAN总线介绍 <[科普]CAN总线介绍及FPGA实现方案简介> 1.CAN权威文档 CAN总线有两个ISO国际标准:IS ...

  9. 优秀的 Verilog/FPGA开源项目介绍(一)-PCIe通信

    优秀的 Verilog/FPGA开源项目介绍(一)-PCIe通信 今天开始会陆续介绍一些优秀的开源项目,项目基本都是和FPGA或HDL相关的.对于一些找工作或者急需项目经验的人来说,这些项目都有一定的 ...

最新文章

  1. 如何理解导远技术手册
  2. FTServer 1.1 发布,多语言全文搜索服务器
  3. phpmyadmin设置登录密码的几种方法
  4. 如何用github给开源贡献代码
  5. 美剧迷失_迷失(机器)翻译
  6. [Leetcode][第546题][JAVA][移除盒子][递归][动态规划]
  7. Linux 动态库和静态库
  8. SAP License:雾里看花系列——SAP应用应该更关注业务过程
  9. C#刀那儿特更清晰讲述什么是事件?
  10. 新特性:英特尔® 线程构建模块 4.2
  11. python中类的定义_python中类的概念
  12. TableView载入WebView的一些小技巧 By 徐
  13. 编译生成动态链接库pdfium.dll
  14. 计算机知识中h表达什么意思,计算机地基础知识hzh.ppt
  15. 服务器虚拟机解锁苹果,Unlocker(VMware虚拟机MacOS系统解锁工具)v3.0.2 免费版-ucbug软件站...
  16. Neo4j之导入CSV大文件 periodic commit
  17. 前端实现文件在线预览功能
  18. 项目落地 - 智能焊机,钢塑管(物联网技术应用)
  19. activity 所需jiar包
  20. 超火购车平台易车到底怎么样,为您解答

热门文章

  1. python写电商网站框架_Python学员感言:电商项目要先把框架搭起来
  2. SQL Server 连接查询(多表连接查询)
  3. windows中python虚拟环境_Windows下Python虚拟环境的配置
  4. 怎样得到对方的电脑名_吸引力法则让他想念你,让对方主动找你
  5. 计算机网络—数据链路层的流量控制与可靠传输机制(思维导图)
  6. [leetcode周赛]1346. 检查整数及其两倍数是否存在
  7. 人群与网络:网络与图论
  8. opencv 视频操作入门
  9. imregionalmax imregionalmin imextendedmax imextendedmin imhmax imhmin 函数的详解 matlab中函数
  10. 8086考试主要考的最小模式