集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
楼主: lcytms

FPGA初级课程第二十一讲 SPI

[复制链接]
 楼主| lcytms 发表于 2017-2-7 16:49:18 | 显示全部楼层
下面将在SPI状态机模块的基础上,再加上并转串移位寄存器、选择器、计数器等三个模块。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| lcytms 发表于 2017-2-7 16:49:56 | 显示全部楼层
主控端(Master)SPI程序模块图。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| lcytms 发表于 2017-2-7 16:51:19 | 显示全部楼层
本帖最后由 lcytms 于 2017-2-7 16:56 编辑

新建spi_write.v文件。
切换顶层模块为spi_write.v文件。
module spi_write (CLK,SPC,SDAT,regdata,GO,ORDY,reset,SCEN);

        input CLK;
        input GO;
        input reset;
        input [15:0] regdata;
       
        inout SDAT;
       
        output SPC;
        output SCEN;
        output ORDY;
       
        reg [15:0] Q;
        reg [3:0] bitcount;
        wire LDEN, SHEN, rstbitcount;
        wire bitcountEN;
        wire SCLK;

        spi_three_wire spi0 (
                        .reset(reset),
                        .CLK(CLK),
                        .GO(GO),
                        .bitcount(bitcount),
                        .bitcountEN(bitcountEN),
                        .rstbitcount(rstbitcount),
                        .LDEN(LDEN),
                        .SHEN(SHEN),
                        .SCLK(SCLK),
                        .SCEN(SCEN),
                        .ORDY(ORDY),
                        .SPC(SPC)
                );
       
        always @ (posedge CLK or posedge reset)
                begin
                        if (reset)
                                bitcount <= 0;
                        else
                                begin
                                        if (rstbitcount)
                                                bitcount <= 0;
                                        else
                                                begin
                                                        if (bitcountEN)
                                                                bitcount <= bitcount + 4'd1;
                                                end
                                end
                end
               
        always @ (posedge CLK or posedge reset)
                begin
                        if (reset)
                                Q <= 0;
                        else
                                begin
                                        if (LDEN)
                                                Q <= regdata;
                                        else
                                                begin
                                                        if (SHEN)
                                                                Q <= {Q[14:0], 1'b0};
                                                end
                                end
                end
               
        assign SDAT = (SCEN || SCLK) ? 1'bz : Q[15];

endmodule

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| lcytms 发表于 2017-2-7 16:57:23 | 显示全部楼层
本帖最后由 lcytms 于 2017-2-7 17:00 编辑

进行分析综合检查。
编写Testbench。
新建spi_write_test.v文件。
`timescale 1ns/1ns

module spi_write_test;

        reg CLK;
        reg GO;
        reg reset;
        reg [15:0] regdata;
       
        wire SDAT;
        wire SPC;
        wire SCEN;
        wire ORDY;

        spi_write dut (CLK,SPC,SDAT,regdata,GO,ORDY,reset,SCEN);

        initial
                begin
                        CLK = 0;
                        reset = 1;
                        GO = 0;
                        regdata = 16'b1010100z_10101010;
                       
                        #100
                        reset = 0;
                        GO = 1;
                        #100
                        GO = 0;
                       
                        #2000 $stop;
                end
               
        always #50 CLK = ~CLK;

endmodule

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| lcytms 发表于 2017-2-7 17:06:12 | 显示全部楼层
进行分析综合检查。
进行仿真设置。
查看仿真结果。
当SCEN为0时,SPC的时钟有16个上升沿。
当传输结束时,SCEN为1,且ORDY为1。
SDA输出的值为1010100z_10101010,高位在前。
仿真功能正确。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| lcytms 发表于 2017-2-7 17:07:35 | 显示全部楼层
好了,今天的课程就讲到这里。
通过今天的课程,我们学习了SPI串行外设接口的基本原理,并对SPI逻辑电路进行了建模、仿真。
后续课程中的AD、12864等部分均用到了基于SPI协议的器件,届时我们会结合具体器件向大家演示SPI协议的具体应用。
希望大家掌握SPI的基本原理,熟练运用Verilog语言编写相关驱动逻辑。
更复杂的知识和技巧我们将逐步通过后面的课程展现给大家。

课程到此结束,谢谢大家的关注!
星云通 发表于 2018-9-27 17:38:26 | 显示全部楼层
感谢李老师提供的资料,讲解很详细
cwj0123 发表于 2020-5-26 14:44:42 | 显示全部楼层
感謝老師熱心講解SPI相關知識~~~~真得很用心
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2024-12-24 00:06 , Processed in 0.059827 second(s), 17 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表