给DAC芯片(串行移位寄存器):
然后,设计模块产生移位完成的标志信号shift_end:
然后,设计SPI接口的数据输出模块、片选信号控制模块以及时钟信号产生模块:
数据逐比特地送给spi_sdi接口,每帧传输16bit的数据,当传输完32个16bit的数据后,需要产生一个data_end标志信号,标志所有数据已经传输完毕:
当传输完32个16bit的数据时,也即完成了DAC芯片32个寄存器的配置工作,故需要产生一个conf_end标志信号,标志配置操作的完成:
【Testbench和run.do】
Testbench文件:
① 用文件控制任务$readmemb读出dac_ini_16x32.mif文件中的数据,并用这些数据初始化存储器mif_data(reg [15:0] mif_data[0:31]):
② 计一个名为spi_check的任务,用它回收spi通信的数据,并将其与dac_ini_16x32.mif文件中的数据进行校对,如果数据一致则输出数据的索引和具体内容,否则提示“SPI write is error!”:
run.do文件:
【仿真结果及分析】
图9 transcript窗口的信息1
图10 transcript窗口的信息2
如图9、图10所示,Testbench从SPI接口回收的数据与mif文件中的数据一致,由此可见SPI数据传输的正确性。
图11 状态机视图
如图12所示,是SPI仿真波形的整体图:
图12 仿真波形图1
如图13所示,spi_clk的上升沿对准spi_sdi数据的中心,满足DAC芯片SPI写时序的要求,即:数据在时钟信号上升沿到来的时候写入DAC芯片。
图13 仿真波形图2
如图14所示,展示了状态机跳转到STOP状态(10000)及data_end上升沿的出现。
图14 仿真波形图3
图15 仿真波形图4
由图15可知,在WRITE_REG状态下,片选信号spi_csn低电平状态的持续时间约为16us,而spi_clk的周期是1us,故由此可知SPI每次移位传输占用了16个SPI时钟周期,这与代码中设计的每帧传输16bit数据的设想是一致的。