SPI接口的Verilog语言实现 - 图文(2)

2019-08-30 18:56

输入说明:

data[7..0] :输入RAM的数据。

wraddress[5..0] :RAM写地下输入,写一数据地址加一。 wren :RAM写使能

rdaddress[5..0] :RAM读地址输入,读一数据地址加一。 rden :RAM读使能

wrclock :RAM写数据时钟,上升沿有效。 rdclock :RAM读数据时钟,上升沿有效。

输出说明:

q[7..0] :读RAM数据输出口。

模块说明:

这是双通道的RAM,此设计中需要定制2个容量为64BIT的,能进行数据的读写。需注意的数据的读写不能同时操作。

模块3:

输入说明:

clk :系统时钟。

ramindata[7..0] :输入需要发送的数据。 Cpuwr :

Miso :主机输入从机输出。 Reset :复位。 RFirq :开始发送。

Fullflag :RAM存满,请求开始发送标志。 Addr_num[5..0] :需要发送数据的个数。 输出说明:

feedback :发送完数据后反馈给RAM控制器,请求重新写入RAM数据

发送。

outdata[7..0] :接收到从机发出的数据,用于测试。 mosi :主机发出的移位数据,从机输入。 Irq :发送完中断主求。

CSN :从机选择控制,低电平有效。 SCK :主机从机发送移位数据时钟。

SendAddr[5..0] :RAM读地址控制,读取RAM中的数据进行发送。 SendRDen :RAM读使能。

ReceiveData[7..0] :接收到的数据,用于写入RAM。

ReceiveAddr[5..0] :接收到的数据写入RAM的地址控制。

SendramClk :读取RAM中的数据用于发送的时钟,上升沿有效。 ReceiveClk :接收到的数据写入RAM中的时钟控制,上升沿有效。 ReceiveWen :接收到数据写入RAM使能。 CE:

Sendfinishtest :发送结束标志。

ram_rd :整个数据接收完后,读取RAM中数据使能。

ram_rd_clk :整个数据接收完后,读取RAM中数时钟,上升沿有效。 ram_rd_addr[5..0] :整个数据接收完后,读取RAM中数据的地址控制。

模块说明:

此模块是整个系统的核心部分,控制着SPI的收发。 其整个流程大致如下:

RESE初始化 等待 准备 Y N fullflag=1 N ReadReging=0 Y 开始发送 同时接收 发送接收第一个数据 发送接收中间数据 N sendFinishByte= SendByteNum-1 Y Irq=1 申请中断 sendfilish=1 feedback 读取RAM中收到的数据 ReadReging=1 N ReadReging=0 Y 结束

具体的程序写法:

其收发过程都是通过状态机实现的。状态机容易构成性能良好的同步时序逻辑模块,而且能很大限度的消除毛刺现象。 读取第一个数据(4个状态):

标记,处于发送态 产生读RAM脉冲态 准备发送态 读取第一 个数据态

开始发送接收(17个状态,采用顺序编码): 5'b00000: CSN=1'b0; 片选从机,低电平有效 SCK=1'b0; 拉低SPI时钟线,主机发送数据最高位 mosi=senddata[7]; 读取数据最高位放到数据线MOSI发送 SendRDen=1'b1; 读取发送数据使能 SendramCLK=1'b0; 拉低读RAM时钟线 bitcounter=bitcounter+5'b1; 5'b00001: SCK=1'b1; 拉高SPI时钟线,主机接收从机发出数据最高位 StatusReg0[7]=miso; 存取最高位数据

SendramCLK=1'b1; 拉高读RAM时钟线,产生上升沿读RAM bitcounter=bitcounter+5'b1; 5'b00010: SCK=1'b0; 拉低SPI时钟线,主机发送数据次高位数据 mosi=senddata[6]; 读取数据次高位放到数据线MOSI发送

bitcounter=bitcounter+5'b1;

5'b00011: SCK=1'b1; 拉高SPI时钟线,主机接收从机发出数据次高位 StatusReg0[6]=miso; 存取次高位数据 ramsendtemp=ramindata; 读取RAM中下一个数据 bitcounter=bitcounter+5'b1;

5'b00100:

SCK=1'b0; 拉低SPI时钟线,主机发送数据的第五位 mosi=senddata[5]; 发送数据第五位 SendramCLK=1'b0; 拉低读RAM时钟线 SendRDen=1'b0; 关闭读RAM使能 SendAddr=SendAddr+6'b1; 读RAM地址加一 bitcounter=bitcounter+5'b1; 5'b00101: SCK=1'b1; StatusReg0[5]=miso; bitcounter=bitcounter+5'b1; 5'b00110: SCK=1'b0; mosi=senddata[4]; bitcounter=bitcounter+5'b1; 5'b00111: SCK=1'b1;

StatusReg0[4]=miso; bitcounter=bitcounter+5'b1; 5'b01000: SCK=1'b0; mosi=senddata[3]; bitcounter=bitcounter+5'b1; 5'b01001: SCK=1'b1; StatusReg0[3]=miso; bitcounter=bitcounter+5'b1; 5'b01010: SCK=1'b0;

mosi=senddata[2]; bitcounter=bitcounter+5'b1; 5'b01011: SCK=1'b1; StatusReg0[2]=miso; bitcounter=bitcounter+5'b1; 5'b01100: SCK=1'b0; mosi=senddata[1]; bitcounter=bitcounter+5'b1; 5'b01101: SCK=1'b1;

StatusReg0[1]=miso; bitcounter=bitcounter+5'b1; 5'b01110:

接收从机发出的数据第五位 主机发送数据第四位 接收从机发出的数据第四位

主机发送数据第三位 主机接收从机发出的数据第三位 主机发送数据第二位

主机接收从机发送的数据的第二位 主机发送数据的次低位 主机接收数据的次低位


SPI接口的Verilog语言实现 - 图文(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:高等数学A1教学要求

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: