全文 为了实现对模块的控制,除了clk、cs、sck、miso、mosi 这些信号之外,还需要一些其他信号。其中,rst 是复位信号,用于SPI 模块的初始化。en 是模块的使能信号,当en=1 时模块开始工作。
data_i 是待发送数据的8 位并行输入端。data_o 是用于接收和发送数据的移位寄存器, 也是数据传输完成时已接收数据的8位并行输出端,图4 是所设计的SPI 主机模块的框图。
图4 SPI 模块框图
下面是用Verilog HDL 设计的SPI 主机模块(CPOL =0,CPHA=1)的主要程序,程序中省去了变量的声明,并在注释中对这些变量作了说明。
3 设计的仿真、综合与实现
通过编写测试平台,并使用Mentor Graphics 公司的仿真工具ModelSim SE PLUS 6.1f 对该SPI 模块进行仿真,得到的仿真波形如图5 所示。
图5 SPI 模块的仿真波形
从图中可以看出,sck 的空闲电平IDLE=0,接收数据时刻是下降沿即ACTIVE-IDLE 边沿, 故该SPI 模块的工作模式是CPOL=0,CPHA=1,与设计一致。当en=0 时,cs=1,SPI 总线处于空闲状态。当en=1 时,在下降沿cs=0,sck 输出时钟信号,总线数据传输开始。同时,data_o=data_i, 移位寄存器存入待发送数据11010111.在第1 个周期上升沿,主机通过mosi 发送data_o 最高位1 至从机。在第1 个周期下降沿,data_o 左移一位,多出一个空闲位data_o[0],主机通过miso 接收从机发送的数据最高位1,并将其存入data_o[0],data_o=10101111.依此类推,后面7 个周期的数据传输过程与第1 个周期类似。8 位数据全部传输完成之后,cs=1,一个完整的SPI 总线传输过程结束。可以发现,data_o中的数据被一个一个从主机发送到从机,同时data_o 也被用来存储从机发送的数据。8 个周期完成之后,data_o 中存储的数据正是从机发送的数据10101101.综合以上分析,该SPI 模块的功能是正确的。
通过实验,在Xilinx ISE 9.1i 中完成了对该模块的综合与实现,并下载到Digilent 公司的FPGA 开发板Spartan-3E Starter 上进行验证,实验结果正确。综合工具使用ISE 自带的XST,下载工具使用ISE 自带的iMPACT.
4 结语
本文用Verilog 硬件描述语言设计了一个符合SPI 总线规范的SPI 主机模块,使用仿真工具ModelSim 对其进行仿真并给出了仿真波形。在Xilinx ISE 中对该模块进行综合与实现,并在FPGA 上完成了下载与验证。该SPI 主机模块的功能正确,工作稳定,可扩展性强。由于SPI 总线应用范围很广,利用FPGA 可重复配置的优点,该模块可以很方便地应用于各种场合。本文作者创新点:根据SPI 总线规范,用Verilog HDL 设计并实现了一个带有移位寄存器的SPI 总线模块,具有简洁高效、便于修改、可扩展性强等特点。