Verilog实现的SPI通信

这篇具有很好参考价值的文章主要介绍了Verilog实现的SPI通信。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

SPI,Serial Peripheral Interface,串行外设接口,高速的、全双工、同步通信总线。SPI以主从方式工作,一般需要至少4根线(单向传输时可用3根):
(1)MISO– Master Input Slave Output,主设备数据输入,从设备数据输出;
(2)MOSI– Master Output Slave Input,主设备数据输出,从设备数据输入;
(3)SCLK – Serial Clock,时钟信号,由主设备产生;
(4)CS – Chip Select,从设备使能信号,由主设备控制。

SPI共有4种工作模式,常用的是模式0和模式3,具体如下:

Verilog实现的SPI通信

Verilog实现的SPI通信

 以下为Verilog实现的SPI主机程序,系统时钟为24MHz,分频成1MHz作为SCLK时钟。收发8位数据时,至少需要8个时钟,考虑到CS使能(作为同步信号)以及双向通信的需要,设置10个节拍。起始CS=0使能主机发送,此后1-8节拍按照从高位到低位时钟上升沿依次发送数据,同时在时钟下降沿1-8节拍,读取从机数据。

//非常简单的SPI通信协议,上升沿发送,下降沿接收。
//双工工作。CS=0使能发送。8位数据。无校验。
//实现功能:主机拨码开关控制从机LED,从机拨码开关控制主机LED
module SPI_Master (
    input   reset, //reset
    input   clk_24M, //时钟24M
    output  MOSI,  //主机发送
    input   MISO,  //主机接收
    input   [7:0] Data_SW , //发送的8位数据,开关实现
    output  CS,            //CS
    output  SCLK,          //SPI时钟
    output  [7:0] Data_LED  //接收的8位数据,发光管实现
);
    reg [7:0] rData_LED;
    reg [3:0] N;//分频计数器
    reg rSCLK;
    reg rMOSI;
    reg rCS;
    reg [3:0] cnt; //发收状态计数器       
assign SCLK=rSCLK;
assign MOSI=rMOSI;
assign CS=rCS;
assign Data_LED=rData_LED;

always@(posedge clk_24M or negedge reset)        //分频到1MHz
  if(!reset) 
       begin rSCLK<=1; N<=0; end
  else if(N>=11)                              
			begin N<=0; rSCLK<=~rSCLK; end
		else
			N<=N+1; 
   
always @(posedge SCLK or negedge reset)    //主机发送
   if (!reset) 
        begin rMOSI<=1; rCS<=1;cnt<=0; end
    else
          case(cnt)
            0:begin rCS<=0;cnt<=1; end           //使能主机发送
            1:begin rMOSI<=Data_SW[7];cnt<=2; end
            2:begin rMOSI<=Data_SW[6];cnt<=3; end
            3:begin rMOSI<=Data_SW[5];cnt<=4; end
            4:begin rMOSI<=Data_SW[4];cnt<=5; end
            5:begin rMOSI<=Data_SW[3];cnt<=6; end
            6:begin rMOSI<=Data_SW[2];cnt<=7; end
            7:begin rMOSI<=Data_SW[1];cnt<=8; end
            8:begin rMOSI<=Data_SW[0];cnt<=9; end                                                                                          
            default:begin rCS<=1;cnt<=0; end    //关闭发送        
          endcase       

always @(negedge rSCLK )      //主机接收
          case(cnt)
             1:rData_LED[7]<=MISO;
             2:rData_LED[6]<=MISO;
             3:rData_LED[5]<=MISO;
             4:rData_LED[4]<=MISO;
             5:rData_LED[3]<=MISO;
             6:rData_LED[2]<=MISO;
             7:rData_LED[1]<=MISO;
             8:rData_LED[0]<=MISO;
             default: ;           
          endcase      
 endmodule

从机SCLK和CS均来自主机,0-7节拍上升沿时钟向主机发送数据,当CS=0下降沿1-8节拍读取主机数据。

//非常简单的SPI通信协议,从机程序,上升沿发送,下降沿接收。
//双工工作。8位数据,无校验。
//主机拨码开关控制从机LED,从机拨码开关控制主机LED
//从机时钟来源于主机
module SPI_Slave (
    input    MOSI,  //从机接收
	output   MISO,  //从机发送
    input    [7:0] Data_SW , //发送的8位数据,开关实现
    input    CS,            //CS
    input    SCLK,          //SPI时钟
    output  [7:0] Data_LED  //接收的8位数据,发光管实现
);
    reg [3:0] cnt; //发收状态计数器
    reg rMISO;       
    reg[7:0] rData_LED; 
assign Data_LED=rData_LED;
assign MISO=rMISO;
always @(posedge SCLK )    //从机发送
    	case(cnt)
             0: rMISO<=Data_SW[7];  //由高到低发
             1: rMISO<=Data_SW[6];
             2: rMISO<=Data_SW[5];
             3: rMISO<=Data_SW[4];
             4: rMISO<=Data_SW[3];
             5: rMISO<=Data_SW[2];
             6: rMISO<=Data_SW[1];
             7: rMISO<=Data_SW[0];                 
             default:rMISO<=1;          
            endcase
 always @(negedge SCLK )      //从机接收
       if (CS) cnt<=0;     
          else 
            case(cnt)
			 0:cnt<=1;
             1:begin rData_LED[7]<=MOSI; cnt<=2; end
             2:begin rData_LED[6]<=MOSI; cnt<=3; end
             3:begin rData_LED[5]<=MOSI; cnt<=4; end
             4:begin rData_LED[4]<=MOSI; cnt<=5; end
             5:begin rData_LED[3]<=MOSI; cnt<=6; end
             6:begin rData_LED[2]<=MOSI; cnt<=7; end
             7:begin rData_LED[1]<=MOSI; cnt<=8; end
             8:begin rData_LED[0]<=MOSI; cnt<=9; end                           
             default:cnt<=0;            
          endcase      
endmodule

作为主从机的两块开发板通信测试时,注意要共地,即GND需用线连接。此代码在安陆ELF1A650、高云GW1NSR开发板上获得通过。

切记,以上为非标准的SPI协议,若与其他设备通信时,有可能失败。有时候不需要双向传输,此时仅需MOSI、CS、SCLK三根线即可,为方便计,从机端可进一步译码,用数码管显示。

//非常简单的SPI通信协议,上升沿发送,无接收。
//CS=0使能发送。8位数据。无校验。
//实现功能:主机拨码开关发送数据。
module SPI_Master (
    input   reset, //reset
    input   clk_24M, //时钟24M
    output  MOSI,  //主机发送
    input   [7:0] Data_SW , //发送的8位数据,开关实现
    output  CS,            //CS
    output  SCLK          //SPI时钟
);
    reg [3:0] N;//分频计数器
    reg rSCLK;
    reg rMOSI;
    reg rCS;
    reg [3:0] cnt; //状态计数器       
assign SCLK=rSCLK;
assign MOSI=rMOSI;
assign CS=rCS;

always@(posedge clk_24M or negedge reset)        //分频到1MHz
  if(!reset) 
       begin rSCLK<=1; N<=0; end
  else if(N>=11)                              
			begin N<=0; rSCLK<=~rSCLK; end
		else
			N<=N+1; 
   
always @(posedge SCLK or negedge reset)    //主机发送
   if (!reset) 
        begin rMOSI<=1; rCS<=1;cnt<=0; end
    else
          case(cnt)
            0:begin rCS<=0;cnt<=1; end           //使能主机发送
            1:begin rMOSI<=Data_SW[7];cnt<=2; end
            2:begin rMOSI<=Data_SW[6];cnt<=3; end
            3:begin rMOSI<=Data_SW[5];cnt<=4; end
            4:begin rMOSI<=Data_SW[4];cnt<=5; end
            5:begin rMOSI<=Data_SW[3];cnt<=6; end
            6:begin rMOSI<=Data_SW[2];cnt<=7; end
            7:begin rMOSI<=Data_SW[1];cnt<=8; end
            8:begin rMOSI<=Data_SW[0];cnt<=9; end                                                                                          
            default:begin rCS<=1;cnt<=0; end    //关闭发送        
          endcase       
 endmodule
//非常简单的SPI通信协议,从机程序,下降沿接收。
//8位数据,无校验。
//主机拨码开关发送数据,从机接收并译码数码管显示。
//从机时钟来源于主机
module SPI_Slave (
    input    MOSI,  //从机接收
    input    CS,            //CS
    input    SCLK,          //SPI时钟
    output  [1:0] DG,        //两位数码管位码  
    output  [7:0] SEG  //数码管段码
);
    reg [3:0] cnt; //状态计数器    
    reg[7:0] rData; 
    reg[3:0] count; //要显示的数,四位2进制
    reg[1:0] rDG; 
    reg[7:0] rSEG; 
    assign DG=rDG; 
    assign SEG=rSEG; 
always @(negedge SCLK )      //从机接收
       if (CS) cnt<=0;     
          else 
            case(cnt)
			 0:cnt<=1;
             1:begin rData[7]<=MOSI; cnt<=2; end
             2:begin rData[6]<=MOSI; cnt<=3; end
             3:begin rData[5]<=MOSI; cnt<=4; end
             4:begin rData[4]<=MOSI; cnt<=5; end
             5:begin rData[3]<=MOSI; cnt<=6; end
             6:begin rData[2]<=MOSI; cnt<=7; end
             7:begin rData[1]<=MOSI; cnt<=8; end
             8:begin rData[0]<=MOSI; cnt<=9; end                           
             default:cnt<=0;            
          endcase
always @ (posedge SCLK)
    case(DG)
      2'b10: begin rDG<=2'b01;count=rData[7:4];end  //高四位 
      2'b01: begin rDG<=2'b10;count=rData[3:0];end  //低4位
      default:  begin rDG<=2'b10;end
   endcase
always@(count)      //数码管译码输出
  case(count)
        0:rSEG=8'b11000000;
        1:rSEG=8'b11111001;
		2:rSEG=8'b10100100;
		3:rSEG=8'b10110000;
		4:rSEG=8'b10011001;
		5:rSEG=8'b10010010;
		6:rSEG=8'b10000010;
		7:rSEG=8'b11111000;
		8:rSEG=8'b10000000;
		9:rSEG=8'b10010000;
        10:rSEG=8'b10001000;
        11:rSEG=8'b10000011;
        12:rSEG=8'b11000110;
        13:rSEG=8'b10100001;
        14:rSEG=8'b10000110;
        default:rSEG=8'b10001110;
  endcase		      
endmodule

附:ESP8266(Node MCU)有SPI的Demo,包括Master和Slave,如下图。不过需要注意的是,其引脚应接HSCLK(GPIO14,D5)、HMISO(GPIO12,D6)、HMOSI(GPIO13,D7)、HCS(GPIO15,D8)。

Verilog实现的SPI通信

 文章来源地址https://www.toymoban.com/news/detail-400526.html

 

到了这里,关于Verilog实现的SPI通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32F103单片机通过SPI全双工通信协议与W25Q64(FLASH)进行通信【串行同步通信(数据线与时钟线配合),(一主多从模式)】附相关驱动代码详解

    1.W25Qxx系列是一种低成本、小型化、使用简单的 非易失性存储器 ,常应用于数据存储、字库存储、固件程序存储等场景 2.存储介质: Nor Flash(闪存) 3.时钟频率:80MHz / 160MHz (Dual SPI) / 320MHz (Quad SPI) 4.存储容量(24位地址): W25Q40: 4Mbit / 512KByte W25Q80: 8Mbit / 1MByte W25Q16: 16

    2024年04月13日
    浏览(49)
  • Vue中使用Web Serial API连接串口,实现通信交互

    Web Serial API,web端通过串口与硬件通信; 该API是JS本身 navigator 对象上就独有的,所以与Vue和React框架开发都没有太大的关系, 串口是一个双向通信接口,允许字节发送和接收数据。 Web Serial API为网站提供了一种使用JavaScript对串行设备进行读写的方法。串行设备可以通过用户系

    2024年02月08日
    浏览(26)
  • 利用Web Serial API实现Vue与单片机串口通信

            Web Serial API 是一项 Web 技术,用于在浏览器中访问串行端口设备(如 Arduino、传感器等)并与之通信。它提供了一组 JavaScript 接口,使得 Web 应用程序可以通过 USB 串行端口连接到硬件设备,并进行数据发送和接收操作。         浏览器版本:Google Chrome 版本

    2024年02月14日
    浏览(28)
  • SPI协议的verilog实现(spi master slave联合实现)

    spi是serial peripheral interface的缩写,即串行扩展总线。SPI是单主设备通信,总线中只有一个主设备发起通信,能发起通信的设备称为主设备。当SPI主设备想读写从设备时,首先拉低对应从设备的ss线(低电平有效)。然后发送工作麦种到时钟线上,在相应的脉冲时间上,主设备

    2024年02月02日
    浏览(29)
  • EGO1—UART串行接口设计及通信的实现

    使用软件: Vivado 开发板: EGO1采用Xilinx Artix-7系列XC7A35T-1CSG324C FPGA (1)发送:8个拨码开关控制数码管最后后两位显示16进制数字,按下按键,数码管显示的内容通过TX发送,通过串口调试助手接收到内容。 (2)接收:从串口调试助手发送两位16进制数,接收到之后通过数码

    2024年02月09日
    浏览(49)
  • SPI详解——原理及Verilog实现

    单工通信:数据流只能从发送端到接收端,为单向通道。如:键盘和显示屏之间的通信为单工通信,显示屏只能接收键盘的输入,无法向键盘反馈。 半双工通信:数据流可以在发送端和接收端双向流动,即:发送端既能发送数据,也能接收数据;接收端既能接收数据,也能发

    2024年02月01日
    浏览(23)
  • 实验(三):SPI应用:读写串行FLASH 实验

    实验目的: 1. 学习对SPI的使用; 2. 掌握KEIL5的仿真与调试。 任务: 1. 根据要求编写程序,并写出原理性注释; 2. 将检查程序运行的结果,分析一下是否正确; 3. 完成所建工程的验证调试。 以一种使用SPI 通讯的串行FLASH 存储芯片的读写实验为大家讲解STM32 的SPI 使用方法。

    2024年01月21日
    浏览(27)
  • 【C#】【串口通信(Serial Port)】建议串口调试WinForm桌面应用实例——已实现功能<存在未知BUG>

    1、界面组件  2、界面实现代码 界面代码   3、逻辑代码 逻辑代码   4、效果展示   5、错误提醒   参考网址:C# 实现串口通信 - 编程教程 (17bigdata.com)

    2024年02月08日
    浏览(34)
  • Java SPI 一 之SPI(Service Provider Interface)进阶& AutoService

    ​ 1.1 介绍 SPI(Service Provider Interface),是JDK内置的一种 服务提供发现机制(为某个接口寻找服务实现的机制),可以用来启用框架扩展和替换组件,其核心思想就是 解耦。 模块之间基于接口编程,模块之间不对实现类进行硬编码,当代码里涉及具体的实现类,就违反了可拔插

    2024年02月06日
    浏览(26)
  • 【Verilog 教程】7.3 Verilog 串行 FIR 滤波器设计

    串行 FIR 滤波器设计 设计说明 设计参数不变,与并行 FIR 滤波器参数一致。即,输入频率为 7.5 MHz 和 250 KHz 的正弦波混合信号,经过 FIR 滤波器后,高频信号 7.5MHz 被滤除,只保留 250KMHz 的信号。 串行设计,就是在 16 个时钟周期内对 16 个延时数据分时依次进行乘法、加法运算

    2024年02月06日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包