上一篇我们完成了一个内存式的axi4从机的rtl设计,并进行了仿真验证。是不是有点不过瘾呢?本周我们将在ZYNQ中测试一下之前的从机是否真的能满足功能,回复AXI4可以获取最新的rtl设计以及zynq下的测试环境,有条件的朋友可以实际看下效果~
先说最重要的部分,本次测试发现之前的从机的几处错误,后台的代码已经更新。
首先是hand_ar信号无法拉低的问题,更改过后的代码如下所示,更改过的地方有两个部分:
- hand_ar拉低的条件
(arvalid && arready && (arlen_cnt_r == arlen_r))
更改为最后一个数据握手成功的时刻(rvalid && rready && (arlen_cnt_r == arlen_r))
。 - hand_ar拉高的条件
(arvalid && arready)
提前拉高,(arvalid && ~arready && ~hand_ar)
// hand_ar
always@(posedge aclk or negedge aresetn)begin
if(!aresetn)
hand_ar <= 1'b0;
else if(arvalid && ~arready && ~hand_ar)
hand_ar <= 1'b1;
else if(rvalid && rready && (arlen_cnt_r == arlen_r))
hand_ar <= 1'b0;
end
其次是hand_aw信号拉高的时刻稍晚,可能会导致写数据地址同步错误的问题。这个问题在仿真中并没有出现,但是在实测当中,顺序写数据时第二个数据写入地址总是偏移4,其他的写数据过程均正确,后续更改hand_aw信号后功能正常。将awvalid && awready
更改为了awvalid && ~awready && ~hand_aw
(为了避免问题,将hand_ar的拉高时间也做了相应的改变)
// hand_aw
always@(posedge aclk or negedge arese