在这个可论证的特殊情况下,假设0 <x <y,通常的惯例是,当使用 x to y 时,x是最高有效位(MSB),y是最低有效位(LSB) . 相反,当使用 y downto x 时,y是MSB,x是LSB . 您可以说,对于表示整数的位向量,差异来自于MSB的索引首先出现的事实,无论您使用"to"还是"downto"(尽管使用_889249时第一个索引小于第二个索引,使用"downto"时更大) .
2)您必须注意 y downto x 意味着y是MSB,相反, x to y 意味着x是MSB是已知的约定,通常用于您可以找到实现甚至免费的知识产权(IP)内核 . 我认为,当在位向量和整数之间进行转换时,它也是IEEE VHDL库使用的惯例 . 但是,例如,使用 y downto x 形式的输入位向量并使用y作为LSB的32位加法器,或者使用 x to y 形式的输入位向量(其中使用x),对于结构建模没有任何困难 . 作为LSB ......
然而,使用符号 x downto 0 作为非负整数是合理的,因为位位置对应于2的幂乘以数字以加起来为数值 . 在涉及整数的大多数其他实践中,这似乎也得到了扩展 .
实际上,我倾向于使用 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; ) .
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 来确定优先级 .
6 回答
我被教导说,一个好的规则是使用"downto"来维护二进制顺序很重要(比如一个8位信号保持一个字符),当信号不一定互连时使用"to",例如,如果信号中的每个位代表你打开和关闭的LED .
连接4位“downto”和4位“to”看起来像
sig1(3 downto 0)<= sig2(0到3)
------- 3 -------------------- 0
------- 2 -------------------- 1
------- 1 -------------------- 2
------- 0 -------------------- 3
取代信号而不是sig1(2 downto 1)<= sig2(0到1)
------- 2 -------------------- 0
------- 1 -------------------- 1
一个上升,一个上升:
如果您使用处理器,对于Little endian系统,我们可以使用“downto”,对于Bigendian系统,我们使用“to” .
例如,
和,
您可以自由地使用这两种类型的表示,只需确保相应地编写设计的其他部分 .
这个post说了些不同的东西:
“术语大端(或小端)指定面向字节的处理器中的字节顺序,不适合VHDL位向量 . 技术术语是升序和降序数组范围 . 预定义的数字类型如有符号和无符号限制为降序范围按照惯例 . ”
所以,这个答案可能令人困惑......
我发现一个有趣的在线参考是here,其中,在"Array Assignments,"部分,您可以阅读:
观察:
1)当我们想要使用位向量而不只是表示位数组时,“downto”和“to”之间出现任何差异,其中每个位具有独立的行为,但表示整数 . 然后,由于加法器,乘法器等电路处理数字的方式,位重要性存在差异 .
在这个可论证的特殊情况下,假设0 <x <y,通常的惯例是,当使用
x to y
时,x是最高有效位(MSB),y是最低有效位(LSB) . 相反,当使用y downto x
时,y是MSB,x是LSB . 您可以说,对于表示整数的位向量,差异来自于MSB的索引首先出现的事实,无论您使用"to"还是"downto"(尽管使用_889249时第一个索引小于第二个索引,使用"downto"时更大) .2)您必须注意
y downto x
意味着y是MSB,相反,x to y
意味着x是MSB是已知的约定,通常用于您可以找到实现甚至免费的知识产权(IP)内核 . 我认为,当在位向量和整数之间进行转换时,它也是IEEE VHDL库使用的惯例 . 但是,例如,使用y downto x
形式的输入位向量并使用y作为LSB的32位加法器,或者使用x to y
形式的输入位向量(其中使用x),对于结构建模没有任何困难 . 作为LSB ......然而,使用符号
x downto 0
作为非负整数是合理的,因为位位置对应于2的幂乘以数字以加起来为数值 . 在涉及整数的大多数其他实践中,这似乎也得到了扩展 .3)位顺序_89256_与字节顺序有关 . 字节顺序是指字节排序(嗯,字节排序是位排序的一种形式......) . 字节顺序是在指令集架构(ISA)级别暴露的问题,即程序员可以看到它可以访问具有不同操作数大小的相同存储器地址(例如,字,字节,双字等) . 实现中的位排序(如问题中所示)永远不会在ISA级别公开 . 只有相对位位置的语义对于编程器是可见的(例如,左移逻辑实际上可以通过向右移位在实现中反转位重要性的寄存器来实现) .
(令人惊讶的是,有多少答案提到了这个已被投票!)
在矢量类型中,最左边的位是最重要的 . 因此,对于
0 to n
范围,位0
是msb,对于n downto 0
范围位n
是msb .当你结合使用big-endian和little-endian位排序的IP来保持头脑清醒时,这会派上用场!
例如,Microblaze是big-endian并使用
0
作为其msb . 我将一个接口连接到一个小端的外部设备,所以我在外部引脚上使用15 downto 0
并将它们重新映射到我的接口核心中的微型端的16 to 31
.VHDL强迫您明确这一点,因此您不能直接执行
le_vec <= be_vec;
.大多数情况下,它只是让您在实例化组件时不会混淆位顺序 . 您不希望将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,请考虑优先级编码器:
循环的方向(
TO
或DOWNTO
)控制多个输入被置位时发生的情况(例如:a := "0010100"
) . 使用TO
,编号最高的输入获胜(y <= "100"
) . 使用DOWNTO
,编号最小的输入获胜(y <= "010"
) . 这是因为进程中的最后一个赋值优先 . 但您也可以使用EXIT FOR
来确定优先级 .