Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 是否可以在vhdl中访问for循环中的索引?错误:索引名称前缀类型Natural不是数组类型_Loops_Vhdl_Endianness - Fatal编程技术网

Loops 是否可以在vhdl中访问for循环中的索引?错误:索引名称前缀类型Natural不是数组类型

Loops 是否可以在vhdl中访问for循环中的索引?错误:索引名称前缀类型Natural不是数组类型,loops,vhdl,endianness,Loops,Vhdl,Endianness,我想写一个小程序,把大端数转换成小端数。因此,我需要使用for循环。因为我只想每8位(1字节)切换一次,所以我需要使用某种模。我不喜欢使用预定义的方法,我想把它写得尽可能接近硬件。因此,我想访问迭代器变量并检查最后三位是否为零。因此,我知道已经完成了8次迭代。Saddy,我收到了错误信息: 索引名称前缀类型natural不是数组类型 我的代码如下: library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity TOP is Port ( INPU

我想写一个小程序,把大端数转换成小端数。因此,我需要使用for循环。因为我只想每8位(1字节)切换一次,所以我需要使用某种模。我不喜欢使用预定义的方法,我想把它写得尽可能接近硬件。因此,我想访问迭代器变量并检查最后三位是否为零。因此,我知道已经完成了8次迭代。Saddy,我收到了错误信息:

索引名称前缀类型natural不是数组类型

我的代码如下:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;


entity TOP is
    Port ( INPUT : in STD_LOGIC_VECTOR (32 downto 0);
           CLK : in STD_LOGIC;
           OUTPUT : out STD_LOGIC_VECTOR (32 downto 0));

end TOP;

architecture Behavioral of TOP is

begin
S: process(CLK)
begin
    if rising_edge(CLK) then
        for I in INPUT' range loop
            --every 8 bit
            if I(3 downto 0) = "000" then
                OUTPUT(OUTPUT'left -I*8 downto OUTPUT'left - (I+1)*8) <= INPUT((I+1)*7 downto I*7); 
            end if;
        end loop;
    end if;
end process S;
end Behavioral;
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
实体顶部是
端口(输入:标准逻辑向量(32向下至0);
CLK:标准逻辑中;
输出:输出标准逻辑向量(32到0);
端顶;
TOP is的架构
开始
S:过程(CLK)
开始
如果上升沿(CLK),则
对于输入“范围”回路中的I
--每8位
如果I(3到0)=“000”,那么

输出(OUTPUT'left-I*8 down到OUTPUT'left-(I+1)*8)现在最明显的答案是
如果I mod 8=0,那么
但是你不想这样做

如果I(3到0)=“000”,那么你对行
所做的是混合抽象层次:一个整数,一个整数的低层表示为一包位。或者严格地说,是一种可索引类型,即数组

这是一个坏主意,因为它对一个整数的表示形式做出了假设,这个假设可能有效,也可能无效。。。讽刺的是,包括endian ness。所以,VHDL不会让你这么做

您可以做的是显式地“转换”为整数的表示,在这里您可以确定哪个位对应于哪个位,并对该具体表示执行低级操作,而不是抽象的
整数
。(假设您正在使用的计算机具有该表示形式,则“转换”在时间或硬件资源方面不会受到影响)

这种表述有两种标准。在
numeric\u std
库中,分别称为
signed
unsigned
。“有符号的”一个是显式的2-s补码,
无符号的
是直接的-两者都是std_逻辑类型的数组,因此是可索引的

use IEEE.numeric_std.all;
你可以阅读这个软件包的来源,所以没有任何假设。(或者你可以编写一个不同的包来体现你需要的约定,但是没有人这么做……)

因此,您可以将循环变量转换为5位的无符号变量,并将其索引为

if to_unsigned(I,5)(2 downto 0) = "000" then
请注意,由于数组长度不匹配,原始比较总是返回False


最后,合成工具并不愚蠢;他们在
mod
power-of-2上安全地进行了明显的优化。

虽然合成工具确实可以针对mod power-of-2对目标检查进行优化,但在这种情况下,这并不重要
I
在合成过程中将是展开的
for
循环中的一个常量,您可以对其进行任何数学运算,因为最终计算的值将烘焙到网络列表中。与
if
语句类似,因为它完全依赖于常数,所以不会产生多路复用器,而是合成器将使用结果来决定是否为包含的逻辑创建硬件。整个块将合成为一个32位寄存器,没有中间逻辑;“转换”被烘焙到哪个输入引脚静态路由到哪个寄存器位。由于它不包含任何逻辑,因此实际上不需要由于该块而使用寄存器(尽管您可能希望将产生输入的逻辑和使用输出的逻辑分开)。