我不确定我理解vhdl中'downto'与'to'之间的区别。
我看过一些在线解释,但我仍然认为我不理解。任何人都可以为我安排好吗?
答案 0 :(得分:41)
如果您使用处理器,对于Little endian系统,我们可以使用“downto”,对于Bigendian系统,我们使用“to”。
例如,
signal t1 : std_logic_vector(7 downto 0); --7th bit is MSB and 0th bit is LSB here.
和
signal t2 : std_logic_vector(0 to 7); --0th bit is MSB and 7th bit is LSB here.
您可以自由地使用这两种类型的表示,只需确保相应地编写设计的其他部分。
这post说的不同:
“术语大端(或小端)指定面向字节的处理器中的字节顺序,不适合VHDL位向量。技术术语是升序和降序数组范围。预定义的数字类型如有符号和无符号受限制按惯例下降范围。“
所以,这个答案可能令人困惑......
答案 1 :(得分:17)
一个上升,一个下降:
-- gives 0, 1, 2, 3:
for i in 0 to 3 loop
-- gives 3, 2, 1, 0:
for i in 3 downto 0 loop
答案 2 :(得分:11)
我发现一个有趣的在线参考资料是here,其中包括"阵列分配,"你可以阅读:
两个数组对象可以相互分配,只要它们具有相同的类型和相同的大小即可。值得注意的是,分配是按位置进行的,而不是按索引号进行的。在语言中没有定义最重要位的概念。使用该阵列的用户严格解释它。以下是数组分配的示例:
使用以下声明:
....
SIGNAL z_bus: BIT_VECTOR (3 DOWNTO 0);
SIGNAL a_bus: BIT_VECTOR (1 TO 4);
....
z_bus <= a_bus;
与:
相同
z_bus(3) <= a_bus(1);
z_bus(2) <= a_bus(2);
z_bus(1) <= a_bus(3);
z_bus(0) <= a_bus(4);
观察:
1)&#34; downto&#34;的任何差异和&#34;到&#34;当我们想要使用位向量而不只是表示位数组时出现,其中每个位具有独立的行为,但是表示整数。然后,由于加法器,乘法器等电路处理数字的方式,位重要性存在差异。
在这个可论证的特殊情况下,假设0&lt; x&lt; y,通常的约定当使用x to y
时,x是最高有效位(MSB),y是最低有效位(LSB)。相反,使用y downto x
时,y是MSB,x是LSB。你可以说,对于表示整数的位向量,差异来自于MSB的索引首先出现的事实,无论你是否使用&#34;到#34;或者&#34; downto&#34; (虽然第一个索引小于第二个使用&#34;到#34;当使用&#34; downto&#34;时更大。)
2)您必须注意y downto x
意味着y是MSB,相反,x to y
意味着x是MSB是已知的约定,通常用于您可以找到的知识产权(IP)核心甚至免费。我认为,当在位向量和整数之间进行转换时,它也是IEEE VHDL库使用的惯例。但是,对于结构建模,例如使用形式为y downto x
的输入位向量并使用y作为LSB的32位加法器,或者使用形式为{的输入位向量,没有任何困难。 {1}}其中x用作LSB ...
然而,将符号x to y
用于非负整数是合理的,因为位位置对应于2的幂乘以数字以加起来为数值。在涉及整数的大多数其他实践中,这似乎也得到了扩展。
3)位顺序无效与 endianness 有关。字节顺序是指字节排序(嗯,字节排序是位排序的一种形式......)。字节顺序是在指令集架构(ISA)级别暴露的问题,即,程序员可以看到它可以访问具有不同操作数大小的相同存储器地址(例如,字,字节,双字等)。实现中的位排序(如问题中所示)永远不会在ISA级别公开。程序员只能看到相对位位置的语义(例如,左移逻辑实际上可以通过向右移位在实现中反转位重要性的寄存器来实现)。
(令人惊讶的是,有多少答案提到了这个已被投票!)
答案 3 :(得分:4)
在矢量类型中,最左边的位是最重要的。因此,对于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;
。
答案 4 :(得分:3)
大多数情况下,它只是让您在实例化组件时不会混淆位顺序。您不希望将LSB存储在X(0)
中,并将其传递给期望X(0)
包含MSB的组件。
实际上,我倾向于使用DOWNTO
用于RAM(STD_LOGIC_VECTOR(7 DOWNTO 0)
)和积分计数器的位(UNSIGNED(31 DOWNTO 0)
或TO
)和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
来确定优先级。
答案 5 :(得分:1)
我被告知,一个好的规则是使用&#34; downto&#34;对于维持二进制顺序很重要的事情(例如一个8位信号保存一个字符)和&#34;到#34;当信号不一定互连时使用,例如,如果信号中的每个位代表你打开和关闭的LED。
连接4位&#34; downto&#34;和一个4位&#34;到&#34;看起来像
sig1(3 downto 0)&lt; = sig2(0 to 3)
------- 3 -------------------- 0
------- 2 -------------------- 1
------- 1 -------------------- 2
------- 0 -------------------- 3
取代部分信号而不是sig1(2 downto 1)&lt; = sig2(0 to 1)
------- 2 -------------------- 0
------- 1 -------------------- 1
答案 6 :(得分:0)
尽管以上任何答案都没有错,但我始终认为,提供两者都是为了支持两种范式。
首先是数字表示。如果我输入数字7249,您会立即将其解释为7,000 24.9。从左至右读取数字,其中最高有效数字在左侧。这是“低级”案例。
第二个是时间表示,我们总是想到时间从左到右。在时钟上,数字随时间增加,并且总是跟随2。在这里,我自然地将比特的顺序按时间从左到右的升序排列,而与比特的表示方式无关。例如,在RS232中,我们从一个起始位开始,然后是8个数据位(首先是LSB),然后是一个停止位。 MSB在右侧; “收件人”案。
如前所述,最重要的是不要随意混合它们。在解码RS232流时,我们可能最终只是将按时间顺序接收的位转换为以MSB为首的字节,但这在很大程度上是例外,而不是规则。