Vivado Block Memory Generator IP无法导入COE文件求助
问题
我用以下Python脚本生成COE文件:
import numpy as np def generate_coe_file(filename, data_list, radix=16): with open(filename, 'w') as f: f.write(f"memory_initialization_radix = {radix};\n") f.write("memory_initialization_vector =\n") for i, val in enumerate(data_list): if i == len(data_list) - 1: f.write(f"{val};\n") # Last value ends with ; else: f.write(f"{val},\n") # Example: Fill with values 0 to 255 data = list(np.ones(1024)) data = [hex(int(x)) for x in data] generate_coe_file("fft_bram.coe", data)
我已经尝试切换目录、修改文件名并检查多余空格、逗号和分号,文件生成无异常,但在Xilinx Vivado的Block Memory Generator IP模块「重新定制IP」弹窗中无法导入该COE文件,报错信息如下:
Validation failed for parameter 'Coe File(Coe_File)' with current value 'd:/Vivado_Vitis_Projects/SingleToneFFT/SingleToneFFT.srcs/source_1/bd/design_singletoneFFT/ip/design_singletoneFFT_blk_mem_gen_0_0'. Invalid COE File- Invalid Hex value detected in the COE File: x1
该Block Memory IP模块配置为独立模式下的真双端口BRAM,读写宽度为32位,读写深度为1024。
解决方案
1. 移除十六进制前缀0x
Vivado的COE文件不识别带0x前缀的十六进制值,只保留数字和字母部分即可。修改Python脚本中生成十六进制字符串的代码,截取掉前缀:
# 替换原data生成行 data = [hex(int(x))[2:] for x in data]
2. 补全到32位宽度对应的十六进制长度
BRAM配置为32位读写宽度,每个COE数据需要是8位十六进制字符(32位=4字节,每字节对应2位十六进制)。当前生成的1仅1位,需补前导零到8位:
# 修改data生成行,补零到8位 data = [hex(int(x))[2:].zfill(8) for x in data]
3. 完整修正后的脚本
import numpy as np def generate_coe_file(filename, data_list, radix=16): with open(filename, 'w') as f: f.write(f"memory_initialization_radix = {radix};\n") f.write("memory_initialization_vector =\n") for i, val in enumerate(data_list): if i == len(data_list) - 1: f.write(f"{val};\n") else: f.write(f"{val},\n") # 生成1024个32位全1的十六进制值(无0x前缀,补全8位) data = list(np.ones(1024)) data = [hex(int(x))[2:].zfill(8) for x in data] generate_coe_file("fft_bram.coe", data)
4. 验证生成的COE文件内容
修正后的COE文件开头应如下所示,Vivado可正确识别每个32位十六进制数据:
memory_initialization_radix = 16; memory_initialization_vector = 00000001, 00000001, ... 00000001;
内容的提问来源于stack exchange,提问作者Giridhar Nagamangala
相关产品推荐
相关产品推荐

