基于python生成的FPGA sata控制器

源代码介绍

简介

本文中的SATA控制器是由GitHub上面python生成FPGA工程的开源库为基础,开发得到SATA控制器的。主要的优点有基本为纯逻辑代码,只是调用了少量的Xilinx的原语,移植方便。工程小,编译速度快,生成的自测工程一次编译只需两分钟左右。自带串口控制接口,可由串口对PL端的SATA控制器进行控制。

存在的问题

整个python工程生成的Verilog源代码仅存在一个源文件,代码量大,结构混杂在一起,不易阅读。传输数据中发送数据可以数据源无效时控制器可以长时间等待数据有效,但在接收数据时一旦接收数据命令发送则必须接收有效一直保持有效,否则会导致接收数据丢失,无法将接收做成带握手信号的数据接口。

源代码预留接口

	input serial_cts,
	input serial_rts,
	output reg serial_tx,
	input serial_rx,
	(* dont_touch = "true" *)	input clk200_p,
	input clk200_n,
	input cpu_reset,
	input sata_clocks_refclk_p,
	input sata_clocks_refclk_n,
	output sata0_txp,
	output sata0_txn,
	input sata0_rxp,
	input sata0_rxn,
	output reg user_led0,
	output user_led1

其中串口控制的两个接口cts与rts在模块程序中并没有得到使用,可以根据具体的硬件信息加以应用。sata_clocks_refclk时钟信号为150MHz,user_led0,user_led1表示sata控制器的工作状态,0代表接收时钟是否正常,分频产生的1Hz的脉冲信号。1表示控制器接收控制信号是否准备好,准备好后常亮。由于本工程时自测工程所以在顶层接口中并没有给出相关的数据接口,数据源有本代码中的内部模块产生,数据校验也是如此,内部提供两种数据源,一种是数据计数器,另一种是伪随机数据。

整个源代码的工程结构

由底层往上分别是高速收发器、物理层、链路层、传输层、应用层、接口仲裁层、控制与数据接口、数据源与数据校验、uart转host接口控制寄存器。
其中前5个构成整个sata控制器的核心ip,接口控制层允许生成多个控制与数据接口,有多个接口同时申请发送或接收数据时进行仲裁。uart转host接口构成了一个小型的用户控制器,用户通过串口对寄存器进行赋值,读值来控制和识别当前控制器的工作状态。

源工程优化

解决接收存在的问题

上面介绍过接收时存在着无法使用握手信号暂时停止数据的接收,通过在ila中实时查看控制器每层状态机的工作状态,最终将问题定位在了链路层的状态机上。链路层的状态机中并没有将接收等待的相关逻辑添加到状态机中导致我们在接收数据中不能够控制从机端是否发送数据,且接收数据的缓存fifo的缓存深度只有一个扇区的大小,存在数据丢失的风险。最终整个解决的方案为:在链路层接收控制状态机中添加相关的接收等待的原语,将接收数据缓存的fifo深度扩大。其中需要注意的是对原语的控制,发送HOLD原语应当一直保持到接收到HOLDA原语后!

最后附上读写速率测试图(三星860PRO固态硬盘)

在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值