黑金AX301开发板SPI通信详解

前言:

对黑金的AX301开发板的SPI工程进行了波形仿真,写一下自己的理解。

背景:

项目地址: https://download.csdn.net/download/a792544191/12875806

过程解析:

(1)文件夹名:spi_flash_test
没有进行按键触发的仿真图波形说明:
Spi_flash_test定时3ms以后,进入S_READ状态,flash_read <= 1’d1,flash_read_addr <= 24’d0;
Spi_flash_ctrl接收到flahs_read信号后,进入S_READ状态,cmd <= `CMD_READ,cmd_valid <= 1’b1; size <= flash_read_size(flash_read_size=1)
Spi_flash_cmd获得cmd_valid信号后,进入S_CMD_LATCH状态,再进入S_CS_LOW状态,再进入S_WR_CMD_CODE状态,Send_data=cmd_code,同时给wr_req=1.
Spi_master接收到wr_req信号后,模拟SPI时序,MOSI = MOSI_shift[7],data_out = MISO_shift(没用),传输8bit的数据,最后返回wr_ack=1.
Spi_flash_cmd接收到wr_ack信号,进入S_READ_BYTES状态,给wr_req=1,send_data <= addr[23:16];
Spi_master接收到wr_req信号后,模拟SPI时序,MOSI = MOSI_shift[7],data_out = MISO_shift(没用),传输8bit的数据,最后返回wr_ack=1.
Spi_flash_cmd接收到wr_ack信号,进入S_READ_BYTES状态,给wr_req=1,send_data <= addr [15:8];
Spi_master接收到wr_req信号后,模拟SPI时序,MOSI = MOSI_shift[7],data_out = MISO_shift(没用),传输8bit的数据,最后返回wr_ack=1.
Spi_flash_cmd接收到wr_ack信号,进入S_READ_BYTES状态,给wr_req=1,send_data <= addr [7:0];
Spi_master接收到wr_req信号后,模拟SPI时序,MOSI = MOSI_shift[7],data_out = MISO_shift(没用),传输8bit的数据,最后返回wr_ack=1.
Spi_flash_cmd接收到wr_ack信号,进入S_READ_BYTES状态,给wr_req=1,send_data <= 8’h0,
Spi_master接收到wr_req信号后,模拟SPI时序,MOSI = MOSI_shift[7],data_out = MISO_shift(有用,给flash_cmd),传输8bit的数据,最后返回wr_ack=1.
Spi_flash_cmd接收到wr_ack信号后,此时byte_cnt=3,data_recv=data_out,data_valid=1。
Spi_flash_ctrl获得data_valid=1信号后,flash_read_data_out=data_out,flash_read_data_valid=1。
Spi_flash_test获得flash_read_data_valid=1后,read_data <= flash_read_data_out;.
Spi_flash_cmd进入S_KEEP_CS_LOW状态,然后进入S_CS_HIGH状态,然后进入S_CMD_ACK状态,然后cmd_ack=1,然后进入S_IDLE状态
Spi_flash_ctrl获得cmd_ack=1信号后,cmd_valid <= 1’b0,进入S_ACK状态, flash_read_ack=1,最后进入S_IDLE状态.
Spi_flash_test获得flash_read_ack =1后,flash_read=0, state <= S_WAIT;然后不断等待按键按下,所以波形图后面波形都没有了。

(2)文件夹名:spi_flash_test1
进行了按键触发的仿真图波形说明(接上文):
Spi_flash_test在S_WAIT状态,由于addone=1,所以进入S_SE状态,flash_sector_erase <= 1’b1,flash_sector_addr <= 24’d0;
Spi_flash_ctrl获得flash_sector_erase信号,进入S_WREN状态,cmd <= CMD_WREN,cmd_valid <= 1’b1。
Spi_flash_cmd获得cmd_valid信号后,进入S_CMD_LATCH状态,再进入S_CS_LOW状态,再进入S_WR_CMD_CODE状态,Send_data=cmd_code,同时给wr_req=1.
Spi_master接收到wr_req信号后,模拟SPI时序,MOSI = MOSI_shift[7],data_out = MISO_shift(没用),传输8bit的数据,最后返回wr_ack=1.
Spi_flash_cmd接收到wr_ack信号,进入S_KEEP_CS_LOW状态,然后进入S_CS_HIGH状态,然后进入S_CMD_ACK状态,然后cmd_ack=1,然后进入S_IDLE状态.
Spi_flash_ctrl获得cmd_ack=1信号后,进入S_SE状态,cmd <= CMD_SE,cmd_valid先为0,后来变成1.
Spi_flash_cmd获得cmd_valid信号后,进入S_CMD_LATCH状态,再进入S_CS_LOW状态,再进入S_WR_CMD_CODE状态,Send_data=cmd_code,同时给wr_req=1.
Spi_master接收到wr_req信号后,模拟SPI时序,MOSI = MOSI_shift[7],data_out = MISO_shift(没用),传输8bit的数据,最后返回wr_ack=1.
Spi_flash_cmd接收到wr_ack信号,进入S_WRITE_BYTES状态, send_data <= addr[23:16], wr_req=1.
Spi_master接收到wr_req信号后,模拟SPI时序,MOSI = MOSI_shift[7],data_out = MISO_shift(没用),传输8bit的数据,最后返回wr_ack=1.
Spi_flash_cmd接收到wr_ack信号,进入S_WRITE_BYTES状态, send_data <= addr[15:8], wr_req=1.
Spi_master接收到wr_req信号后,模拟SPI时序,MOSI = MOSI_shift[7],data_out = MISO_shift(没用),传输8bit的数据,最后返回wr_ack=1.
Spi_flash_cmd接收到wr_ack信号,进入S_WRITE_BYTES状态, send_data <= addr[7:0], wr_req=1.
Spi_master接收到wr_req信号后,模拟SPI时序,MOSI = MOSI_shift[7],data_out = MISO_shift(没用),传输8bit的数据,最后返回wr_ack=1.
Spi_flash_cmd接收到wr_ack信号,由于byte_size=3,所以进入S_KEEP_CS_LOW状态, 然后进入S_CS_HIGH状态,然后进入S_CMD_ACK状态,然后cmd_ack=1,然后进入S_IDLE状态。
Spi_flash_ctrl接收到wr_ack信号后,进入S_CK_STATE状态,cmd <= `CMD_RDSR; size <= 9’d1; state_reg <= data_out; cmd_valid <= 1’b1;
Spi_flash_cmd获得cmd_valid信号后,进入S_CMD_LATCH状态,再进入S_CS_LOW状态,再进入S_WR_CMD_CODE状态,Send_data=cmd_code,同时给wr_req=1.
Spi_master接收到wr_req信号后,模拟SPI时序,MOSI = MOSI_shift[7],data_out = MISO_shift(没用),传输8bit的数据,最后返回wr_ack=1.
Spi_flash_cmd接收到wr_ack信号,进入S_READ_BYTES状态, wr_req=1.
Spi_master接收到wr_req信号后,模拟SPI时序,MOSI = MOSI_shift[7],data_out = MISO_shift(有用),传输8bit的数据,最后返回wr_ack=1.
Spi_flash_cmd接收到wr_ack信号,data_out <= data_recv(spi_master中的data_out),data_valid <= 1’b1;
Spi_flash_ctrl接收到data_valid信号后,state_reg <= data_out;
Spi_flash_cmd由于byte_size=1,所以进入S_KEEP_CS_LOW状态, 然后进入S_CS_HIGH状态,然后进入S_CMD_ACK状态,然后cmd_ack=1,然后进入S_IDLE状态。
Spi_flash_ctrl接收到cmd_ack信号后,由于state_reg[0]=1,所以状态不变化,在cmd_ack为0后,重新使得cmd_valid信号为1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值