VHDL 中的通用向量,赋值位置由变量确定
Generic vector in VHDL, with position of assignment determined by variable
我有一个用 VHDL 编写的简单状态机。每个向量和变量的大小由通用常量 "n" 确定。思路是:当我改成"n"的时候,我想马上就可以合成了。部分设计是“1 of N”代码中的矢量。
端口和信号定义:
tester: out std_logic_vector(n-1 downto 0); -- port
signal I: integer range 0 to n-1:=0; -- signal
我有:
process(I)
begin
if I=0 then
tester<="0001";
elsif I=1 then
tester<="0010";
elsif I=2 then
tester<="0100";
else
tester<="1000";
end if;
end process;
这显然只适用于 n=4。
我想要的:
process(I)
begin
tester<=(I=>'1', others=>'0');
end process;
然而,由于 "choice is not constant" 错误,这并没有合成。我被其中一种状态改变了,它可以以任何模式改变,因此出现了问题。
相反,您可以这样做:
process(I)
begin
tester <= (others => '0');
tester(I) <= '1';
end process;
我有一个用 VHDL 编写的简单状态机。每个向量和变量的大小由通用常量 "n" 确定。思路是:当我改成"n"的时候,我想马上就可以合成了。部分设计是“1 of N”代码中的矢量。
端口和信号定义:
tester: out std_logic_vector(n-1 downto 0); -- port
signal I: integer range 0 to n-1:=0; -- signal
我有:
process(I)
begin
if I=0 then
tester<="0001";
elsif I=1 then
tester<="0010";
elsif I=2 then
tester<="0100";
else
tester<="1000";
end if;
end process;
这显然只适用于 n=4。 我想要的:
process(I)
begin
tester<=(I=>'1', others=>'0');
end process;
然而,由于 "choice is not constant" 错误,这并没有合成。我被其中一种状态改变了,它可以以任何模式改变,因此出现了问题。
相反,您可以这样做:
process(I)
begin
tester <= (others => '0');
tester(I) <= '1';
end process;