仅限于AXI UART 16550 v. 2.0,其他版本可能存在差异,经过实际测试,可以将fifo深度从默认的16成功修改为32、128和256。参考了两篇帖子中提到的方法,分别是修改AXI UART D16550 FIFO深度 - 简书 (jianshu.com)Increase FIFO Size in AXI_UART_16550 (xilinx.com)中jamsoft的两次回答。完整记录如下:

更改 AXI UART 16550 FIFO 大小,步骤如下:

  1. 备份 Vivado/your_version/data/ip/xilinx/axi_uart16550_v2_0 和 /Vivado/your_version/data/ip/xilinx/lib_srl_fifo_v1_0 文件夹
  2. 如果您的设计中有 AXI_UART_16550 IP 核,请将其移除,保存设计/项目并关闭 Vivado
  3. 清除项目目录中的 your_project.cache 文件夹
  4. 编辑 Vivado/your_version/data/ip/xilinx/lib_srl_fifo_v1_0/hdl 文件夹中的 lib_srl_fifo_v1_0_rfs.vhd:
  • 第 677、381、981 行:根据需要更改 C_DEPTH 值
  • 保存并关闭文件,使用编辑后的lib_srl_fifo_v1_0_rfs.vhd文件替换安装目录和项目目录下所有的同名文件。(这一步很关键
    请注意:clog2 函数用于确定存储值所需的位数。例如,在 Num_To_Reread 的情况下:在 std_logic_vector(0 to clog2(C_DEPTH)-1) 中,该函数将返回 4(位!)的值,因此该行将被处理为 Num_To_Reread :在 std_logic_vector(0 到 3) 中。为您的 C_DEPTH 值计算此值对于以下编辑很重要。clog2 函数返回上限 log2(C_DEPTH) 值,即存储 C_DEPTH 值的最小位数。
    注2:如果您不了解 VHDL 或该函数究竟是做什么的,这里是 C/C+++ 版本:
int clog2(int x)
{
   int r = 0;
   int rp = 1;
   while( rp < x )
   {
       r\+\+;
       if( rp > std::numeric_limits<int>::max())
          return std::numeric_limits<int>::max(); //or we could exit with some other value as -1...
       rp \+= rp;
   }
    return r;
}

随着 rp 值呈指数增长,您可以通过 head 或在一些纸上评估函数 - 对于一些通常的 FIFO 大小值(32、64 ...),它只会是几个循环......

  1. 编辑 Vivado/your_version/data/ip/xilinx/axi_uart16550_v2_0/hdl 文件夹中的 axi_uart16550_v2_0_vh_rfs.vhd 文件:
  • 第 89 行(Rx_fifo_count : in std_logic_vector(3 downto 0 ); -- Rx fifo count):将 3 的值更改为上一步中 clog2 函数返回的值减去 1(从 0 开始计数:-))。
  • 第 510 行:添加库“use ieee.numeric_std.all;” (不带引号)
  • 第 561 行:将 C_DEPTH 值更改为所需的 FIFO 深度
  • 第 574 行:将 Num_To_Reread => X"0" 更改为
    std_logic_VECTOR(to_unsigned(0,your_value_from_clog2_function))//这里不减一
  • 第 1086 行:添加库“use ieee.numeric_std.all;” (不带引号)
  • 第 1140 行:更改“信号 rx_fifo_count : std_logic_vector(3 downto 0);” - 将 3 的值更改为值
    由上一步中的 clog2 函数返回减一(从 0 开始计数)
  • 第 1178 行:将 C_DEPTH 值更改为所需的 FIFO 深度
  • 第 1191 行:将 Num_To_Reread => X"0" 更改为
    Num_To_Reread => std_logic_VECTOR(to_unsigned(0,your_value_from_clog2_function))//这里不减一
  1. 重新打开您的 Vivado 项目/设计,添加 UART IP、合成、生成比特流……您就完成了 :-)
posted on 2022-09-14 17:00  lmore  阅读(2048)  评论(0编辑  收藏  举报