在线免费视频网站推广平面广告设计用什么软件
在线免费视频网站推广,平面广告设计用什么软件,营销外包网站,网页设计与制作建立站点实践报告学习目的#xff1a; #xff08;1#xff09; 熟悉SPI接口和它的读写时序#xff1b; #xff08;2#xff09; 复习Verilog仿真语句中的$readmemb命令和$display命令#xff1b; #xff08;3#xff09; 掌握SPI接口写时序操作的硬件语言描述流程#xff08;本例仅…学习目的 1 熟悉SPI接口和它的读写时序 2 复习Verilog仿真语句中的$readmemb命令和$display命令 3 掌握SPI接口写时序操作的硬件语言描述流程本例仅以写时序为例为以后描述更复杂的时序逻辑电路奠定基础。 学习过程 【SPI的相关知识】 ① SPI的速度比串口的快采用源同步传输的方式且为串行传输应用场景不同则时序和接口名称会有不同 ② 串行flash的读写擦除命令可通过SPI接口进行通信CPU芯片与FPGA可通过SPI接口进行通信某些芯片的参数寄存器也可通过SPI的方式配置 ③ SPI接口说明 图1 SPI接口 SCLK主机给从机的系统时钟信号 SDI主机输出给从机的数据信号 SDO从机输出给主机的数据信号 CS片选信号此处为高电平有效 SDIO三线模式主机与从机之间的双向数据总线。 【DAC3283芯片与SPI有关内容】 DAC3283芯片的寄存器映射如图1所示 图1 DAC3283芯片的寄存器映射图 从图1可知此DAC芯片共有32个寄存器需要配置CONFIG0~CONFIG31且每个寄存器均为8bit。 【关于这些寄存器的配置方法】对于寄存器数量少的情况可以直接定义几个reg型变量然后用这些reg变量初始化那些待配置的寄存器而对于像本例这样有如此多的寄存器需要配置则需通过FPGA的ROM或RAM完成寄存器的初始化即先将配置参数写到FPGA的ROM或者RAM中然后再通过FPGA把这些参数从ROM或者RAM中读出并写入到外部芯片的寄存器中去。在本例中是通过SPI接口写入到DAC3283芯片的。 【DAC3283芯片的SPI接口时序】 图2 SPI的写时序图 图3 SPI的读时序图 首先对图2、图3中的几个信号名称作介绍。SCLK是由FPGA送给DAC芯片的时钟信号SDENB是串行接口的使能信号相当于片选信号只有当它为低电平时SPI的读写才有效对于“三线模式”的SPISDIO是一个双向的数据线负责数据的读写数据传输对于“四线模式”的SPISDIO也是一个双向的数据线但ALARM_SDO是一个只读数据线仅负责DAC芯片输出数据的传输。数据在SCLK的上升沿时刻写入DAC芯片在SCLK的下降沿时刻从DAC芯片中读出。 然后介绍一下SPI每次传输的数据内容。本例中SPI采用的是先传高位后传低位的串行传输方式每次传输16bit其中前8bit构成SPI的指令周期后8bit构成SPI的数据周期。在前8bit中rwbR/W是读/写控制信号即若rwb为高电平时此条指令为读指令若rwb为低电平时此条指令为写指令。N1、N0指明每帧传输的数据字节数范围为1~4字节不包含前面的那个指令字节A3…A0是DAC芯片各寄存器的地址。 【SPI接口的状态机】 图4 DAC芯片寄存器初始化操作状态机概念模型 IDLE是起始状态默认态work_en是从外部输入的启动使能信号高电平有效WAIT是等待状态在本例中等待8个时钟周期后wait_cnt[3] 1b1即进入到READ_MEM状态读存储器状态直接读取RAM中的数据WRITE_REG是写寄存器状态将32个16bit位宽的数据通过串行移位的方式送给DAC芯片的寄存器移位完1个16bit位宽的数据后shift_cnt 4d15 pose_flag 1b1 data_end ! 1b1就回到WAIT状态然后重新等待8个时钟周期重新执行READ_MEM状态和WRITE_REG状态直到32个数据全都读写完毕后才进入STOP状态shift_cnt 4d15 pose_flag 1b1 data_end 1b1拉高conf_end信号。 【设计步骤】 1 写spi_ctrl.v文件首先写分频计数器将50MHz的系统时钟分频为1MHz作为SPI的时钟spi_clk一般是50~60MHz但此处仅是演示实验用1MHz即可同时产生clk_p和clk_n两个相位相反、频率为1MHz的reg信号clk_p是正相时钟信号用以触发脉冲标志信号pose_flag标志SPI时钟信号上升沿的到来clk_n是反相的时钟信号用作spi_clk送给SPI当作时钟使用以上共需写4个always语句块。 2 建立一个16bit x 32的单口RAM IP核仅读不写并例化到spi_ctrl.v中完成mif文件的编辑和拷贝。 3 声明状态机变量写状态机两段式包括等待状态下的计数器、读RAM的地址产生模块1个系统时钟周期读出1个数据、串行移位寄存器左移移出最高位、移位操作的计数器、data_end信号控制模块、数据输出模块、片选信号控制模块、conf_end信号控制模块以及状态跳转模块等部分。 4 写testbench文件和run.do文件运行仿真并分析仿真结果跑300us。对testbench文件的要求如下①能使用$readmemb命令读出dac_ini_16x32.mif文件中的数据②能在rec_spi任务块中实现对SPI传输数据的回收并与dac_ini_16x32.mif文件中的数据进行校对然后用$display命令显示校对结果和数据信息。 【代码实现】 1设计一个计数分频模块用50MHz的系统时钟产生1MHz的时钟信号给SPI读/写操作使用同时产生clk_p和clk_n两个相位相反、频率均为1MHz的信号 同时产生一个标志clk_p上升沿的标志信号pose_flag用它统一系统的全局时钟 【注意事项】尽量不要使用分频产生的clk_p或clk_n当作always块的触发条件原因时钟信号在很大程度上决定了整个设计的性能和可靠性应尽量避免使用FPGA内部逻辑产生的时钟因为它很容易导致功能或时序出现问题内部逻辑产生的时钟信号容易出现毛刺布线用线的质量较差影响信号质量同时组合逻辑电路固有的延时也容易导致时序问题。详细的解说请见特权的《深入玩转FPGA》一书的P59。 2RAM IP核的创建和例化 图5 RAM IP核的参数配置 图6 去掉q端寄存器 图7 新建和添加mif文件 图8 勾选例化文件 例化到spi_ctrl.v文件中 3声明状态变量和状态参数写状态机 状态跳转控制 ① 写状态机写到WAIT状态时发现需要产生wait_end信号而wait_end信号是由计数等待8个时钟周期后产生的故先需要设计WAIT状态等待计数模块 然后用设计wait_end信号产生模块 ② 写状态机写到READ_MEM状态时发现需要先将RAM中的数据读出来故先需设计产生读RAM地址的模块 ③ 写状态机写到WRITE_REG状态时发现先要将从RAM读出来的数据缓存起来通过shift_buf缓存然后逐比特地通过sdi线送给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_datareg [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数据的设想是一致的。 转载https://www.cnblogs.com/huangsanye/p/5256494.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/89695.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!