Loops 是否可以在vhdl中访问for循环中的索引?错误:索引名称前缀类型Natural不是数组类型
我想写一个小程序,把大端数转换成小端数。因此,我需要使用for循环。因为我只想每8位(1字节)切换一次,所以我需要使用某种模。我不喜欢使用预定义的方法,我想把它写得尽可能接近硬件。因此,我想访问迭代器变量并检查最后三位是否为零。因此,我知道已经完成了8次迭代。Saddy,我收到了错误信息: 索引名称前缀类型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
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位寄存器,没有中间逻辑;“转换”被烘焙到哪个输入引脚静态路由到哪个寄存器位。由于它不包含任何逻辑,因此实际上不需要由于该块而使用寄存器(尽管您可能希望将产生输入的逻辑和使用输出的逻辑分开)。