我不确定我是否理解vhdl中“downto to”和“to”之间的区别。
我已经在网上看到了一些解释,但我仍然不认为我明白。有没有人能给我讲讲?
发布于 2011-10-04 08:07:36
一个上升,一个下降:
-- gives 0, 1, 2, 3:
for i in 0 to 3 loop
-- gives 3, 2, 1, 0:
for i in 3 downto 0 loop
发布于 2011-10-07 22:57:11
在向量类型中,最左边的位是最重要的。因此,对于0 to n
范围,位0
是最高有效位,对于n downto 0
范围位,n
是最高有效位。
当你组合使用大端和小端两种位序的IP时,这就派上用场了!
例如,Microblaze是大端的,并使用0
作为其最大有效位。我将一个接口连接到一个小端的外部设备,所以我在外部引脚上使用了15 downto 0
,并将它们重新映射到接口内核中microblaze端的16 to 31
上。
VHDL强迫你对此进行显式描述,所以你不能直接使用le_vec <= be_vec;
。
发布于 2011-10-04 08:10:23
大多数情况下,它只是防止你在实例化组件时混淆了位的顺序。您可能不希望将该LSB存储在X(0)
中,然后将其传递给一个期望X(0)
包含该MSB的组件。
实际上,我倾向于将DOWNTO
用于位向量(STD_LOGIC_VECTOR(7 DOWNTO 0)
或UNSIGNED(31 DOWNTO 0)
),将TO
用于RAM (TYPE data_ram IS ARRAY(RANGE NATURAL<>) OF UNSIGNED(15 DOWNTO 0); SIGNAL r : data_ram(0 TO 1023);
)和整数计数器(SIGNAL counter : NATURAL RANGE 0 TO max_delay;
)。
要扩展@KerrekSB's answer,请考虑优先级编码器:
ENTITY prio
PORT (
a : IN STD_LOGIC_VECTOR(7 DOWNTO 1);
y : OUT STD_LOGIC_VECTOR(2 DOWNTO 0)
);
END ENTITY;
ARCHITECTURE seq OF prio IS
BEGIN
PROCESS (a)
BEGIN
y <= "000";
FOR i IN a'LOW TO a'HIGH LOOP
IF a(i) = '1' THEN
y <= STD_LOGIC_VECTOR(TO_UNSIGNED(i, y'LENGTH));
END IF;
END LOOP;
END PROCESS;
END ENTITY;
循环的方向(TO
或DOWNTO
)控制断言多个输入时发生的事情(示例:a := "0010100"
)。使用TO
时,编号最高的输入(y <= "100"
)获胜。使用DOWNTO
时,编号最低的输入(y <= "010"
)获胜。这是因为进程中的最后一个赋值优先。但您也可以使用EXIT FOR
来确定优先级。
https://stackoverflow.com/questions/7642000
复制相似问题