VHDL中如何从总线选取特定位组成向量传入端口?
问题分析
你遇到的编译错误核心原因是**std_logic_vector是一维数组**,data(3,5,9,11)这种写法会被编译器误认为是在给多维数组做索引,因此报出"索引数量不匹配数组维度"的错误。另外你实例化模块时还写错了实体名——应该引用tst实体,而非foo自身。
正确实现方法
下面给出两种实用写法,均兼容你使用的VHDL-2008标准(--std=08):
方法1:直接用聚合构造向量(端口映射时直接编写)
在端口映射中,用聚合语法直接将选中的位拼接成4位向量,需明确对应目标端口的每一位(比如tst的x端口是3 downto 0,要把选出来的位对应到x的各个位置):
uut : entity work.tst(dataflow) port map( x => std_logic_vector'(3 => data(11), 2 => data(9), 1 => data(5), 0 => data(3)), y => y );
这里3 => data(11)表示把data的第11位赋值给x的第3位,你可根据实际需求调整对应关系。
如果要在report语句中打印拼接后的向量,同样使用聚合:
report "data selected: " & to_string(std_logic_vector'(3 => data(11), 2 => data(9), 1 => data(5), 0 => data(3)));
方法2:用中间信号过渡(更直观,适合新手)
先定义一个4位中间信号,将需要的位逐个赋值给它,再连接到端口,可读性更强:
architecture sim of foo is signal data : std_logic_vector(15 downto 0) := x"FA01"; signal y : std_logic; -- 定义中间信号 signal selected_data : std_logic_vector(3 downto 0); begin -- 给中间信号赋值,对应好每一位 selected_data(3) <= data(11); selected_data(2) <= data(9); selected_data(1) <= data(5); selected_data(0) <= data(3); -- 实例化正确的实体 uut : entity work.tst(dataflow) port map(x => selected_data, y => y); process begin wait for 10 ns; report "data selected: " & to_string(selected_data); report "y: " & to_string(y); wait; end process; end sim;
额外注意点
- 实例化模块时必须写对实体名和架构名:你原代码中
entity work.foo(sim)是错误的,应改为entity work.tst(dataflow),因为要调用的是4输入与门的tst实体。 - VHDL向量的位索引中,
downto表示从高位到低位,to表示从低位到高位,要确保你选取的data位号是正确的(比如data(15 downto 0)里,15是最高位,0是最低位)。
内容的提问来源于stack exchange,提问作者First User
相关产品推荐
相关产品推荐

