修改AXI UART D16550 FIFO深度
2021-10-20 本文已影响0人
望江樵夫
更改 AXI UART 16550 FIFO 大小,步骤如下:
- 备份 Vivado/your_version/data/ip/xilinx/axi_uart16550_v2_0 和 /Vivado/your_version/data/ip/xilinx/lib_srl_fifo_v1_0 文件夹
- 如果您的设计中有 AXI_UART_16550 IP 核,请将其移除,保存设计/项目并关闭 Vivado
- 清除项目目录中的 your_project.cache 文件夹
- 编辑 Vivado/your_version/data/ip/xilinx/lib_srl_fifo_v1_0/hdl 文件夹中的 lib_srl_fifo_v1_0_rfs.vhd:
- 第 677、381、981 行:根据需要更改 C_DEPTH 值
- 保存并关闭文件
请注意: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 ...),它只会是几个循环......
- 编辑 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))//这里不减一
- 保存文件,打开您的 Vivado 项目/设计,添加 UART IP、合成、生成比特流……您就完成了 :-)