如何在VHDL包中基于泛型值定义数组类型?
解决VHDL包中依赖泛型的数组类型声明问题
你遇到的问题根源在于:包级别的类型定义无法引用组件内部的泛型——因为组件的泛型是实例化时才确定的,而包中的类型定义是全局的,不能依赖某个组件的特定泛值。
正确的做法是先定义无约束数组类型,然后在组件的端口声明中,利用组件的泛型来约束这个数组的长度。具体步骤如下:
1. 定义无约束数组类型
在包中先声明一个不指定长度的数组类型,这样它可以被后续的组件根据泛值动态约束:
TYPE t_adc_data IS ARRAY(NATURAL RANGE <>) OF STD_LOGIC_VECTOR(11 DOWNTO 0);
2. 在组件端口中约束数组长度
在组件的端口声明里,直接使用组件的泛型nof_decoder_signals来指定数组的范围:
oslav12_hex_data : OUT t_adc_data((2**nof_decoder_signals)-1 DOWNTO 0);
完整修正后的包代码
LIBRARY IEEE; USE IEEE.std_logic_1164.ALL; USE IEEE.numeric_std.ALL; PACKAGE ir_sensor_pkg IS -- 定义无约束数组类型 TYPE t_adc_data IS ARRAY(NATURAL RANGE <>) OF STD_LOGIC_VECTOR(11 DOWNTO 0); COMPONENT ir_sensor IS GENERIC( --generell nof_decoder_signals : INTEGER := 4; -- number of lines to decoder -- for clock frequency_resolution : INTEGER := 32; frequency_divider : INTEGER := 200000; -- target 500Hz by a base frequency of 100MHz ratio : INTEGER := 8000; -- target 12.5KHz(80us) by a base frequenzy of 100MHz adc_trigger : INTEGER := 7990; -- just a few clocks less than ratio -- for adc sclk_frequency : INTEGER := 8000000; -- max 20Mhz base_clk : INTEGER := 33000000 ); PORT ( -- generell isl_clk : IN STD_LOGIC; isl_reset : IN STD_LOGIC; oslv_decoder_lines : OUT STD_LOGIC_VECTOR(nof_decoder_signals -1 DOWNTO 0); -- puls gen osl_puls : OUT STD_LOGIC; --adc osl_adc_sclk : OUT STD_LOGIC; -- ADC clock osl_adc_csn : OUT STD_LOGIC; -- ADC chip select not isl_adc_sdata : IN STD_LOGIC; -- ADC serial data -- 用泛型约束数组长度 oslav12_hex_data : OUT t_adc_data((2**nof_decoder_signals)-1 DOWNTO 0) -- ADC results out as array of hex values ); END COMPONENT ir_sensor; END PACKAGE ir_sensor_pkg;
为什么这样可行?
- 无约束数组类型
t_adc_data是包级别的,组件可以直接引用; - 组件内部的泛型
nof_decoder_signals在端口声明时是可见的,因此可以用来计算数组的范围; - 当你实例化
ir_sensor组件时,传入的泛值会自动确定数组的实际长度,满足不同实例的需求。
内容的提问来源于stack exchange,提问作者mrGuny
相关产品推荐
相关产品推荐

