VHDL中的downto与to

VHDL中的downto与to,vhdl,Vhdl,我不确定我是否理解vhdl中“downto”和“to”之间的区别 我在网上看过一些解释,但我还是不明白。有人能帮我布置一下吗?一上一下: -- gives 0, 1, 2, 3: for i in 0 to 3 loop -- gives 3, 2, 1, 0: for i in 3 downto 0 loop 大多数情况下,它只是防止您在实例化组件时混淆位顺序。您不希望将LSB存储在X(0)中,并将其传递给希望X(0)包含MSB的组件 实际上,我倾向于使用DOWNTO来表示位向量(STD_

我不确定我是否理解vhdl中“downto”和“to”之间的区别


我在网上看过一些解释,但我还是不明白。有人能帮我布置一下吗?

一上一下:

-- gives 0, 1, 2, 3:
for i in 0 to 3 loop

-- gives 3, 2, 1, 0:
for i in 3 downto 0 loop

大多数情况下,它只是防止您在实例化组件时混淆位顺序。您不希望将LSB存储在
X(0)
中,并将其传递给希望
X(0)
包含MSB的组件

实际上,我倾向于使用
DOWNTO
来表示位向量(
STD_逻辑_向量(7到0)
UNSIGNED(31到0)
)和
来表示ram(
类型数据\u ram是无符号(15到0)的数组(范围自然);信号r:data_ram(0到1023)
)和整数计数器(
信号计数器:自然范围0到最大延迟;

展开,考虑优先级编码器:

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;
实体优先级
港口(
a:标准逻辑向量(7到1);
y:输出标准逻辑向量(2到0)
);
终端实体;
prio的架构顺序为
开始
过程(a)
开始

y我被教导,一个好的规则是在保持二进制顺序很重要的情况下使用“向下”键(例如,一个包含字符的8位信号),当信号不一定相互连接时使用“到”键(例如,如果信号中的每个位代表一个您正在打开和关闭的LED)

将4位“downto”和4位“to”连接起来


sig1(3 downto 0)如果使用处理器,对于小端系统,我们可以使用“downto”,对于Bigendian系统,我们使用“to”

比如说,

signal t1 : std_logic_vector(7 downto 0); --7th bit is MSB and 0th bit is LSB here.
以及

您可以自由使用这两种类型的表示,只需确保设计的其他部分都是相应地编写的


这说明了一些不同的情况:

“术语big-endian(或little-endian)指定面向字节的处理器中的字节顺序,不适用于VHDL位向量。技术术语是升序和降序数组范围。根据惯例,预定义的数字类型(如有符号和无符号)仅限于降序范围。”


因此,这个答案可能会令人困惑…

在向量类型中,最左边的位是最重要的。因此,对于
0到n
范围,位
0
是msb,对于
n到0
范围位
n
是msb

当您结合使用大端和小端位排序的IP时,这很方便,可以让您保持头脑清醒

例如,Microblaze是big-endian,使用
0
作为其msb。我将一个接口连接到一个小endian的外部设备,因此我在外部引脚上使用
15到0
,并在接口核心中的Microblaze端将它们重新映射到
16到31


VHDL强制您明确说明这一点,因此您无法执行
le_vec我发现的一个有趣的在线参考是,其中,在“数组分配”一节中,您可以阅读:

两个数组对象可以相互分配,只要它们具有相同的类型和大小。需要注意的是,分配是按位置进行的,而不是按索引号。语言中没有定义最高有效位的概念。它由使用数组的用户严格解释。以下是数组的示例任务:

声明如下:

。。。。
信号z_总线:位_矢量(3到0);
信号a_总线:位_矢量(1到4);
....

z_bus尽管上述任何答案都没有错,但我始终认为,两者的规定都是为了支持两种范式

第一个是数字表示法。如果我写的是7249,你会立即将其解释为7千2百49。数字从左到右读取,其中最重要的数字在左边。这是“向下”的情况

第二种是时间表示法,我们总是认为时间是从左到右的。在时钟上,数字会随着时间的推移而增加,2总是跟在1后面。在这里,我自然地按照时间升序写入位的顺序,而不管位的表示方式如何。例如,在RS232中,我们从一个起始位开始由8个数据位(首先是LSB)然后是一个停止位来允许。此处MSB位于右侧;以“to”为例


如前所述,最重要的事情是不要随意混合它们。在解码RS232流时,我们可能会这样做,将按时间顺序接收的位转换为首先为MSB的字节,但这是非常例外的情况,而不是规则。

它们是位位置的差异吗?例如:7到2对2到7?回答上述问题,对未来的任何人来说,是的,这是有区别的。你在控制endian ness。(参见vipin的答案)或者endian ness@Hamid“endian ness”上的维基,就像在计算机科学术语中,或者“我对这个词的理解,或者工程师可能如何使用它”?因为,在计算机科学中,big-and-little-endian指的是架构的一个方面,该架构暴露于Istruction Set架构(ISA)中因此,可以对程序(如FTP)产生影响。数字的内部硬件表示形式中的位顺序不会在ISA级别公开。对于未来的人来说,这不是控制endianness!endianness应用于字节级别,不会影响位顺序。(想想0xF00D变成0x0DF0)。有用且简洁。谢谢!编辑是正确的(尽管链接现在已断开)。Endianness通常指字节顺序,而不是位顺序-尤其是在“处理器”(CPU)的上下文中。因此,这个答案介于混乱和不正确之间。@kavadias:谢谢你的建议,但实际上它已经是正确的。请注意,我们并没有从SLV(7到1)中的
a:a改为
a:SLV(1到7)
,在这种情况下,回文确实看不到
signal t2 : std_logic_vector(0 to 7); --0th bit is MSB and 7th bit is LSB 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);