VHDL中Avalon组件寄存器数据传递至fir_parralel实体报错解决
VHDL Avalon寄存器数组转FIR实体端口的报错修复
问题场景
开发Avalon内存映射组件时,试图将寄存器数组regs直接传递给fir_parralel实体的coeff端口,尽管确认两者尺寸匹配,但编译仍报错。
相关代码
实例化代码(报错版本)
fir_instance : fir_parralel generic map( ... ) port map( ... -- 其他端口映射 coeff => regs(N_OF_REGS - 1 downto COEFF_ADDRESS)(COEFF_WIDTH - 1 downto 0) );
寄存器数组定义
type fir_array is array(natural range <>) of std_logic_vector; -- 二维数组类型 signal regs: fir_array(N_OF_REGS-1 downto 0)(31 downto 0) := (others =>(others => '0'));
fir_parralel实体端口定义
entity fir_parralel is generic( TAPS : natural range 8 to 64 := 50; -- 最大抽头数 INPUT_WIDTH : natural range 8 to 25 := 16; -- 输入输出数据位宽 COEFF_WIDTH : natural range 8 to 18 := 16; -- 滤波器系数位宽 OUTPUT_WIDTH : natural range 8 to 43 := 16 ); port( clk : in std_logic; reset : in std_logic; enable : in std_logic; tapset : in integer range 0 to TAPS := TAPS; -- 实际使用的抽头数 input : in std_logic_vector(INPUT_WIDTH-1 downto 0); output : out std_logic_vector(OUTPUT_WIDTH-1 downto 0); coeff : in fir_array(TAPS - 1 downto 0)(COEFF_WIDTH - 1 downto 0) -- 系数数组端口 ); end fir_parralel;
编译错误信息
Error (10453): VHDL error at fir_parralel_avalon_interface.vhd(120): right bound (0) of slice must belong to range (54 downto 5) of corresponding object
Error (10346): VHDL error at fir_parralel_avalon_interface.vhd(106): formal port or parameter "coeff" must have actual or default value
解决方法
直接的数组切片映射不符合VHDL类型匹配规则,需通过generate语句逐个元素完成映射:
- 定义与
coeff端口类型一致的中间信号:
signal coefficients : fir_array(TAPS - 1 downto 0)(COEFF_WIDTH - 1 downto 0);
- 使用generate语句完成寄存器到中间信号的元素级映射:
coefficient_gen: for i in 0 to TAPS-1 generate coefficients(i) <= regs(i + COEFF_ADDRESS)(COEFF_WIDTH-1 downto 0); end generate coefficient_gen;
- 实例化时将中间信号连接到
coeff端口:
fir_instance : fir_parralel generic map( ... ) port map( ... -- 其他端口映射 coeff => coefficients );
通过上述步骤即可解决类型匹配的编译错误,完成寄存器数据到FIR系数端口的正确传递。
内容的提问来源于stack exchange,提问作者cyborgdennett
相关产品推荐
相关产品推荐

